|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Make use of updated XENBUS_EVTCHN interface
The latest version of the interface has modified the semantics of the
Wait method to avoid races. The patch takes advantage of these new
semantics.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
include/evtchn_interface.h | 106 +++++++++++++++++++++++----------------------
src/xenvif.inf | 6 +--
src/xenvif/controller.c | 7 +++
3 files changed, 65 insertions(+), 54 deletions(-)
diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
index a9952d6..310850b 100644
--- a/include/evtchn_interface.h
+++ b/include/evtchn_interface.h
@@ -112,13 +112,6 @@ typedef PXENBUS_EVTCHN_CHANNEL
...
);
-typedef NTSTATUS
-(*XENBUS_EVTCHN_BIND_V2)(
- IN PINTERFACE Interface,
- IN PXENBUS_EVTCHN_CHANNEL Channel,
- IN ULONG Cpu
- );
-
/*! \typedef XENBUS_EVTCHN_BIND
\brief Bind an event channel to a specific CPU
@@ -135,13 +128,6 @@ typedef NTSTATUS
IN UCHAR Number
);
-typedef BOOLEAN
-(*XENBUS_EVTCHN_UNMASK_V1)(
- IN PINTERFACE Interface,
- IN PXENBUS_EVTCHN_CHANNEL Channel,
- IN BOOLEAN InCallback
- );
-
/*! \typedef XENBUS_EVTCHN_UNMASK
\brief Unmask an event channel
@@ -156,9 +142,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
*/
@@ -180,17 +175,39 @@ typedef VOID
IN PXENBUS_EVTCHN_CHANNEL Channel
);
+/*! \typedef XENBUS_EVTCHN_GET_COUNT
+ \brief Get the number of events received by the channel since it was opened
+
+ \param Interface The interface header
+ \param Channel The channel handle
+ \return The number of events
+*/
+typedef ULONG
+(*XENBUS_EVTCHN_GET_COUNT)(
+ IN PINTERFACE Interface,
+ IN PXENBUS_EVTCHN_CHANNEL Channel
+ );
+
+typedef NTSTATUS
+(*XENBUS_EVTCHN_WAIT_V5)(
+ IN PINTERFACE Interface,
+ IN PXENBUS_EVTCHN_CHANNEL Channel,
+ IN PLARGE_INTEGER Timeout OPTIONAL
+ );
+
/*! \typedef XENBUS_EVTCHN_WAIT
- \brief Wait for an event to the local end of the channel
+ \brief Wait for events to the local end of the channel
\param Interface The interface header
\param Channel The channel handle
+ \param Count The event count to wait for
\param Timeout An optional timeout value (similar to
KeWaitForSingleObject(), but non-zero values are allowed at DISPATCH_LEVEL).
*/
typedef NTSTATUS
(*XENBUS_EVTCHN_WAIT)(
IN PINTERFACE Interface,
IN PXENBUS_EVTCHN_CHANNEL Channel,
+ IN ULONG Count,
IN PLARGE_INTEGER Timeout OPTIONAL
);
@@ -223,61 +240,46 @@ typedef VOID
DEFINE_GUID(GUID_XENBUS_EVTCHN_INTERFACE,
0xbe2440ac, 0x1098, 0x4150, 0xaf, 0x4d, 0x45, 0x2f, 0xad, 0xce, 0xf9, 0x23);
-/*! \struct _XENBUS_EVTCHN_INTERFACE_V1
- \brief EVTCHN interface version 1
- \ingroup interfaces
-*/
-struct _XENBUS_EVTCHN_INTERFACE_V1 {
- INTERFACE Interface;
- XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
- XENBUS_EVTCHN_RELEASE EvtchnRelease;
- XENBUS_EVTCHN_OPEN EvtchnOpen;
- XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
- XENBUS_EVTCHN_SEND EvtchnSend;
- XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
- XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
- XENBUS_EVTCHN_CLOSE EvtchnClose;
-};
-
-/*! \struct _XENBUS_EVTCHN_INTERFACE_V2
- \brief EVTCHN interface version 2
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V4
+ \brief EVTCHN interface version 4
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V2 {
+struct _XENBUS_EVTCHN_INTERFACE_V4 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
XENBUS_EVTCHN_OPEN EvtchnOpen;
- XENBUS_EVTCHN_BIND_V2 EvtchnBindVersion2;
- XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
- XENBUS_EVTCHN_SEND EvtchnSend;
+ XENBUS_EVTCHN_BIND EvtchnBind;
+ XENBUS_EVTCHN_UNMASK EvtchnUnmask;
+ XENBUS_EVTCHN_SEND_V1 EvtchnSendVersion1;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
XENBUS_EVTCHN_CLOSE EvtchnClose;
};
-/*! \struct _XENBUS_EVTCHN_INTERFACE_V3
- \brief EVTCHN interface version 3
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V5
+ \brief EVTCHN interface version 5
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V3 {
+struct _XENBUS_EVTCHN_INTERFACE_V5 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
XENBUS_EVTCHN_OPEN EvtchnOpen;
- XENBUS_EVTCHN_BIND_V2 EvtchnBindVersion2;
+ XENBUS_EVTCHN_BIND EvtchnBind;
XENBUS_EVTCHN_UNMASK EvtchnUnmask;
- XENBUS_EVTCHN_SEND EvtchnSend;
+ XENBUS_EVTCHN_SEND_V1 EvtchnSendVersion1;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
+ XENBUS_EVTCHN_WAIT_V5 EvtchnWaitVersion5;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
XENBUS_EVTCHN_CLOSE EvtchnClose;
};
-/*! \struct _XENBUS_EVTCHN_INTERFACE_V4
- \brief EVTCHN interface version 4
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V6
+ \brief EVTCHN interface version 6
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V4 {
+struct _XENBUS_EVTCHN_INTERFACE_V6 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
@@ -286,15 +288,16 @@ struct _XENBUS_EVTCHN_INTERFACE_V4 {
XENBUS_EVTCHN_UNMASK EvtchnUnmask;
XENBUS_EVTCHN_SEND EvtchnSend;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
+ XENBUS_EVTCHN_WAIT_V5 EvtchnWaitVersion5;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
XENBUS_EVTCHN_CLOSE EvtchnClose;
};
-/*! \struct _XENBUS_EVTCHN_INTERFACE_V5
- \brief EVTCHN interface version 5
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V7
+ \brief EVTCHN interface version 7
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V5 {
+struct _XENBUS_EVTCHN_INTERFACE_V7 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
@@ -303,12 +306,13 @@ struct _XENBUS_EVTCHN_INTERFACE_V5 {
XENBUS_EVTCHN_UNMASK EvtchnUnmask;
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;
};
-typedef struct _XENBUS_EVTCHN_INTERFACE_V5 XENBUS_EVTCHN_INTERFACE,
*PXENBUS_EVTCHN_INTERFACE;
+typedef struct _XENBUS_EVTCHN_INTERFACE_V7 XENBUS_EVTCHN_INTERFACE,
*PXENBUS_EVTCHN_INTERFACE;
/*! \def XENBUS_EVTCHN
\brief Macro at assist in method invocation
@@ -318,8 +322,8 @@ 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_MIN 4
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 7
#endif // _XENBUS_EVTCHN_INTERFACE_H
diff --git a/src/xenvif.inf b/src/xenvif.inf
index 4ba1ef5..bc4e555 100644
--- a/src/xenvif.inf
+++ b/src/xenvif.inf
@@ -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_09000000
-%XenVifName% =XenVif_Inst,
XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VIF&REV_09000000
-%XenVifName% =XenVif_Inst,
XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VIF&REV_09000000
+%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
[XenVif_Inst]
CopyFiles=XenVif_Copyfiles
diff --git a/src/xenvif/controller.c b/src/xenvif/controller.c
index a542c0d..629b6b7 100644
--- a/src/xenvif/controller.c
+++ b/src/xenvif/controller.c
@@ -259,6 +259,12 @@ ControllerGetResponse(
Timeout.QuadPart = TIME_RELATIVE(TIME_MS(XENVIF_CONTROLLER_POLL_PERIOD));
for (;;) {
+ ULONG Count;
+
+ Count = XENBUS_EVTCHN(GetCount,
+ &Controller->EvtchnInterface,
+ Controller->Channel);
+
ControllerPoll(Controller);
KeMemoryBarrier();
@@ -268,6 +274,7 @@ ControllerGetResponse(
status = XENBUS_EVTCHN(Wait,
&Controller->EvtchnInterface,
Controller->Channel,
+ Count + 1,
&Timeout);
if (status == STATUS_TIMEOUT)
__ControllerSend(Controller);
--
2.5.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |