chunk = BalloonGetChunk(b);
if (chunk == NULL) {
OS_ReservedPageFree(b->pageHandle);
- return BALLOON_PAGE_ALLOC_FAILURE;
+ status = BALLOON_PAGE_ALLOC_FAILURE;
+ goto out;
}
/* inform monitor via backdoor */
if (status == BALLOON_ERROR_RESET ||
status == BALLOON_ERROR_PPN_NOTNEEDED) {
OS_ReservedPageFree(b->pageHandle);
- return status;
+ goto out;
}
/* place on list of non-balloonable pages, retry allocation */
status = BalloonErrorPageStore(b, b->pageHandle);
if (status != BALLOON_SUCCESS) {
OS_ReservedPageFree(b->pageHandle);
- return status;
+ goto out;
}
- return old_status;
+ status = old_status;
+ goto out;
}
/* track allocated page */
/* update balloon size */
b->nPages++;
+out:
+ b->pageHandle = PAGE_HANDLE_INVALID;
return status;
}
b->nPages--;
out:
+ b->pageHandle = PAGE_HANDLE_INVALID;
if (b->fallbackChunk != NULL) {
BalloonChunk_Destroy(b->fallbackChunk);
b->fallbackChunk = NULL;
uint16 idx, // IN
PageHandle page) // IN
{
+ ASSERT(b->pageHandle == PAGE_HANDLE_INVALID);
b->pageHandle = page;
}
/* initialize reset flag */
b->resetFlag = TRUE;
+ b->hypervisorCapabilities = 0;
+
b->pageHandle = PAGE_HANDLE_INVALID;
b->batchPageMapping = MAPPING_INVALID;
b->batchPage = NULL;