[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 1/3] Add support for XENMEM_remove_from_physmap...
From: Paul Durrant <pdurrant@xxxxxxxxxx> ... and make use of it to remove shared_info and grant table pages from the P2M when we're closing down. This makes sure we don't leave such pages lying around in the Xen platform PCI device's BAR. NOTE: Now that we're making GnttabUnmap() actually do something, tidy up the implementation of GnttabMap() so it is aligned. Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx> --- include/xen.h | 7 +++++++ src/xen/memory.c | 29 +++++++++++++++++++++++++++++ src/xenbus/gnttab.c | 22 ++++++++++++++-------- src/xenbus/shared_info.c | 5 ++--- 4 files changed, 52 insertions(+), 11 deletions(-) diff --git a/include/xen.h b/include/xen.h index 566e7136cf98..132de21c1b62 100644 --- a/include/xen.h +++ b/include/xen.h @@ -128,6 +128,13 @@ MemoryAddToPhysmap( IN ULONG_PTR Offset ); +__checkReturn +XEN_API +NTSTATUS +MemoryRemoveFromPhysmap( + IN PFN_NUMBER Pfn + ); + #define PAGE_ORDER_4K 0 #define PAGE_ORDER_2M 9 diff --git a/src/xen/memory.c b/src/xen/memory.c index dfee22cffa02..bc1214040476 100644 --- a/src/xen/memory.c +++ b/src/xen/memory.c @@ -81,6 +81,35 @@ fail1: return status; } +__checkReturn +XEN_API +NTSTATUS +MemoryRemoveFromPhysmap( + IN PFN_NUMBER Pfn + ) +{ + struct xen_remove_from_physmap op; + LONG_PTR rc; + NTSTATUS status; + + op.domid = DOMID_SELF; + op.gpfn = (xen_pfn_t)Pfn; + + rc = MemoryOp(XENMEM_remove_from_physmap, &op); + + if (rc < 0) { + ERRNO_TO_STATUS(-rc, status); + goto fail1; + } + + return STATUS_SUCCESS; + +fail1: + Error("fail1 (%08x)\n", status); + + return status; +} + __checkReturn XEN_API ULONG diff --git a/src/xenbus/gnttab.c b/src/xenbus/gnttab.c index 1e22a363b77d..af562608b40d 100644 --- a/src/xenbus/gnttab.c +++ b/src/xenbus/gnttab.c @@ -163,7 +163,7 @@ GnttabExpand( fail3: Error("fail3\n"); - // Not clear what to do here + (VOID) MemoryRemoveFromPhysmap((PFN_NUMBER)(Address.QuadPart >> PAGE_SHIFT)); fail2: Error("fail2\n"); @@ -182,12 +182,14 @@ GnttabMap( ) { LONG Index; - PHYSICAL_ADDRESS Address; NTSTATUS status; - Address = Context->Address; - for (Index = 0; Index <= Context->FrameIndex; Index++) { + PHYSICAL_ADDRESS Address; + + Address = Context->Address; + Address.QuadPart += (ULONGLONG)Index << PAGE_SHIFT; + status = MemoryAddToPhysmap((PFN_NUMBER)(Address.QuadPart >> PAGE_SHIFT), XENMAPSPACE_grant_table, Index); @@ -198,8 +200,6 @@ GnttabMap( Index, Address.HighPart, Address.LowPart); - - Address.QuadPart += PAGE_SIZE; } } @@ -210,12 +210,18 @@ GnttabUnmap( { LONG Index; - // Not clear what to do here + for (Index = Context->FrameIndex; Index >= 0; --Index) { + PHYSICAL_ADDRESS Address; + + Address = Context->Address; + Address.QuadPart += (ULONGLONG)Index << PAGE_SHIFT; + + (VOID) MemoryRemoveFromPhysmap((PFN_NUMBER)(Address.QuadPart >> PAGE_SHIFT)); - for (Index = Context->FrameIndex; Index >= 0; --Index) LogPrintf(LOG_LEVEL_INFO, "GNTTAB: UNMAP XENMAPSPACE_grant_table[%d]\n", Index); + } } static VOID diff --git a/src/xenbus/shared_info.c b/src/xenbus/shared_info.c index b1ad2dcfc3c6..f25e12a1c689 100644 --- a/src/xenbus/shared_info.c +++ b/src/xenbus/shared_info.c @@ -477,12 +477,11 @@ SharedInfoUnmap( IN PXENBUS_SHARED_INFO_CONTEXT Context ) { - UNREFERENCED_PARAMETER(Context); - LogPrintf(LOG_LEVEL_INFO, "SHARED_INFO: UNMAP XENMAPSPACE_shared_info\n"); - // Not clear what to do here + + (VOID) MemoryRemoveFromPhysmap((PFN_NUMBER)(Context->Address.QuadPart >> PAGE_SHIFT)); } static VOID -- 2.25.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |