|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Update EVTCHN and GNTTAB interface headers
Fixes Evtchn Unmask calls
Updates inf revision to 09000004
This will fix an issue where under certain conditions and timings, xenvbd
will request a second reboot to function correctly.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
include/evtchn_interface.h | 128 +++++++++++++++++++++++++++++++++------------
include/gnttab_interface.h | 92 +++++++++++++++++++++++++++++++-
src/xenvbd.inf | 6 +--
src/xenvbd/ring.c | 6 ++-
4 files changed, 193 insertions(+), 39 deletions(-)
diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
index 6f8fe42..068a697 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,8 +128,8 @@ typedef NTSTATUS
IN UCHAR Number
);
-typedef BOOLEAN
-(*XENBUS_EVTCHN_UNMASK_V1)(
+typedef VOID
+(*XENBUS_EVTCHN_UNMASK_V4)(
IN PINTERFACE Interface,
IN PXENBUS_EVTCHN_CHANNEL Channel,
IN BOOLEAN InCallback
@@ -148,17 +141,28 @@ typedef BOOLEAN
\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
+(*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,6 +184,42 @@ 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 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
+ );
+
/*! \typedef XENBUS_EVTCHN_GET_PORT
\brief Get the local port number bound to the channel
@@ -209,61 +249,83 @@ 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
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V4
+ \brief EVTCHN interface version 4
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V1 {
+struct _XENBUS_EVTCHN_INTERFACE_V4 {
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_BIND EvtchnBind;
+ XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4;
+ XENBUS_EVTCHN_SEND_V1 EvtchnSendVersion1;
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_V5
+ \brief EVTCHN interface version 5
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V2 {
+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_UNMASK_V1 EvtchnUnmaskVersion1;
+ XENBUS_EVTCHN_BIND EvtchnBind;
+ XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4;
+ 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_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_V4 EvtchnUnmaskVersion4;
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_V3
- \brief EVTCHN interface version 3
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V7
+ \brief EVTCHN interface version 7
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V3 {
+struct _XENBUS_EVTCHN_INTERFACE_V7 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
XENBUS_EVTCHN_OPEN EvtchnOpen;
- XENBUS_EVTCHN_BIND_V2 EvtchnBindVersion2;
- XENBUS_EVTCHN_UNMASK EvtchnUnmask;
+ 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_V4
- \brief EVTCHN interface version 4
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V8
+ \brief EVTCHN interface version 8
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V4 {
+struct _XENBUS_EVTCHN_INTERFACE_V8 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
@@ -272,11 +334,13 @@ struct _XENBUS_EVTCHN_INTERFACE_V4 {
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_V4 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
@@ -286,8 +350,8 @@ typedef struct _XENBUS_EVTCHN_INTERFACE_V4
XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVT
#endif // _WINDLL
-#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
-#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 4
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 4
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 8
#endif // _XENBUS_EVTCHN_INTERFACE_H
diff --git a/include/gnttab_interface.h b/include/gnttab_interface.h
index d29440a..61272ab 100644
--- a/include/gnttab_interface.h
+++ b/include/gnttab_interface.h
@@ -148,6 +148,26 @@ typedef ULONG
IN PXENBUS_GNTTAB_ENTRY Entry
);
+/*! \typedef XENBUS_GNTTAB_QUERY_REFERENCE
+ \brief Get the reference number of the entry
+
+ \param Interface The interface header
+ \param Reference The reference number
+ \param Pfn An optional pointer to receive the value of the reference frame
number
+ \param ReadOnly An optional pointer to receive the boolean value of the
read-only flag
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_QUERY_REFERENCE)(
+ IN PINTERFACE Interface,
+ IN ULONG Reference,
+ OUT PPFN_NUMBER Pfn OPTIONAL,
+ OUT PBOOLEAN ReadOnly OPTIONAL
+ );
+
+#define XENBUS_GNTTAB_CONSOLE_REFERENCE 0
+#define XENBUS_GNTTAB_STORE_REFERENCE 1
+
+
/*! \typedef XENBUS_GNTTAB_DESTROY_CACHE
\brief Destroy a cache of grant table entries
@@ -163,6 +183,39 @@ typedef VOID
IN PXENBUS_GNTTAB_CACHE Cache
);
+/*! \typedef XENBUS_GNTTAB_MAP_FOREIGN_PAGES
+ \brief Map foreign memory pages into the system address space
+
+ \param Interface The interface header
+ \param Domain The domid of the foreign domain that granted the pages
+ \param NumberPages Number of pages to map
+ \param References Array of grant reference numbers shared by the foreign
domain
+ \param ReadOnly If TRUE, pages are mapped with read-only access
+ \param Address The physical address that the foreign pages are mapped under
+*/
+
+typedef NTSTATUS
+(*XENBUS_GNTTAB_MAP_FOREIGN_PAGES)(
+ IN PINTERFACE Interface,
+ IN USHORT Domain,
+ IN ULONG NumberPages,
+ IN PULONG References,
+ IN BOOLEAN ReadOnly,
+ OUT PHYSICAL_ADDRESS *Address
+ );
+
+/*! \typedef XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES
+ \brief Unmap foreign memory pages from the system address space
+
+ \param Interface The interface header
+ \param Address The physical address that the foreign pages are mapped under
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES)(
+ IN PINTERFACE Interface,
+ IN PHYSICAL_ADDRESS Address
+ );
+
// {763679C5-E5C2-4A6D-8B88-6BB02EC42D8E}
DEFINE_GUID(GUID_XENBUS_GNTTAB_INTERFACE,
0x763679c5, 0xe5c2, 0x4a6d, 0x8b, 0x88, 0x6b, 0xb0, 0x2e, 0xc4, 0x2d, 0x8e);
@@ -182,7 +235,42 @@ struct _XENBUS_GNTTAB_INTERFACE_V1 {
XENBUS_GNTTAB_DESTROY_CACHE GnttabDestroyCache;
};
-typedef struct _XENBUS_GNTTAB_INTERFACE_V1 XENBUS_GNTTAB_INTERFACE,
*PXENBUS_GNTTAB_INTERFACE;
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V2
+ \brief GNTTAB interface version 2
+ \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V2 {
+ INTERFACE Interface;
+ XENBUS_GNTTAB_ACQUIRE GnttabAcquire;
+ XENBUS_GNTTAB_RELEASE GnttabRelease;
+ XENBUS_GNTTAB_CREATE_CACHE GnttabCreateCache;
+ XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+ XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+ XENBUS_GNTTAB_GET_REFERENCE GnttabGetReference;
+ XENBUS_GNTTAB_DESTROY_CACHE GnttabDestroyCache;
+ XENBUS_GNTTAB_MAP_FOREIGN_PAGES GnttabMapForeignPages;
+ XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES GnttabUnmapForeignPages;
+};
+
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V3
+ \brief GNTTAB interface version 3
+ \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V3 {
+ INTERFACE Interface;
+ XENBUS_GNTTAB_ACQUIRE GnttabAcquire;
+ XENBUS_GNTTAB_RELEASE GnttabRelease;
+ XENBUS_GNTTAB_CREATE_CACHE GnttabCreateCache;
+ XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+ XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+ XENBUS_GNTTAB_GET_REFERENCE GnttabGetReference;
+ XENBUS_GNTTAB_QUERY_REFERENCE GnttabQueryReference;
+ XENBUS_GNTTAB_DESTROY_CACHE GnttabDestroyCache;
+ XENBUS_GNTTAB_MAP_FOREIGN_PAGES GnttabMapForeignPages;
+ XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES GnttabUnmapForeignPages;
+};
+
+typedef struct _XENBUS_GNTTAB_INTERFACE_V3 XENBUS_GNTTAB_INTERFACE,
*PXENBUS_GNTTAB_INTERFACE;
/*! \def XENBUS_GNTTAB
\brief Macro at assist in method invocation
@@ -193,7 +281,7 @@ typedef struct _XENBUS_GNTTAB_INTERFACE_V1
XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNT
#endif // _WINDLL
#define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 1
-#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 1
+#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 3
#endif // _XENBUS_GNTTAB_INTERFACE_H
diff --git a/src/xenvbd.inf b/src/xenvbd.inf
index bb5ada2..5220add 100644
--- a/src/xenvbd.inf
+++ b/src/xenvbd.inf
@@ -54,9 +54,9 @@ xenvbd_coinst.dll=0,,
%Vendor%=Inst,NT$ARCH$
[Inst.NT$ARCH$]
-%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VBD&REV_09000000
-%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VBD&REV_09000000
-%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VBD&REV_09000000
+%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VBD&REV_09000004
+%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VBD&REV_09000004
+%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VBD&REV_09000004
[XenVbd_Inst]
CopyFiles=XenVbd_Copyfiles
diff --git a/src/xenvbd/ring.c b/src/xenvbd/ring.c
index a7b636d..2f5c876 100644
--- a/src/xenvbd/ring.c
+++ b/src/xenvbd/ring.c
@@ -1649,7 +1649,8 @@ BlkifRingDpc(
XENBUS_EVTCHN(Unmask,
&Ring->EvtchnInterface,
BlkifRing->Channel,
- FALSE);
+ FALSE,
+ TRUE);
}
static NTSTATUS
@@ -1923,7 +1924,8 @@ BlkifRingConnect(
XENBUS_EVTCHN(Unmask,
&Ring->EvtchnInterface,
BlkifRing->Channel,
- FALSE);
+ FALSE,
+ TRUE);
status = RtlStringCchPrintfA(Name,
MAX_NAME_LEN,
--
2.16.2.windows.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |