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

[PATCH xenbus 2/4] Separate the code that creates and destroys the memory hole...



From: Paul Durrant <pdurrant@xxxxxxxxxx>

... into sub-functions called from FdoCreateHole() and FdoDestroyHole().

This is in preparation for a subsequent patch that will introduce an
alternative hole type.

Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx>
---
 src/xenbus/fdo.c | 124 +++++++++++++++++++++++++++++------------------
 1 file changed, 76 insertions(+), 48 deletions(-)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index be54167fee7d..d7dc8f722107 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -92,6 +92,7 @@ typedef struct _XENBUS_VIRQ {
 
 typedef struct _XENBUS_HOLE {
     PXENBUS_RANGE_SET               RangeSet;
+    ULONG                           Count;
     PVOID                           VirtualAddress;
     PHYSICAL_ADDRESS                PhysicalAddress;
 } XENBUS_HOLE, *PXENBUS_HOLE;
@@ -3209,17 +3210,80 @@ FdoSuspendCallbackLate(
     ASSERT(NT_SUCCESS(status));
 }
 
-static NTSTATUS
-FdoCreateHole(
+static FORCEINLINE NTSTATUS
+__FdoCreateMemoryHole(
     IN  PXENBUS_FDO Fdo
     )
 {
     PXENBUS_HOLE    Hole = &Fdo->Hole;
     PMDL            Mdl;
     PFN_NUMBER      Pfn;
-    ULONG           Count;
     NTSTATUS        status;
 
+    Mdl = Fdo->Mdl;
+    Hole->VirtualAddress = MmGetSystemAddressForMdlSafe(Mdl, 
NormalPagePriority);
+
+    Pfn = MmGetMdlPfnArray(Mdl)[0];
+    Hole->PhysicalAddress.QuadPart = (ULONGLONG)Pfn << PAGE_SHIFT;
+
+    Hole->Count = BYTES_TO_PAGES(Mdl->ByteCount);
+    ASSERT3U(Hole->Count, ==, 1u << PAGE_ORDER_2M);
+
+    status = STATUS_UNSUCCESSFUL;
+    if (MemoryDecreaseReservation(PAGE_ORDER_2M, 1, &Pfn) != 1)
+        goto fail1;
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    Hole->Count = 0;
+    Hole->PhysicalAddress.QuadPart = 0;
+    Hole->VirtualAddress = NULL;
+
+    return status;
+}
+
+static FORCEINLINE VOID
+__FdoDestroyMemoryHole(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    PXENBUS_HOLE    Hole = &Fdo->Hole;
+    PMDL            Mdl;
+    PFN_NUMBER      Pfn;
+    ULONG           Index;
+
+    Mdl = Fdo->Mdl;
+    Pfn = MmGetMdlPfnArray(Mdl)[0];
+
+    ASSERT3U(Hole->Count, ==, 1u << PAGE_ORDER_2M);
+    if (MemoryPopulatePhysmap(PAGE_ORDER_2M, 1, &Pfn) == 1)
+        goto done;
+
+    for (Index = 0; Index < Hole->Count; Index++) {
+        if (MemoryPopulatePhysmap(PAGE_ORDER_4K, 1, &Pfn) != 1)
+            BUG("FAILED TO RE-POPULATE HOLE");
+
+        Pfn++;
+    }
+
+done:
+    Hole->Count = 0;
+    Hole->PhysicalAddress.QuadPart = 0;
+    Hole->VirtualAddress = NULL;
+}
+
+static NTSTATUS
+FdoCreateHole(
+    IN  PXENBUS_FDO     Fdo
+    )
+{
+    PXENBUS_HOLE        Hole = &Fdo->Hole;
+    PFN_NUMBER          Pfn;
+    NTSTATUS            status;
+
     status = XENBUS_RANGE_SET(Create,
                               &Fdo->RangeSetInterface,
                               "hole",
@@ -3227,46 +3291,31 @@ FdoCreateHole(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    Mdl = Fdo->Mdl;
-    Hole->VirtualAddress = MmGetSystemAddressForMdlSafe(Mdl, 
NormalPagePriority);
-
-    Pfn = MmGetMdlPfnArray(Mdl)[0];
-    Hole->PhysicalAddress.QuadPart = (ULONGLONG)Pfn << PAGE_SHIFT;
-
-    Count = BYTES_TO_PAGES(Mdl->ByteCount);
-    ASSERT3U(Count, ==, 1u << PAGE_ORDER_2M);
+    status = __FdoCreateMemoryHole(Fdo);
+    if (!NT_SUCCESS(status))
+        goto fail2;
 
     status = XENBUS_RANGE_SET(Put,
                               &Fdo->RangeSetInterface,
                               Hole->RangeSet,
                               0,
-                              Count);
+                              Hole->Count);
     if (!NT_SUCCESS(status))
-        goto fail2;
-
-    status = STATUS_UNSUCCESSFUL;
-    if (MemoryDecreaseReservation(PAGE_ORDER_2M, 1, &Pfn) != 1)
         goto fail3;
 
-    Info("%08x - %08x\n", Pfn, Pfn + Count - 1);
+    Pfn = (PFN_NUMBER)(Hole->PhysicalAddress.QuadPart >> PAGE_SHIFT);
+    Info("%08x - %08x\n", Pfn, Pfn + Hole->Count - 1);
 
     return STATUS_SUCCESS;
 
 fail3:
     Error("fail3\n");
 
-    XENBUS_RANGE_SET(Get,
-                     &Fdo->RangeSetInterface,
-                     Hole->RangeSet,
-                     0,
-                     Count);
+    __FdoDestroyMemoryHole(Fdo);
 
 fail2:
     Error("fail2\n");
 
-    Hole->PhysicalAddress.QuadPart = 0;
-    Hole->VirtualAddress = NULL;
-
     XENBUS_RANGE_SET(Destroy,
                      &Fdo->RangeSetInterface,
                      Hole->RangeSet);
@@ -3342,37 +3391,16 @@ FdoDestroyHole(
     )
 {
     PXENBUS_HOLE    Hole = &Fdo->Hole;
-    PMDL            Mdl;
-    PFN_NUMBER      Pfn;
-    ULONG           Count;
-    ULONG           Index;
     NTSTATUS        status;
 
-    Mdl = Fdo->Mdl;
-    Pfn = MmGetMdlPfnArray(Mdl)[0];
-    Count = BYTES_TO_PAGES(Mdl->ByteCount);
-    ASSERT3U(Count, ==, 1u << PAGE_ORDER_2M);
-
-    if (MemoryPopulatePhysmap(PAGE_ORDER_2M, 1, &Pfn) == 1)
-        goto done;
-
-    for (Index = 0; Index < Count; Index++) {
-        if (MemoryPopulatePhysmap(PAGE_ORDER_4K, 1, &Pfn) != 1)
-            BUG("FAILED TO RE-POPULATE HOLE");
-
-        Pfn++;
-    }
-
-done:
     status = XENBUS_RANGE_SET(Get,
                               &Fdo->RangeSetInterface,
                               Hole->RangeSet,
                               0,
-                              Count);
+                              Hole->Count);
     ASSERT(NT_SUCCESS(status));
 
-    Hole->PhysicalAddress.QuadPart = 0;
-    Hole->VirtualAddress = NULL;
+    __FdoDestroyMemoryHole(Fdo);
 
     XENBUS_RANGE_SET(Destroy,
                      &Fdo->RangeSetInterface,
-- 
2.17.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.