Move FlatAllocator allocation error handling to the caller

This is a prerequisite for nvmap SMMU memory management, which only frees the memory handles refer to if an allocation fails.
This commit is contained in:
Billy Laws 2021-10-25 22:51:49 +01:00 committed by PixelyIon
parent 04e5237ec1
commit 97dc053ffd
3 changed files with 11 additions and 3 deletions

View File

@ -406,7 +406,7 @@ namespace skyline {
if (searchSuccessor != this->blocks.end()) if (searchSuccessor != this->blocks.end())
allocStart = searchPredecessor->virt; allocStart = searchPredecessor->virt;
else else
throw exception("Unexpected allocator state!"); return {}; // AS is full
} }

View File

@ -65,10 +65,13 @@ namespace skyline::service::nvdrv::device::nvhost {
auto &allocator{pageSize == VM::PageSize ? *vm.smallPageAllocator : *vm.bigPageAllocator}; auto &allocator{pageSize == VM::PageSize ? *vm.smallPageAllocator : *vm.bigPageAllocator};
if (flags.fixed) if (flags.fixed) {
allocator.AllocateFixed(static_cast<u32>(offset >> pageSizeBits), pages); allocator.AllocateFixed(static_cast<u32>(offset >> pageSizeBits), pages);
else } else {
offset = static_cast<u64>(allocator.Allocate(pages)) << pageSizeBits; offset = static_cast<u64>(allocator.Allocate(pages)) << pageSizeBits;
if (!offset)
throw exception("Failed to allocate free space in the GPU AS!");
}
u64 size{static_cast<u64>(pages) * pageSize}; u64 size{static_cast<u64>(pages) * pageSize};
@ -236,6 +239,9 @@ namespace skyline::service::nvdrv::device::nvhost {
u32 pageSizeBits{bigPage ? vm.bigPageSizeBits : VM::PageSizeBits}; u32 pageSizeBits{bigPage ? vm.bigPageSizeBits : VM::PageSizeBits};
offset = static_cast<u64>(allocator.Allocate(static_cast<u32>(util::AlignUp(size, pageSize) >> pageSizeBits))) << pageSizeBits; offset = static_cast<u64>(allocator.Allocate(static_cast<u32>(util::AlignUp(size, pageSize) >> pageSizeBits))) << pageSizeBits;
if (!offset)
throw exception("Failed to allocate free space in the GPU AS!");
asCtx->gmmu.Map(offset, cpuPtr, size); asCtx->gmmu.Map(offset, cpuPtr, size);
auto mapping{std::make_shared<Mapping>(cpuPtr, offset, size, false, bigPage, false)}; auto mapping{std::make_shared<Mapping>(cpuPtr, offset, size, false, bigPage, false)};

View File

@ -182,6 +182,8 @@ namespace skyline::service::nvdrv::device::nvhost {
// Allocate pages in the GPU AS // Allocate pages in the GPU AS
pushBufferAddr = static_cast<u64>(asAllocator->Allocate((static_cast<u32>(pushBufferWords) >> AsGpu::VM::PageSizeBits) + 1)) << AsGpu::VM::PageSizeBits; pushBufferAddr = static_cast<u64>(asAllocator->Allocate((static_cast<u32>(pushBufferWords) >> AsGpu::VM::PageSizeBits) + 1)) << AsGpu::VM::PageSizeBits;
if (!pushBufferAddr)
throw exception("Failed to allocate channel pushbuffer!");
// Map onto the GPU // Map onto the GPU
asCtx->gmmu.Map(pushBufferAddr, reinterpret_cast<u8 *>(pushBufferMemory.data()), pushBufferSize); asCtx->gmmu.Map(pushBufferAddr, reinterpret_cast<u8 *>(pushBufferMemory.data()), pushBufferSize);