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

[win-pv-devel] [PATCH 1/2] Update XENBUS_EVTCHN interface with new Send method



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@xxxxxxxxxx>
---
 include/evtchn_interface.h | 39 ++++++++++++++++++++++++++-----
 include/revision.h         |  3 ++-
 src/xenbus/evtchn.c        | 57 ++++++++++++++++++++++++++++++++++++++++------
 3 files changed, 85 insertions(+), 14 deletions(-)

diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
index a9952d6..4de4590 100644
--- a/include/evtchn_interface.h
+++ b/include/evtchn_interface.h
@@ -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;
@@ -301,6 +310,24 @@ struct _XENBUS_EVTCHN_INTERFACE_V5 {
     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;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_BIND      EvtchnBind;
+    XENBUS_EVTCHN_UNMASK    EvtchnUnmask;
     XENBUS_EVTCHN_SEND      EvtchnSend;
     XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
     XENBUS_EVTCHN_WAIT      EvtchnWait;
@@ -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
 
diff --git a/include/revision.h b/include/revision.h
index 11c142b..5e39e20 100644
--- a/include/revision.h
+++ b/include/revision.h
@@ -48,6 +48,7 @@
     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(0x09000000,  1,  2,  5,  1,  2,  1,  1,  2,  1,  1)
+    DEFINE_REVISION(0x09000000,  1,  2,  5,  1,  2,  1,  1,  2,  1,  1),    \
+    DEFINE_REVISION(0x09000001,  1,  2,  6,  1,  2,  1,  1,  2,  1,  1)
 
 #endif  // _REVISION_H
diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index afb5219..f965f5b 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -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;
-- 
2.5.3


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://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®.