kernel/vm: Don't unset VMArea::id in delete_areas.

It's needed in delete_area for arch_vm_unset_memory_type at least.
Instead just add a parameter indicating the area is already removed
from the areas map.
This commit is contained in:
Augustin Cavalier
2024-09-17 20:00:28 -04:00
parent 53ff60f224
commit 734556cb96
+7 -7
View File
@@ -272,7 +272,7 @@ static cache_info* sCacheInfoTable;
// function declarations
static void delete_area(VMAddressSpace* addressSpace, VMArea* area,
bool addressSpaceCleanup);
bool deletingAddressSpace, bool alreadyRemoved = false);
static status_t vm_soft_fault(VMAddressSpace* addressSpace, addr_t address,
bool isWrite, bool isExecute, bool isUser, vm_page** wirePage);
static status_t map_backing_store(VMAddressSpace* addressSpace,
@@ -2573,14 +2573,16 @@ vm_clone_area(team_id team, const char* name, void** address,
\param area The area to be deleted.
\param deletingAddressSpace \c true, if the address space is in the process
of being deleted.
\param alreadyRemoved \c true, if the area was already removed from the global
areas map (and thus had its ID deallocated.)
*/
static void
delete_area(VMAddressSpace* addressSpace, VMArea* area,
bool deletingAddressSpace)
bool deletingAddressSpace, bool alreadyRemoved)
{
ASSERT(!area->IsWired());
if (area->id >= 0)
if (area->id >= 0 && !alreadyRemoved)
VMAreas::Remove(area);
// At this point the area is removed from the global hash table, but
@@ -4007,17 +4009,15 @@ vm_delete_areas(struct VMAddressSpace* addressSpace, bool deletingAddressSpace)
VMAreas::WriteLock();
{
VMAddressSpace::AreaIterator it = addressSpace->GetAreaIterator();
while (VMArea* area = it.Next()) {
while (VMArea* area = it.Next())
VMAreas::Remove(area);
area->id = INT32_MIN;
}
}
VMAreas::WriteUnlock();
// delete all the areas in this address space
while (VMArea* area = addressSpace->FirstArea()) {
ASSERT(!area->IsWired());
delete_area(addressSpace, area, deletingAddressSpace);
delete_area(addressSpace, area, deletingAddressSpace, true);
}
addressSpace->WriteUnlock();