vm: allocate wrappers on the heap with small stack array fallback

see comments on #10169. Thanks Ingo for reviewing!
This commit is contained in:
Jérôme Duval
2013-11-11 18:34:14 +01:00
parent c93efdb37f
commit e94bffa072
+13 -7
View File
@@ -3070,18 +3070,22 @@ vm_page_write_modified_page_range(struct VMCache* cache, uint32 firstPage,
const uint32 allocationFlags = HEAP_DONT_WAIT_FOR_MEMORY const uint32 allocationFlags = HEAP_DONT_WAIT_FOR_MEMORY
| HEAP_DONT_LOCK_KERNEL_SPACE; | HEAP_DONT_LOCK_KERNEL_SPACE;
PageWriteWrapper stackWrappers[2]; PageWriteWrapper stackWrappersPool[2];
PageWriteWrapper* stackWrappers[1];
PageWriteWrapper* wrapperPool PageWriteWrapper* wrapperPool
= new(malloc_flags(allocationFlags)) PageWriteWrapper[maxPages + 1]; = new(malloc_flags(allocationFlags)) PageWriteWrapper[maxPages + 1];
if (wrapperPool == NULL) { PageWriteWrapper** wrappers
= new(malloc_flags(allocationFlags)) PageWriteWrapper*[maxPages];
if (wrapperPool == NULL || wrappers == NULL) {
// don't fail, just limit our capabilities // don't fail, just limit our capabilities
wrapperPool = stackWrappers; free(wrapperPool);
free(wrappers);
wrapperPool = stackWrappersPool;
wrappers = stackWrappers;
maxPages = 1; maxPages = 1;
} }
int32 nextWrapper = 0; int32 nextWrapper = 0;
PageWriteWrapper* wrappers[maxPages];
int32 usedWrappers = 0; int32 usedWrappers = 0;
PageWriteTransfer transfer; PageWriteTransfer transfer;
@@ -3151,8 +3155,10 @@ vm_page_write_modified_page_range(struct VMCache* cache, uint32 firstPage,
transferEmpty = true; transferEmpty = true;
} }
if (wrapperPool != stackWrappers) if (wrapperPool != stackWrappersPool) {
delete[] wrapperPool; delete[] wrapperPool;
delete[] wrappers;
}
return B_OK; return B_OK;
} }
@@ -3846,7 +3852,7 @@ vm_page_allocate_page_run(uint32 flags, page_num_t length,
offsetStart = (offsetStart + alignmentMask) & ~alignmentMask; offsetStart = (offsetStart + alignmentMask) & ~alignmentMask;
// enforce boundary // enforce boundary
if (boundaryMask != 0 && ((offsetStart ^ (offsetStart if (boundaryMask != 0 && ((offsetStart ^ (offsetStart
+ length - 1)) & boundaryMask) != 0) { + length - 1)) & boundaryMask) != 0) {
offsetStart = (offsetStart + length - 1) & boundaryMask; offsetStart = (offsetStart + length - 1) & boundaryMask;
} }