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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user