|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH xenbus 1/4] Separate parameters associated with the memory hole from XENBUS_FDO...
From: Paul Durrant <pdurrant@xxxxxxxxxx>
... into a new XENBUS_HOLE structure.
Also, zero-base the range set used in the allocator. It actually makes the
code more complicated to have the range based on the first PFN of the hole.
Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx>
---
src/xenbus/fdo.c | 111 +++++++++++++++++++++++++----------------------
1 file changed, 58 insertions(+), 53 deletions(-)
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 05a069432790..be54167fee7d 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -90,6 +90,12 @@ typedef struct _XENBUS_VIRQ {
ULONG Count;
} XENBUS_VIRQ, *PXENBUS_VIRQ;
+typedef struct _XENBUS_HOLE {
+ PXENBUS_RANGE_SET RangeSet;
+ PVOID VirtualAddress;
+ PHYSICAL_ADDRESS PhysicalAddress;
+} XENBUS_HOLE, *PXENBUS_HOLE;
+
struct _XENBUS_FDO {
PXENBUS_DX Dx;
PDEVICE_OBJECT LowerDeviceObject;
@@ -148,9 +154,8 @@ struct _XENBUS_FDO {
XENBUS_RANGE_SET_INTERFACE RangeSetInterface;
XENBUS_BALLOON_INTERFACE BalloonInterface;
- PUCHAR Buffer;
PMDL Mdl;
- PXENBUS_RANGE_SET RangeSet;
+ XENBUS_HOLE Hole;
LIST_ENTRY InterruptList;
LIST_ENTRY VirqList;
@@ -3209,30 +3214,32 @@ FdoCreateHole(
IN PXENBUS_FDO Fdo
)
{
+ PXENBUS_HOLE Hole = &Fdo->Hole;
PMDL Mdl;
PFN_NUMBER Pfn;
- LONGLONG Start;
ULONG Count;
NTSTATUS status;
status = XENBUS_RANGE_SET(Create,
&Fdo->RangeSetInterface,
"hole",
- &Fdo->RangeSet);
+ &Hole->RangeSet);
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;
- Start = Pfn;
Count = BYTES_TO_PAGES(Mdl->ByteCount);
+ ASSERT3U(Count, ==, 1u << PAGE_ORDER_2M);
status = XENBUS_RANGE_SET(Put,
&Fdo->RangeSetInterface,
- Fdo->RangeSet,
- Start,
+ Hole->RangeSet,
+ 0,
Count);
if (!NT_SUCCESS(status))
goto fail2;
@@ -3241,7 +3248,7 @@ FdoCreateHole(
if (MemoryDecreaseReservation(PAGE_ORDER_2M, 1, &Pfn) != 1)
goto fail3;
- Trace("%08x - %08x\n", Start, Start + Count - 1);
+ Info("%08x - %08x\n", Pfn, Pfn + Count - 1);
return STATUS_SUCCESS;
@@ -3250,17 +3257,20 @@ fail3:
XENBUS_RANGE_SET(Get,
&Fdo->RangeSetInterface,
- Fdo->RangeSet,
- Start,
+ Hole->RangeSet,
+ 0,
Count);
fail2:
Error("fail2\n");
+ Hole->PhysicalAddress.QuadPart = 0;
+ Hole->VirtualAddress = NULL;
+
XENBUS_RANGE_SET(Destroy,
&Fdo->RangeSetInterface,
- Fdo->RangeSet);
- Fdo->RangeSet = NULL;
+ Hole->RangeSet);
+ Hole->RangeSet = NULL;
fail1:
Error("fail1 (%08x)\n", status);
@@ -3276,33 +3286,24 @@ FdoAllocateHole(
OUT PPHYSICAL_ADDRESS PhysicalAddress
)
{
- LONGLONG Start;
+ PXENBUS_HOLE Hole = &Fdo->Hole;
+ LONGLONG Index;
NTSTATUS status;
status = XENBUS_RANGE_SET(Pop,
&Fdo->RangeSetInterface,
- Fdo->RangeSet,
+ Hole->RangeSet,
Count,
- &Start);
+ &Index);
if (!NT_SUCCESS(status))
goto fail1;
- Trace("%08x - %08x\n", Start, Start + Count - 1);
-
- if (VirtualAddress != NULL) {
- PUCHAR StartVa = Fdo->Buffer;
- PMDL Mdl = Fdo->Mdl;
- ULONG Index;
- ULONG ByteOffset;
+ if (VirtualAddress != NULL)
+ *VirtualAddress = (PUCHAR)Hole->VirtualAddress +
+ (Index << PAGE_SHIFT);
- Index = (ULONG)((PFN_NUMBER)Start - MmGetMdlPfnArray(Mdl)[0]);
- ByteOffset = Index * PAGE_SIZE;
- ASSERT3U(ByteOffset, <=, Mdl->ByteCount);
-
- *VirtualAddress = StartVa + ByteOffset;
- }
-
- PhysicalAddress->QuadPart = Start << PAGE_SHIFT;
+ PhysicalAddress->QuadPart = Hole->PhysicalAddress.QuadPart +
+ (Index << PAGE_SHIFT);
return STATUS_SUCCESS;;
@@ -3319,18 +3320,18 @@ FdoFreeHole(
IN ULONG Count
)
{
- LONGLONG Start;
+ PXENBUS_HOLE Hole = &Fdo->Hole;
+ LONGLONG Index;
NTSTATUS status;
- ASSERT3U(PhysicalAddress.QuadPart & (PAGE_SIZE - 1), ==, 0);
- Start = PhysicalAddress.QuadPart >> PAGE_SHIFT;
-
- Trace("%08x - %08x\n", Start, Start + Count - 1);
+ Index = PhysicalAddress.QuadPart - Hole->PhysicalAddress.QuadPart;
+ ASSERT3U(Index & (PAGE_SIZE - 1), ==, 0);
+ Index >>= PAGE_SHIFT;
status = XENBUS_RANGE_SET(Put,
&Fdo->RangeSetInterface,
- Fdo->RangeSet,
- Start,
+ Hole->RangeSet,
+ Index,
Count);
ASSERT(NT_SUCCESS(status));
}
@@ -3340,23 +3341,18 @@ FdoDestroyHole(
IN PXENBUS_FDO Fdo
)
{
+ PXENBUS_HOLE Hole = &Fdo->Hole;
PMDL Mdl;
PFN_NUMBER Pfn;
- LONGLONG Start;
ULONG Count;
ULONG Index;
NTSTATUS status;
Mdl = Fdo->Mdl;
-
Pfn = MmGetMdlPfnArray(Mdl)[0];
-
- Start = Pfn;
Count = BYTES_TO_PAGES(Mdl->ByteCount);
+ ASSERT3U(Count, ==, 1u << PAGE_ORDER_2M);
- Trace("%08x - %08x\n", Start, Start + Count - 1);
-
- ASSERT3U(Count & ((1u << PAGE_ORDER_2M) - 1), ==, 0);
if (MemoryPopulatePhysmap(PAGE_ORDER_2M, 1, &Pfn) == 1)
goto done;
@@ -3370,15 +3366,18 @@ FdoDestroyHole(
done:
status = XENBUS_RANGE_SET(Get,
&Fdo->RangeSetInterface,
- Fdo->RangeSet,
- Start,
+ Hole->RangeSet,
+ 0,
Count);
ASSERT(NT_SUCCESS(status));
+ Hole->PhysicalAddress.QuadPart = 0;
+ Hole->VirtualAddress = NULL;
+
XENBUS_RANGE_SET(Destroy,
&Fdo->RangeSetInterface,
- Fdo->RangeSet);
- Fdo->RangeSet = NULL;
+ Hole->RangeSet);
+ Hole->RangeSet = NULL;
}
static VOID
@@ -5498,6 +5497,7 @@ __FdoAllocateBuffer(
IN PXENBUS_FDO Fdo
)
{
+ ULONG Count;
ULONG Size;
PHYSICAL_ADDRESS Low;
PHYSICAL_ADDRESS High;
@@ -5506,7 +5506,8 @@ __FdoAllocateBuffer(
PMDL Mdl;
NTSTATUS status;
- Size = 2 << 20;
+ Count = 1u << PAGE_ORDER_2M;
+ Size = Count << PAGE_SHIFT;
Low.QuadPart = 0;
High = SystemMaximumPhysicalAddress();
@@ -5538,7 +5539,6 @@ __FdoAllocateBuffer(
ASSERT3U(Mdl->ByteOffset, ==, 0);
ASSERT3U(Mdl->ByteCount, ==, Size);
- Fdo->Buffer = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
Fdo->Mdl = Mdl;
return STATUS_SUCCESS;
@@ -5559,11 +5559,16 @@ __FdoFreeBuffer(
IN PXENBUS_FDO Fdo
)
{
- ExFreePool(Fdo->Mdl);
+ PMDL Mdl;
+ PVOID Buffer;
+
+ Mdl = Fdo->Mdl;
Fdo->Mdl = NULL;
- MmFreeContiguousMemory(Fdo->Buffer);
- Fdo->Buffer = NULL;
+ ExFreePool(Mdl);
+
+ Buffer = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
+ MmFreeContiguousMemory(Buffer);
}
static NTSTATUS
--
2.17.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |