|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 1/3] Add the boilerplate for a new Poller sub-system
The intention is that the separate Receiver and Transmitter event and DPC
handling be combined into a single sub-system. This patch lays the ground-
work for that to be done.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
src/xenvif/frontend.c | 85 ++++++++++++-----
src/xenvif/frontend.h | 7 ++
src/xenvif/poller.c | 217 +++++++++++++++++++++++++++++++++++++++++++
src/xenvif/poller.h | 80 ++++++++++++++++
vs2015/xenvif/xenvif.vcxproj | 1 +
5 files changed, 367 insertions(+), 23 deletions(-)
create mode 100644 src/xenvif/poller.c
create mode 100644 src/xenvif/poller.h
diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index a04d886..f715c19 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -47,6 +47,7 @@
#include "tcpip.h"
#include "receiver.h"
#include "transmitter.h"
+#include "poller.h"
#include "link.h"
#include "dbg_print.h"
#include "assert.h"
@@ -86,6 +87,7 @@ struct _XENVIF_FRONTEND {
PXENVIF_MAC Mac;
PXENVIF_RECEIVER Receiver;
PXENVIF_TRANSMITTER Transmitter;
+ PXENVIF_POLLER Poller;
PXENVIF_CONTROLLER Controller;
XENBUS_DEBUG_INTERFACE DebugInterface;
@@ -338,6 +340,7 @@ FrontendGet ## _Function( \
DEFINE_FRONTEND_GET_FUNCTION(Mac, PXENVIF_MAC)
DEFINE_FRONTEND_GET_FUNCTION(Receiver, PXENVIF_RECEIVER)
DEFINE_FRONTEND_GET_FUNCTION(Transmitter, PXENVIF_TRANSMITTER)
+DEFINE_FRONTEND_GET_FUNCTION(Poller, PXENVIF_POLLER)
DEFINE_FRONTEND_GET_FUNCTION(Controller, PXENVIF_CONTROLLER)
static BOOLEAN
@@ -2207,18 +2210,22 @@ FrontendConnect(
FrontendSetNumQueues(Frontend);
FrontendSetSplit(Frontend);
- status = ReceiverConnect(__FrontendGetReceiver(Frontend));
+ status = PollerConnect(__FrontendGetPoller(Frontend));
if (!NT_SUCCESS(status))
goto fail4;
- status = TransmitterConnect(__FrontendGetTransmitter(Frontend));
+ status = ReceiverConnect(__FrontendGetReceiver(Frontend));
if (!NT_SUCCESS(status))
goto fail5;
- status = ControllerConnect(__FrontendGetController(Frontend));
+ status = TransmitterConnect(__FrontendGetTransmitter(Frontend));
if (!NT_SUCCESS(status))
goto fail6;
+ status = ControllerConnect(__FrontendGetController(Frontend));
+ if (!NT_SUCCESS(status))
+ goto fail7;
+
Attempt = 0;
do {
PXENBUS_STORE_TRANSACTION Transaction;
@@ -2229,6 +2236,11 @@ FrontendConnect(
if (!NT_SUCCESS(status))
break;
+ status = PollerStoreWrite(__FrontendGetPoller(Frontend),
+ Transaction);
+ if (!NT_SUCCESS(status))
+ goto abort;
+
status = ReceiverStoreWrite(__FrontendGetReceiver(Frontend),
Transaction);
if (!NT_SUCCESS(status))
@@ -2272,7 +2284,7 @@ abort:
} while (status == STATUS_RETRY);
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail8;
State = XenbusStateUnknown;
while (State != XenbusStateConnected) {
@@ -2311,7 +2323,7 @@ abort:
status = STATUS_UNSUCCESSFUL;
if (State != XenbusStateConnected)
- goto fail8;
+ goto fail9;
ControllerEnable(__FrontendGetController(Frontend));
@@ -2320,23 +2332,28 @@ abort:
Trace("<====\n");
return STATUS_SUCCESS;
+fail9:
+ Error("fail9\n");
+
fail8:
Error("fail8\n");
+ ControllerDisconnect(__FrontendGetController(Frontend));
+
fail7:
Error("fail7\n");
- ControllerDisconnect(__FrontendGetController(Frontend));
+ TransmitterDisconnect(__FrontendGetTransmitter(Frontend));
fail6:
Error("fail6\n");
- TransmitterDisconnect(__FrontendGetTransmitter(Frontend));
+ ReceiverDisconnect(__FrontendGetReceiver(Frontend));
fail5:
Error("fail5\n");
- ReceiverDisconnect(__FrontendGetReceiver(Frontend));
+ PollerDisconnect(__FrontendGetPoller(Frontend));
fail4:
Error("fail4\n");
@@ -2378,6 +2395,7 @@ FrontendDisconnect(
ControllerDisconnect(__FrontendGetController(Frontend));
TransmitterDisconnect(__FrontendGetTransmitter(Frontend));
ReceiverDisconnect(__FrontendGetReceiver(Frontend));
+ PollerDisconnect(__FrontendGetPoller(Frontend));
MacDisconnect(__FrontendGetMac(Frontend));
Frontend->Split = FALSE;
@@ -2406,32 +2424,41 @@ FrontendEnable(
if (!NT_SUCCESS(status))
goto fail1;
- status = ReceiverEnable(__FrontendGetReceiver(Frontend));
+ status = PollerEnable(__FrontendGetPoller(Frontend));
if (!NT_SUCCESS(status))
goto fail2;
- status = TransmitterEnable(__FrontendGetTransmitter(Frontend));
+ status = ReceiverEnable(__FrontendGetReceiver(Frontend));
if (!NT_SUCCESS(status))
goto fail3;
- status = __FrontendUpdateHash(Frontend, &Frontend->Hash);
+ status = TransmitterEnable(__FrontendGetTransmitter(Frontend));
if (!NT_SUCCESS(status))
goto fail4;
+ status = __FrontendUpdateHash(Frontend, &Frontend->Hash);
+ if (!NT_SUCCESS(status))
+ goto fail5;
+
(VOID) FrontendNotifyMulticastAddresses(Frontend, TRUE);
Trace("<====\n");
return STATUS_SUCCESS;
+fail5:
+ Error("fail5\n");
+
+ TransmitterDisable(__FrontendGetTransmitter(Frontend));
+
fail4:
Error("fail4\n");
- TransmitterDisable(__FrontendGetTransmitter(Frontend));
+ ReceiverDisable(__FrontendGetReceiver(Frontend));
fail3:
Error("fail3\n");
- ReceiverDisable(__FrontendGetReceiver(Frontend));
+ PollerDisable(__FrontendGetPoller(Frontend));
fail2:
Error("fail2\n");
@@ -2455,6 +2482,7 @@ FrontendDisable(
TransmitterDisable(__FrontendGetTransmitter(Frontend));
ReceiverDisable(__FrontendGetReceiver(Frontend));
+ PollerDisable(__FrontendGetPoller(Frontend));
MacDisable(__FrontendGetMac(Frontend));
Trace("<====\n");
@@ -2866,19 +2894,23 @@ FrontendInitialize(
if (!NT_SUCCESS(status))
goto fail8;
- status = ControllerInitialize(*Frontend, &(*Frontend)->Controller);
+ status = PollerInitialize(*Frontend, &(*Frontend)->Poller);
if (!NT_SUCCESS(status))
goto fail9;
+ status = ControllerInitialize(*Frontend, &(*Frontend)->Controller);
+ if (!NT_SUCCESS(status))
+ goto fail10;
+
KeInitializeEvent(&(*Frontend)->EjectEvent, NotificationEvent, FALSE);
status = ThreadCreate(FrontendEject, *Frontend, &(*Frontend)->EjectThread);
if (!NT_SUCCESS(status))
- goto fail10;
+ goto fail11;
status = ThreadCreate(FrontendMib, *Frontend, &(*Frontend)->MibThread);
if (!NT_SUCCESS(status))
- goto fail11;
+ goto fail12;
(*Frontend)->StatisticsCount =
KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
(*Frontend)->Statistics = __FrontendAllocate(sizeof
(XENVIF_FRONTEND_STATISTICS) *
@@ -2886,34 +2918,38 @@ FrontendInitialize(
status = STATUS_NO_MEMORY;
if ((*Frontend)->Statistics == NULL)
- goto fail12;
+ goto fail13;
Trace("<====\n");
return STATUS_SUCCESS;
-fail12:
- Error("fail12\n");
+fail13:
+ Error("fail13\n");
ThreadAlert((*Frontend)->MibThread);
ThreadJoin((*Frontend)->MibThread);
(*Frontend)->MibThread = NULL;
-fail11:
- Error("fail11\n");
+fail12:
+ Error("fail12\n");
ThreadAlert((*Frontend)->EjectThread);
ThreadJoin((*Frontend)->EjectThread);
(*Frontend)->EjectThread = NULL;
-fail10:
- Error("fail10\n");
+fail11:
+ Error("fail11\n");
RtlZeroMemory(&(*Frontend)->EjectEvent, sizeof (KEVENT));
ControllerTeardown(__FrontendGetController(*Frontend));
(*Frontend)->Controller = NULL;
+fail10:
+ PollerTeardown(__FrontendGetPoller(*Frontend));
+ (*Frontend)->Poller = NULL;
+
fail9:
TransmitterTeardown(__FrontendGetTransmitter(*Frontend));
(*Frontend)->Transmitter = NULL;
@@ -3021,6 +3057,9 @@ FrontendTeardown(
ControllerTeardown(__FrontendGetController(Frontend));
Frontend->Controller = NULL;
+ PollerTeardown(__FrontendGetPoller(Frontend));
+ Frontend->Poller = NULL;
+
TransmitterTeardown(__FrontendGetTransmitter(Frontend));
Frontend->Transmitter = NULL;
diff --git a/src/xenvif/frontend.h b/src/xenvif/frontend.h
index 8e5552e..92008d0 100644
--- a/src/xenvif/frontend.h
+++ b/src/xenvif/frontend.h
@@ -166,6 +166,13 @@ FrontendGetTransmitter(
IN PXENVIF_FRONTEND Frontend
);
+#include "poller.h"
+
+extern PXENVIF_POLLER
+FrontendGetPoller(
+ IN PXENVIF_FRONTEND Frontend
+ );
+
#include "controller.h"
extern PXENVIF_CONTROLLER
diff --git a/src/xenvif/poller.c b/src/xenvif/poller.c
new file mode 100644
index 0000000..4ac358e
--- /dev/null
+++ b/src/xenvif/poller.c
@@ -0,0 +1,217 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documetation and/or other
+ * materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ntddk.h>
+#include <procgrp.h>
+#include <ntstrsafe.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <xen.h>
+
+#include <debug_interface.h>
+#include <store_interface.h>
+#include <evtchn_interface.h>
+
+#include "pdo.h"
+#include "frontend.h"
+#include "poller.h"
+#include "vif.h"
+#include "thread.h"
+#include "registry.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+#define MAXNAMELEN 128
+
+struct _XENVIF_POLLER {
+ PXENVIF_FRONTEND Frontend;
+ XENBUS_DEBUG_INTERFACE DebugInterface;
+ PXENBUS_DEBUG_CALLBACK DebugCallback;
+};
+
+#define XENVIF_POLLER_TAG 'LLOP'
+
+static FORCEINLINE PVOID
+__PollerAllocate(
+ IN ULONG Length
+ )
+{
+ return __AllocatePoolWithTag(NonPagedPool, Length, XENVIF_POLLER_TAG);
+}
+
+static FORCEINLINE VOID
+__PollerFree(
+ IN PVOID Buffer
+ )
+{
+ __FreePoolWithTag(Buffer, XENVIF_POLLER_TAG);
+}
+
+static VOID
+PollerDebugCallback(
+ IN PVOID Argument,
+ IN BOOLEAN Crashing
+ )
+{
+ UNREFERENCED_PARAMETER(Argument);
+ UNREFERENCED_PARAMETER(Crashing);
+}
+
+NTSTATUS
+PollerInitialize(
+ IN PXENVIF_FRONTEND Frontend,
+ OUT PXENVIF_POLLER *Poller
+ )
+{
+ NTSTATUS status;
+
+ *Poller = __PollerAllocate(sizeof (XENVIF_POLLER));
+
+ status = STATUS_NO_MEMORY;
+ if (*Poller == NULL)
+ goto fail1;
+
+ FdoGetDebugInterface(PdoGetFdo(FrontendGetPdo(Frontend)),
+ &(*Poller)->DebugInterface);
+
+ (*Poller)->Frontend = Frontend;
+
+ return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+NTSTATUS
+PollerConnect(
+ IN PXENVIF_POLLER Poller
+ )
+{
+ NTSTATUS status;
+
+ Trace("====>\n");
+
+ status = XENBUS_DEBUG(Acquire, &Poller->DebugInterface);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ status = XENBUS_DEBUG(Register,
+ &Poller->DebugInterface,
+ __MODULE__ "|POLLER",
+ PollerDebugCallback,
+ Poller,
+ &Poller->DebugCallback);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ Trace("<====\n");
+ return STATUS_SUCCESS;
+
+fail2:
+ Error("fail2\n");
+
+ XENBUS_DEBUG(Release, &Poller->DebugInterface);
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+NTSTATUS
+PollerStoreWrite(
+ IN PXENVIF_POLLER Poller,
+ IN PXENBUS_STORE_TRANSACTION Transaction
+ )
+{
+ UNREFERENCED_PARAMETER(Poller);
+ UNREFERENCED_PARAMETER(Transaction);
+
+ Trace("<===>\n");
+
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+PollerEnable(
+ IN PXENVIF_POLLER Poller
+ )
+{
+ UNREFERENCED_PARAMETER(Poller);
+
+ Trace("<===>\n");
+
+ return STATUS_SUCCESS;
+}
+
+VOID
+PollerDisable(
+ IN PXENVIF_POLLER Poller
+ )
+{
+ UNREFERENCED_PARAMETER(Poller);
+
+ Trace("<===>\n");
+}
+
+VOID
+PollerDisconnect(
+ IN PXENVIF_POLLER Poller
+ )
+{
+ Trace("====>\n");
+
+ XENBUS_DEBUG(Deregister,
+ &Poller->DebugInterface,
+ Poller->DebugCallback);
+ Poller->DebugCallback = NULL;
+
+ XENBUS_DEBUG(Release, &Poller->DebugInterface);
+
+ Trace("<====\n");
+}
+
+VOID
+PollerTeardown(
+ IN PXENVIF_POLLER Poller
+ )
+{
+ ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+ RtlZeroMemory(&Poller->DebugInterface,
+ sizeof (XENBUS_DEBUG_INTERFACE));
+
+ ASSERT(IsZeroMemory(Poller, sizeof (XENVIF_POLLER)));
+ __PollerFree(Poller);
+}
diff --git a/src/xenvif/poller.h b/src/xenvif/poller.h
new file mode 100644
index 0000000..5ba0eaa
--- /dev/null
+++ b/src/xenvif/poller.h
@@ -0,0 +1,80 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENVIF_POLLER_H
+#define _XENVIF_POLLER_H
+
+#include <ntddk.h>
+
+#include <vif_interface.h>
+
+#include "frontend.h"
+
+typedef struct _XENVIF_POLLER XENVIF_POLLER, *PXENVIF_POLLER;
+
+extern NTSTATUS
+PollerInitialize(
+ IN PXENVIF_FRONTEND Frontend,
+ OUT PXENVIF_POLLER *Poller
+ );
+
+extern NTSTATUS
+PollerConnect(
+ IN PXENVIF_POLLER Poller
+ );
+
+extern NTSTATUS
+PollerStoreWrite(
+ IN PXENVIF_POLLER Poller,
+ IN PXENBUS_STORE_TRANSACTION Transaction
+ );
+
+extern NTSTATUS
+PollerEnable(
+ IN PXENVIF_POLLER Poller
+ );
+
+extern VOID
+PollerDisable(
+ IN PXENVIF_POLLER Poller
+ );
+
+extern VOID
+PollerDisconnect(
+ IN PXENVIF_POLLER Poller
+ );
+
+extern VOID
+PollerTeardown(
+ IN PXENVIF_POLLER Poller
+ );
+
+#endif // _XENVIF_POLLER_H
diff --git a/vs2015/xenvif/xenvif.vcxproj b/vs2015/xenvif/xenvif.vcxproj
index 076d873..cc39f8d 100644
--- a/vs2015/xenvif/xenvif.vcxproj
+++ b/vs2015/xenvif/xenvif.vcxproj
@@ -73,6 +73,7 @@
<ClCompile Include="../../src/xenvif/mac.c" />
<ClCompile Include="../../src/xenvif/parse.c" />
<ClCompile Include="../../src/xenvif/pdo.c" />
+ <ClCompile Include="../../src/xenvif/poller.c" />
<ClCompile Include="../../src/xenvif/receiver.c" />
<ClCompile Include="../../src/xenvif/registry.c" />
<ClCompile Include="../../src/xenvif/settings.c" />
--
2.5.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |