return (status == STATUS_SUCCESS) ? TRUE : FALSE;
}
-static BOOLEAN
+static NTSTATUS
BalloonDeflate(
IN PXENBUS_BALLOON_CONTEXT Context,
IN ULONGLONG Requested
{
LARGE_INTEGER Start;
LARGE_INTEGER End;
- BOOLEAN Abort;
ULONGLONG Count;
ULONGLONG TimeDelta;
+ NTSTATUS status;
+ status = STATUS_UNSUCCESSFUL;
if (Context->FIST.Deflation)
- return TRUE;
+ goto done;
Info("====> %llu page(s)\n", Requested);
KeQuerySystemTime(&Start);
Count = 0;
- Abort = FALSE;
+ status = STATUS_SUCCESS;
- while (Count < Requested && !Abort) {
+ while (Count < Requested && NT_SUCCESS(status)) {
ULONG ThisTime = (ULONG)__min(Requested - Count, XENBUS_BALLOON_PFN_ARRAY_SIZE);
ULONG Populated;
ULONG Freed;
Populated = BalloonPopulatePfnArray(Context, ThisTime);
if (Populated < ThisTime)
- Abort = TRUE;
+ status = STATUS_RETRY;
Freed = BalloonFreePfnArray(Context, Populated, TRUE);
ASSERT(Freed == Populated);
Info("<==== %llu page(s) in %llums\n", Count, TimeDelta);
Context->Size -= Count;
- return Abort;
+done:
+ return status;
}
-static BOOLEAN
+static NTSTATUS
BalloonInflate(
IN PXENBUS_BALLOON_CONTEXT Context,
IN ULONGLONG Requested
{
LARGE_INTEGER Start;
LARGE_INTEGER End;
- BOOLEAN Abort;
ULONGLONG Count;
ULONGLONG TimeDelta;
+ NTSTATUS status;
+ status = STATUS_UNSUCCESSFUL;
if (Context->FIST.Inflation)
- return TRUE;
+ goto done;
+ status = STATUS_NO_MEMORY;
if (BalloonLowMemory(Context))
- return TRUE;
+ goto done;
Info("====> %llu page(s)\n", Requested);
KeQuerySystemTime(&Start);
Count = 0;
- Abort = FALSE;
+ status = STATUS_SUCCESS;
- while (Count < Requested && !Abort) {
+ while (Count < Requested && NT_SUCCESS(status)) {
ULONG ThisTime = (ULONG)__min(Requested - Count, XENBUS_BALLOON_PFN_ARRAY_SIZE);
ULONG Allocated;
BOOLEAN Slow;
Allocated = BalloonAllocatePfnArray(Context, ThisTime, &Slow);
if (Allocated < ThisTime || Slow)
- Abort = TRUE;
+ status = STATUS_RETRY;
Released = BalloonReleasePfnArray(Context, Allocated);
}
if (Released == 0)
- Abort = TRUE;
+ status = STATUS_RETRY;
Count += Released;
}
Info("<==== %llu page(s) in %llums\n", Count, TimeDelta);
Context->Size += Count;
- return Abort;
+done:
+ return status;
}
static VOID
Warning("deflation disallowed\n");
}
+static FORCEINLINE PCHAR
+__BalloonStatus(
+ IN NTSTATUS status
+ )
+{
+ switch (status) {
+ case STATUS_SUCCESS:
+ return "";
+ case STATUS_UNSUCCESSFUL:
+ return " [FIST]";
+ case STATUS_RETRY:
+ return " [RETRY]";
+ case STATUS_NO_MEMORY:
+ return " [LOW_MEM]";
+ default:
+ break;
+ }
+
+ return " [UNKNOWN]";
+}
+
NTSTATUS
BalloonAdjust(
IN PINTERFACE Interface,
)
{
PXENBUS_BALLOON_CONTEXT Context = Interface->Context;
- BOOLEAN Abort;
+ NTSTATUS status;
ASSERT3U(KeGetCurrentIrql(), <, DISPATCH_LEVEL);
Info("====> (%llu page(s))\n", Context->Size);
- Abort = FALSE;
+ status = STATUS_SUCCESS;
BalloonGetFISTEntries(Context);
- while (Context->Size != Size && !Abort) {
+ while (Context->Size != Size && NT_SUCCESS(status)) {
if (Size > Context->Size)
- Abort = BalloonInflate(Context, Size - Context->Size);
+ status = BalloonInflate(Context, Size - Context->Size);
else if (Size < Context->Size)
- Abort = BalloonDeflate(Context, Context->Size - Size);
+ status = BalloonDeflate(Context, Context->Size - Size);
}
Info("<==== (%llu page(s))%s\n",
Context->Size,
- (Abort) ? " [ABORTED]" : "");
+ __BalloonStatus(status));
- return (Abort) ? STATUS_RETRY : STATUS_SUCCESS;
+ return status;
}
ULONGLONG