]> xenbits.xensource.com Git - pvdrivers/win/xenbus.git/commitdiff
Update XENBUS_EVTCHN interface with new Send method
authorPaul Durrant <paul.durrant@citrix.com>
Wed, 8 Mar 2017 13:10:10 +0000 (13:10 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Wed, 21 Mar 2018 11:22:53 +0000 (11:22 +0000)
The new version of the method has the same arguments and return of the
previous version but does not modify IRQL. It must therefore be called
with IRQL >= DISPATCH_LEVEL. Most callers already do this (usually
because they have a spin lock held) so the overhead of calling
KeRaiseIrql() and KeLowerIrql() can be saved. Also, it makes the method
safe to be called at > DISPATCH_LEVEL.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
include/evtchn_interface.h
include/revision.h
src/xenbus/evtchn.c

index a9952d65614104e4fa704a11e09bb39e247e4bc3..4de45904d098bdecbc77743d795b05892c433e66 100644 (file)
@@ -156,9 +156,18 @@ typedef VOID
     IN  BOOLEAN                 InCallback
     );
 
+typedef VOID
+(*XENBUS_EVTCHN_SEND_V1)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    );
+
 /*! \typedef XENBUS_EVTCHN_SEND
     \brief Send an event to the remote end of the channel
 
+    It is assumed that the domain cannot suspend during this call so
+    IRQL must be >= DISPATCH_LEVEL.
+
     \param Interface The interface header
     \param Channel The channel handle
 */  
@@ -233,7 +242,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V1 {
     XENBUS_EVTCHN_RELEASE   EvtchnRelease;
     XENBUS_EVTCHN_OPEN      EvtchnOpen;
     XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
-    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_SEND_V1   EvtchnSendVersion1;
     XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
     XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
     XENBUS_EVTCHN_CLOSE     EvtchnClose;
@@ -250,7 +259,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V2 {
     XENBUS_EVTCHN_OPEN      EvtchnOpen;
     XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
     XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
-    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_SEND_V1   EvtchnSendVersion1;
     XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
     XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
     XENBUS_EVTCHN_CLOSE     EvtchnClose;
@@ -267,7 +276,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V3 {
     XENBUS_EVTCHN_OPEN      EvtchnOpen;
     XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
     XENBUS_EVTCHN_UNMASK    EvtchnUnmask;
-    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_SEND_V1   EvtchnSendVersion1;
     XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
     XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
     XENBUS_EVTCHN_CLOSE     EvtchnClose;
@@ -284,7 +293,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V4 {
     XENBUS_EVTCHN_OPEN      EvtchnOpen;
     XENBUS_EVTCHN_BIND      EvtchnBind;
     XENBUS_EVTCHN_UNMASK    EvtchnUnmask;
-    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_SEND_V1   EvtchnSendVersion1;
     XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
     XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
     XENBUS_EVTCHN_CLOSE     EvtchnClose;
@@ -295,6 +304,24 @@ struct _XENBUS_EVTCHN_INTERFACE_V4 {
     \ingroup interfaces
 */
 struct _XENBUS_EVTCHN_INTERFACE_V5 {
+    INTERFACE               Interface;
+    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
+    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_BIND      EvtchnBind;
+    XENBUS_EVTCHN_UNMASK    EvtchnUnmask;
+    XENBUS_EVTCHN_SEND_V1   EvtchnSendVersion1;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_WAIT      EvtchnWait;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V6
+    \brief EVTCHN interface version 6
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V6 {
     INTERFACE               Interface;
     XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
     XENBUS_EVTCHN_RELEASE   EvtchnRelease;
@@ -308,7 +335,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V5 {
     XENBUS_EVTCHN_CLOSE     EvtchnClose;
 };
 
-typedef struct _XENBUS_EVTCHN_INTERFACE_V5 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
+typedef struct _XENBUS_EVTCHN_INTERFACE_V6 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
 
 /*! \def XENBUS_EVTCHN
     \brief Macro at assist in method invocation
@@ -319,7 +346,7 @@ typedef struct _XENBUS_EVTCHN_INTERFACE_V5 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVT
 #endif  // _WINDLL
 
 #define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
-#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 5
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 6
 
 #endif  // _XENBUS_EVTCHN_INTERFACE_H
 
index 47db033f4a2e26c384e6d1c4ce74626b81009641..6d2e408528ee94e5cb7569d84ff6fa9317456524 100644 (file)
@@ -47,6 +47,7 @@
 #define DEFINE_REVISION_TABLE                                               \
     DEFINE_REVISION(0x08000009,  1,  2,  4,  1,  1,  1,  1,  1,  1,  1),    \
     DEFINE_REVISION(0x0800000A,  1,  2,  5,  1,  1,  1,  1,  1,  1,  1),    \
-    DEFINE_REVISION(0x0800000B,  1,  2,  5,  1,  2,  1,  1,  2,  1,  1)
+    DEFINE_REVISION(0x0800000B,  1,  2,  5,  1,  2,  1,  1,  2,  1,  1),    \
+    DEFINE_REVISION(0x0800000C,  1,  2,  6,  1,  2,  1,  1,  2,  1,  1)
 
 #endif  // _REVISION_H
index afb52198e8e65ceac7d82e82a4e05de7074236b9..f965f5bc39b425dacef9d63414ac0dccc7bd97d0 100644 (file)
@@ -798,15 +798,13 @@ EvtchnSend(
     IN  PXENBUS_EVTCHN_CHANNEL  Channel
     )
 {
-    KIRQL                       Irql;
     NTSTATUS                    status;
 
     UNREFERENCED_PARAMETER(Interface);
 
     ASSERT3U(Channel->Magic, ==, XENBUS_EVTCHN_CHANNEL_MAGIC);
 
-    // Make sure we don't suspend
-    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+    ASSERT3U(KeGetCurrentIrql(), >=, DISPATCH_LEVEL);
 
     status = STATUS_UNSUCCESSFUL;
     if (!Channel->Active)
@@ -815,6 +813,20 @@ EvtchnSend(
     status = EventChannelSend(Channel->LocalPort);
 
 done:
+    return status;
+}
+
+static NTSTATUS
+EvtchnSendVersion1(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel
+    )
+{
+    KIRQL                       Irql;
+    NTSTATUS                    status;
+
+    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+    status = EvtchnSend(Interface, Channel);
     KeLowerIrql(Irql);
 
     return status;
@@ -1627,7 +1639,7 @@ static struct _XENBUS_EVTCHN_INTERFACE_V1 EvtchnInterfaceVersion1 = {
     EvtchnRelease,
     EvtchnOpen,
     EvtchnUnmaskVersion1,
-    EvtchnSend,
+    EvtchnSendVersion1,
     EvtchnTrigger,
     EvtchnGetPort,
     EvtchnClose
@@ -1640,7 +1652,7 @@ static struct _XENBUS_EVTCHN_INTERFACE_V2 EvtchnInterfaceVersion2 = {
     EvtchnOpen,
     EvtchnBindVersion2,
     EvtchnUnmaskVersion1,
-    EvtchnSend,
+    EvtchnSendVersion1,
     EvtchnTrigger,
     EvtchnGetPort,
     EvtchnClose
@@ -1653,7 +1665,7 @@ static struct _XENBUS_EVTCHN_INTERFACE_V3 EvtchnInterfaceVersion3 = {
     EvtchnOpen,
     EvtchnBindVersion2,
     EvtchnUnmask,
-    EvtchnSend,
+    EvtchnSendVersion1,
     EvtchnTrigger,
     EvtchnGetPort,
     EvtchnClose
@@ -1666,7 +1678,7 @@ static struct _XENBUS_EVTCHN_INTERFACE_V4 EvtchnInterfaceVersion4 = {
     EvtchnOpen,
     EvtchnBind,
     EvtchnUnmask,
-    EvtchnSend,
+    EvtchnSendVersion1,
     EvtchnTrigger,
     EvtchnGetPort,
     EvtchnClose
@@ -1679,6 +1691,20 @@ static struct _XENBUS_EVTCHN_INTERFACE_V5 EvtchnInterfaceVersion5 = {
     EvtchnOpen,
     EvtchnBind,
     EvtchnUnmask,
+    EvtchnSendVersion1,
+    EvtchnTrigger,
+    EvtchnWait,
+    EvtchnGetPort,
+    EvtchnClose,
+};
+
+static struct _XENBUS_EVTCHN_INTERFACE_V6 EvtchnInterfaceVersion6 = {
+    { sizeof (struct _XENBUS_EVTCHN_INTERFACE_V6), 6, NULL, NULL, NULL },
+    EvtchnAcquire,
+    EvtchnRelease,
+    EvtchnOpen,
+    EvtchnBind,
+    EvtchnUnmask,
     EvtchnSend,
     EvtchnTrigger,
     EvtchnWait,
@@ -1879,6 +1905,23 @@ EvtchnGetInterface(
         status = STATUS_SUCCESS;
         break;
     }
+    case 6: {
+        struct _XENBUS_EVTCHN_INTERFACE_V6  *EvtchnInterface;
+
+        EvtchnInterface = (struct _XENBUS_EVTCHN_INTERFACE_V6 *)Interface;
+
+        status = STATUS_BUFFER_OVERFLOW;
+        if (Size < sizeof (struct _XENBUS_EVTCHN_INTERFACE_V6))
+            break;
+
+        *EvtchnInterface = EvtchnInterfaceVersion6;
+
+        ASSERT3U(Interface->Version, ==, Version);
+        Interface->Context = Context;
+
+        status = STATUS_SUCCESS;
+        break;
+    }
     default:
         status = STATUS_NOT_SUPPORTED;
         break;