]> xenbits.xensource.com Git - pvdrivers/win/xenvif.git/commitdiff
Make use of possible XENBUS_EVTCHN Unmask failure
authorPaul Durrant <paul.durrant@citrix.com>
Fri, 20 Oct 2017 17:14:28 +0000 (18:14 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Mon, 23 Oct 2017 15:36:46 +0000 (16:36 +0100)
Bump up to the latest version of XENBUS_EVTCHN and specify the option
to Unmask that allows it to fail. In this circumstance it is possible to
avoid dropping out of the DPC and thus avoid a context switch and re-queue.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
include/evtchn_interface.h
src/xenvif.inf
src/xenvif/controller.c
src/xenvif/poller.c

index 310850bab2582584179d71a02d2008ae7509fd00..068a69734fe985a782b2626a6094cc565bb9b6e2 100644 (file)
@@ -128,18 +128,27 @@ typedef NTSTATUS
     IN  UCHAR                   Number
     );
 
+typedef VOID
+(*XENBUS_EVTCHN_UNMASK_V4)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  BOOLEAN                 InCallback
+    );
+
 /*! \typedef XENBUS_EVTCHN_UNMASK
     \brief Unmask an event channel
 
     \param Interface The interface header
     \param Channel The channel handle
     \param InCallback Set to TRUE if this method is invoked in context of the channel callback
+    \param Force Set to TRUE if the unmask must succeed, otherwise set to FALSE and the function will return FALSE if the unmask did not complete.
 */
-typedef VOID
+typedef BOOLEAN
 (*XENBUS_EVTCHN_UNMASK)(
     IN  PINTERFACE              Interface,
     IN  PXENBUS_EVTCHN_CHANNEL  Channel,
-    IN  BOOLEAN                 InCallback
+    IN  BOOLEAN                 InCallback,
+    IN  BOOLEAN                 Force
     );
 
 typedef VOID
@@ -250,7 +259,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V4 {
     XENBUS_EVTCHN_RELEASE   EvtchnRelease;
     XENBUS_EVTCHN_OPEN      EvtchnOpen;
     XENBUS_EVTCHN_BIND      EvtchnBind;
-    XENBUS_EVTCHN_UNMASK    EvtchnUnmask;
+    XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4;
     XENBUS_EVTCHN_SEND_V1   EvtchnSendVersion1;
     XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
     XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
@@ -267,7 +276,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V5 {
     XENBUS_EVTCHN_RELEASE   EvtchnRelease;
     XENBUS_EVTCHN_OPEN      EvtchnOpen;
     XENBUS_EVTCHN_BIND      EvtchnBind;
-    XENBUS_EVTCHN_UNMASK    EvtchnUnmask;
+    XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4;
     XENBUS_EVTCHN_SEND_V1   EvtchnSendVersion1;
     XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
     XENBUS_EVTCHN_WAIT_V5   EvtchnWaitVersion5;
@@ -285,7 +294,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V6 {
     XENBUS_EVTCHN_RELEASE   EvtchnRelease;
     XENBUS_EVTCHN_OPEN      EvtchnOpen;
     XENBUS_EVTCHN_BIND      EvtchnBind;
-    XENBUS_EVTCHN_UNMASK    EvtchnUnmask;
+    XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4;
     XENBUS_EVTCHN_SEND      EvtchnSend;
     XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
     XENBUS_EVTCHN_WAIT_V5   EvtchnWaitVersion5;
@@ -298,6 +307,25 @@ struct _XENBUS_EVTCHN_INTERFACE_V6 {
     \ingroup interfaces
 */
 struct _XENBUS_EVTCHN_INTERFACE_V7 {
+    INTERFACE               Interface;
+    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
+    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_BIND      EvtchnBind;
+    XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4;
+    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_COUNT EvtchnGetCount;
+    XENBUS_EVTCHN_WAIT      EvtchnWait;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V8
+    \brief EVTCHN interface version 8
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V8 {
     INTERFACE               Interface;
     XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
     XENBUS_EVTCHN_RELEASE   EvtchnRelease;
@@ -312,7 +340,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V7 {
     XENBUS_EVTCHN_CLOSE     EvtchnClose;
 };
 
-typedef struct _XENBUS_EVTCHN_INTERFACE_V7 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
+typedef struct _XENBUS_EVTCHN_INTERFACE_V8 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
 
 /*! \def XENBUS_EVTCHN
     \brief Macro at assist in method invocation
@@ -323,7 +351,7 @@ typedef struct _XENBUS_EVTCHN_INTERFACE_V7 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVT
 #endif  // _WINDLL
 
 #define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 4
-#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 7
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 8
 
 #endif  // _XENBUS_EVTCHN_INTERFACE_H
 
index bc4e5556d90f6730d14db6ec24667addfddd8539..ef4e9bc5ba2db16836c65b871c8e7e1309217491 100644 (file)
@@ -59,9 +59,9 @@ xenvif_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.dll
 ; DisplayName          Section         DeviceID
 ; -----------          -------         --------
 
-%XenVifName%           =XenVif_Inst,   XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VIF&REV_09000002
-%XenVifName%           =XenVif_Inst,   XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VIF&REV_09000002
-%XenVifName%           =XenVif_Inst,   XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VIF&REV_09000002
+%XenVifName%           =XenVif_Inst,   XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VIF&REV_09000003
+%XenVifName%           =XenVif_Inst,   XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VIF&REV_09000003
+%XenVifName%           =XenVif_Inst,   XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VIF&REV_09000003
 
 [XenVif_Inst] 
 CopyFiles=XenVif_Copyfiles
index 629b6b7989fa27a8a025a7514ff88fd9c26dea25..004bccb0a910e9a489cd634192ee76045a62784c 100644 (file)
@@ -502,10 +502,11 @@ ControllerConnect(
     if (Controller->Channel == NULL)
         goto fail9;
 
-    XENBUS_EVTCHN(Unmask,
-                  &Controller->EvtchnInterface,
-                  Controller->Channel,
-                  FALSE);
+    (VOID) XENBUS_EVTCHN(Unmask,
+                         &Controller->EvtchnInterface,
+                         Controller->Channel,
+                         FALSE,
+                         TRUE);
 
     status = XENBUS_DEBUG(Register,
                           &Controller->DebugInterface,
index 7b600228704dfac9c902a5445c5fed3de402be41..3706cabb2adb7308b526a7a13b3e602c7be9975f 100644 (file)
@@ -330,10 +330,11 @@ PollerChannelConnect(
                          ProcNumber.Group,
                          ProcNumber.Number);
 
-    XENBUS_EVTCHN(Unmask,
-                  &Poller->EvtchnInterface,
-                  Channel->Channel,
-                  FALSE);
+    (VOID) XENBUS_EVTCHN(Unmask,
+                         &Poller->EvtchnInterface,
+                         Channel->Channel,
+                         FALSE,
+                         TRUE);
 
 done:
     return STATUS_SUCCESS;
@@ -391,6 +392,7 @@ PollerChannelUnmask(
 {
     PXENVIF_POLLER_INSTANCE     Instance;
     PXENVIF_POLLER              Poller;
+    BOOLEAN                     Pending;
 
     Instance = Channel->Instance;
     Poller = Instance->Poller;
@@ -398,11 +400,16 @@ PollerChannelUnmask(
     if (Channel->Channel == NULL)
         return;
 
-    if (!PollerChannelTestPending(Channel))
-        XENBUS_EVTCHN(Unmask,
-                      &Poller->EvtchnInterface,
-                      Channel->Channel,
-                      FALSE);
+    if (PollerChannelTestPending(Channel))
+        return;
+
+    Pending = XENBUS_EVTCHN(Unmask,
+                            &Poller->EvtchnInterface,
+                            Channel->Channel,
+                            FALSE,
+                            FALSE);
+    if (Pending)
+        PollerChannelSetPending(Channel);
 }
 
 static VOID