[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH] Use a DPC per XENIFACE_EVTCHN_CONTEXT for signalling to user space



The scheme of using a DPC per CPU will not work when multiple event channels
are in use since events may be lost when channels bound to the same CPU
are simultaneously pending. The problem is avoided by simply having
separate DPCs for each channel.

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
Cc: Rafal Wojdyla <omeg@xxxxxxxxxxxxxxxxxxxxxx>
---
 src/xeniface/fdo.c          | 37 ++-----------------------------------
 src/xeniface/fdo.h          |  1 -
 src/xeniface/ioctl_evtchn.c | 12 +++++++++---
 src/xeniface/ioctls.h       |  1 +
 4 files changed, 12 insertions(+), 39 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index b23832d..fa14b5b 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -2435,13 +2435,11 @@ FdoCreate(
     )
 {
     PDEVICE_OBJECT      FunctionDeviceObject;
-    PXENIFACE_DX          Dx;
-    PXENIFACE_FDO         Fdo;
+    PXENIFACE_DX        Dx;
+    PXENIFACE_FDO       Fdo;
     WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
     ULONG               Size;
     NTSTATUS            status;
-    ULONG               ProcessorCount;
-    ULONG               Index;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 
'FunctionDeviceObject'
     status = IoCreateDevice(DriverObject,
@@ -2587,25 +2585,6 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail15;
 
-    ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
-
-    Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
-
-    status = STATUS_NO_MEMORY;
-    if (Fdo->EvtchnDpc == NULL)
-        goto fail16;
-
-    for (Index = 0; Index < ProcessorCount; Index++) {
-        PROCESSOR_NUMBER ProcNumber;
-
-        status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
-        ASSERT(NT_SUCCESS(status));
-
-        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
-        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index], 
&ProcNumber);
-        ASSERT(NT_SUCCESS(status));
-    }
-
     Info("%p (%s)\n",
          FunctionDeviceObject,
          __FdoGetName(Fdo));
@@ -2615,11 +2594,6 @@ FdoCreate(
 
     return STATUS_SUCCESS;
 
-fail16:
-    Error("fail6\n");
-
-    RtlZeroMemory(&Fdo->IrpQueue, sizeof (IO_CSQ));
-
 fail15:
     Error("fail15\n");
 
@@ -2731,7 +2705,6 @@ FdoDestroy(
 {
     PXENIFACE_DX          Dx = Fdo->Dx;
     PDEVICE_OBJECT        FunctionDeviceObject = Dx->DeviceObject;
-    ULONG                 ProcessorCount;
 
     ASSERT(IsListEmpty(&Dx->ListEntry));
     ASSERT3U(Fdo->References, ==, 0);
@@ -2745,12 +2718,6 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
-    ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
-    RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
-
-    __FdoFree(Fdo->EvtchnDpc);
-    Fdo->EvtchnDpc = NULL;
-
     RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof (KSPIN_LOCK));
     ASSERT(IsListEmpty(&Fdo->IrpList));
     RtlZeroMemory(&Fdo->IrpList, sizeof (LIST_ENTRY));
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index 781b1cc..6cd628c 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -89,7 +89,6 @@ typedef struct _XENIFACE_FDO {
 
     KSPIN_LOCK                      EvtchnLock;
     LIST_ENTRY                      EvtchnList;
-    PKDPC                           EvtchnDpc;
 
     KSPIN_LOCK                      GnttabCacheLock;
 
diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
index 9c5af19..84b4871 100644
--- a/src/xeniface/ioctl_evtchn.c
+++ b/src/xeniface/ioctl_evtchn.c
@@ -47,10 +47,10 @@ EvtchnNotificationDpc(
     __in_opt  PVOID Argument2
     )
 {
-    PXENIFACE_EVTCHN_CONTEXT Context = Argument1;
+    PXENIFACE_EVTCHN_CONTEXT Context = _Context;
 
     UNREFERENCED_PARAMETER(Dpc);
-    UNREFERENCED_PARAMETER(_Context);
+    UNREFERENCED_PARAMETER(Argument1);
     UNREFERENCED_PARAMETER(Argument2);
 
     ASSERT(Context != NULL);
@@ -78,11 +78,13 @@ EvtchnInterruptHandler(
     ULONG ProcIndex;
 
     UNREFERENCED_PARAMETER(Interrupt);
+
     ASSERT(Context != NULL);
 
     KeGetCurrentProcessorNumberEx(&ProcNumber);
     ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
-    if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context, NULL)) 
{
+
+    if (!KeInsertQueueDpc(&Context->Dpc, Context, NULL)) {
         XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO %p, 
Cpu %lu\n",
                            Context, Context->LocalPort, Context->FileObject, 
ProcIndex);
     }
@@ -189,6 +191,8 @@ IoctlEvtchnBindUnbound(
     if (!NT_SUCCESS(status))
         goto fail3;
 
+    KeInitializeDpc(&Context->Dpc, EvtchnNotificationDpc, Context);
+
     status = STATUS_UNSUCCESSFUL;
     Context->Channel = XENBUS_EVTCHN(Open,
                                      &Fdo->EvtchnInterface,
@@ -280,6 +284,8 @@ IoctlEvtchnBindInterdomain(
     if (!NT_SUCCESS(status))
         goto fail3;
 
+    KeInitializeDpc(&Context->Dpc, EvtchnNotificationDpc, Context);
+
     status = STATUS_UNSUCCESSFUL;
     Context->Channel = XENBUS_EVTCHN(Open,
                                      &Fdo->EvtchnInterface,
diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
index 225ed7f..da273ce 100644
--- a/src/xeniface/ioctls.h
+++ b/src/xeniface/ioctls.h
@@ -59,6 +59,7 @@ typedef struct _XENIFACE_EVTCHN_CONTEXT {
     ULONG                  LocalPort;
     PKEVENT                Event;
     PXENIFACE_FDO          Fdo;
+    KDPC                   Dpc;
     PVOID                  FileObject;
 } XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.