|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 03/10] Use GNTTAB_INTERFACE_V5
GNTTAB v5 fails straight away if the backend is still using the grant.
Spin in GranterPut until the backend lets go; otherwise, the caller
could reuse the page while the backend is still accessing it.
Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
include/gnttab_interface.h | 116 +++++++++++++++++++++++++------------
src/xenvbd.inf | 6 +-
src/xenvbd/granter.c | 17 ++++--
3 files changed, 94 insertions(+), 45 deletions(-)
diff --git a/include/gnttab_interface.h b/include/gnttab_interface.h
index 92a95a7..40ea821 100644
--- a/include/gnttab_interface.h
+++ b/include/gnttab_interface.h
@@ -132,7 +132,7 @@ typedef NTSTATUS
_Outptr_ PXENBUS_GNTTAB_ENTRY *Entry
);
-/*! \typedef XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS
+/*! \typedef XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS_V2
\brief Revoke foreign access and return the \a Entry to the \a Cache
\param Interface The interface header
@@ -140,9 +140,35 @@ typedef NTSTATUS
\param Locked If mutually exclusive access to the cache is already
guaranteed then set this to TRUE
\param Entry The grant table entry handle
+
+ If the foreign domain is still accessing the granted page, this retries
+ for a while before giving up.
*/
typedef NTSTATUS
-(*XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS)(
+(*XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS_V2)(
+ _In_ PINTERFACE Interface,
+ _In_ PXENBUS_GNTTAB_CACHE Cache,
+ _In_ BOOLEAN Locked,
+ _In_ PXENBUS_GNTTAB_ENTRY Entry
+ );
+
+/*! \typedef XENBUS_GNTTAB_TRY_REVOKE_FOREIGN_ACCESS
+ \brief Revoke foreign access and return the \a Entry to the \a Cache
+
+ \param Interface The interface header
+ \param Cache The grant table cache handle
+ \param Locked If mutually exclusive access to the cache is already
+ guaranteed then set this to TRUE
+ \param Entry The grant table entry handle
+ \return STATUS_DEVICE_BUSY if the foreign domain is still accessing the
+ granted page
+
+ This does not wait for the foreign domain. On failure, foreign access
+ remains in effect and \a Entry remains valid: the caller must keep the
+ granted page alive, and should retry the revocation later.
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_TRY_REVOKE_FOREIGN_ACCESS)(
_In_ PINTERFACE Interface,
_In_ PXENBUS_GNTTAB_CACHE Cache,
_In_ BOOLEAN Locked,
@@ -239,16 +265,16 @@ DEFINE_GUID(GUID_XENBUS_GNTTAB_INTERFACE,
\ingroup interfaces
*/
struct _XENBUS_GNTTAB_INTERFACE_V2 {
- INTERFACE Interface;
- XENBUS_GNTTAB_ACQUIRE GnttabAcquire;
- XENBUS_GNTTAB_RELEASE GnttabRelease;
- XENBUS_GNTTAB_CREATE_CACHE_V1 GnttabCreateCacheVersion1;
- 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;
+ INTERFACE Interface;
+ XENBUS_GNTTAB_ACQUIRE GnttabAcquire;
+ XENBUS_GNTTAB_RELEASE GnttabRelease;
+ XENBUS_GNTTAB_CREATE_CACHE_V1 GnttabCreateCacheVersion1;
+ XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+ XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS_V2 GnttabRevokeForeignAccessVersion2;
+ 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
@@ -256,17 +282,17 @@ struct _XENBUS_GNTTAB_INTERFACE_V2 {
\ingroup interfaces
*/
struct _XENBUS_GNTTAB_INTERFACE_V3 {
- INTERFACE Interface;
- XENBUS_GNTTAB_ACQUIRE GnttabAcquire;
- XENBUS_GNTTAB_RELEASE GnttabRelease;
- XENBUS_GNTTAB_CREATE_CACHE_V1 GnttabCreateCacheVersion1;
- 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;
+ INTERFACE Interface;
+ XENBUS_GNTTAB_ACQUIRE GnttabAcquire;
+ XENBUS_GNTTAB_RELEASE GnttabRelease;
+ XENBUS_GNTTAB_CREATE_CACHE_V1 GnttabCreateCacheVersion1;
+ XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+ XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS_V2 GnttabRevokeForeignAccessVersion2;
+ 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;
};
/*! \struct _XENBUS_GNTTAB_INTERFACE_V4
@@ -274,20 +300,38 @@ struct _XENBUS_GNTTAB_INTERFACE_V3 {
\ingroup interfaces
*/
struct _XENBUS_GNTTAB_INTERFACE_V4 {
- 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;
+ 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_V2 GnttabRevokeForeignAccessVersion2;
+ 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;
+};
+
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V5
+ \brief GNTTAB interface version 5
+ \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V5 {
+ INTERFACE Interface;
+ XENBUS_GNTTAB_ACQUIRE GnttabAcquire;
+ XENBUS_GNTTAB_RELEASE GnttabRelease;
+ XENBUS_GNTTAB_CREATE_CACHE GnttabCreateCache;
+ XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+ XENBUS_GNTTAB_TRY_REVOKE_FOREIGN_ACCESS GnttabTryRevokeForeignAccess;
+ 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_V4 XENBUS_GNTTAB_INTERFACE,
*PXENBUS_GNTTAB_INTERFACE;
+typedef struct _XENBUS_GNTTAB_INTERFACE_V5 XENBUS_GNTTAB_INTERFACE,
*PXENBUS_GNTTAB_INTERFACE;
/*! \def XENBUS_GNTTAB
\brief Macro at assist in method invocation
@@ -298,6 +342,6 @@ typedef struct _XENBUS_GNTTAB_INTERFACE_V4
XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNT
#endif // _WINDLL
#define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 2
-#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 4
+#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 5
#endif // _XENBUS_GNTTAB_INTERFACE_H
diff --git a/src/xenvbd.inf b/src/xenvbd.inf
index 28405f6..055ffdc 100644
--- a/src/xenvbd.inf
+++ b/src/xenvbd.inf
@@ -54,9 +54,9 @@ xencrsh.sys=0,,
[Inst.NT@INF_ARCH@]
%XenVbdName%=XenVbd_Inst,\
-XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VBD&REV_0900000C,\
-XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VBD&REV_0900000C,\
-XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VBD&REV_0900000C
+XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VBD&REV_0900000D,\
+XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VBD&REV_0900000D,\
+XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VBD&REV_0900000D
[XenVbd_Inst]
CopyFiles=XenVbd_Copyfiles
diff --git a/src/xenvbd/granter.c b/src/xenvbd/granter.c
index eddcdcf..bacd245 100644
--- a/src/xenvbd/granter.c
+++ b/src/xenvbd/granter.c
@@ -358,12 +358,17 @@ GranterPut(
if (Granter->Connected == FALSE)
return;
- status = XENBUS_GNTTAB(RevokeForeignAccess,
- &Granter->GnttabInterface,
- Granter->Cache,
- FALSE,
- Entry);
- ASSERT(NT_SUCCESS(status));
+ for (;;) {
+ status = XENBUS_GNTTAB(TryRevokeForeignAccess,
+ &Granter->GnttabInterface,
+ Granter->Cache,
+ FALSE,
+ Entry);
+ if (NT_SUCCESS(status))
+ break;
+
+ YieldProcessor();
+ }
InterlockedDecrement(&Granter->Current);
}
--
2.56.0.windows.4
--
Ngoc Tu Dinh | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |