]> xenbits.xensource.com Git - pvdrivers/win/xeniface.git/commitdiff
Use a DPC per XENIFACE_EVTCHN_CONTEXT for signalling to user space
authorPaul Durrant <paul.durrant@citrix.com>
Thu, 10 Dec 2015 12:38:28 +0000 (12:38 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Thu, 10 Dec 2015 13:00:48 +0000 (13:00 +0000)
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@citrix.com>
Cc: Rafal Wojdyla <omeg@invisiblethingslab.com>
src/xeniface/fdo.c
src/xeniface/fdo.h
src/xeniface/ioctl_evtchn.c
src/xeniface/ioctls.h

index b23832d8c3dfd15d3ee2be5b766c8a64e63e34bc..fa14b5b20bac010920b0948d37c2e9d7fd99be20 100644 (file)
@@ -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));
index 781b1cc1dfb6cbdffd55c3fc8336509468604c9e..6cd628c1e6033bc81e1881a3f29433968f1303aa 100644 (file)
@@ -89,7 +89,6 @@ typedef struct _XENIFACE_FDO {
 
     KSPIN_LOCK                      EvtchnLock;
     LIST_ENTRY                      EvtchnList;
-    PKDPC                           EvtchnDpc;
 
     KSPIN_LOCK                      GnttabCacheLock;
 
index 9c5af19e00a91a08f68da0c630709cbaa6e8413d..5fb8bec10b0a66cc7eb40d03d6f80b189d93cc96 100644 (file)
@@ -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, NULL, 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,
index 225ed7fe1455ca6b349049712b0b042af44d14e7..da273cea13d9faf96f5aa6c1537c54f2fd51517d 100644 (file)
@@ -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;