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
|
// function declarations
|
||||||
static void delete_area(VMAddressSpace* addressSpace, VMArea* area,
|
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,
|
static status_t vm_soft_fault(VMAddressSpace* addressSpace, addr_t address,
|
||||||
bool isWrite, bool isExecute, bool isUser, vm_page** wirePage);
|
bool isWrite, bool isExecute, bool isUser, vm_page** wirePage);
|
||||||
static status_t map_backing_store(VMAddressSpace* addressSpace,
|
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 area The area to be deleted.
|
||||||
\param deletingAddressSpace \c true, if the address space is in the process
|
\param deletingAddressSpace \c true, if the address space is in the process
|
||||||
of being deleted.
|
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
|
static void
|
||||||
delete_area(VMAddressSpace* addressSpace, VMArea* area,
|
delete_area(VMAddressSpace* addressSpace, VMArea* area,
|
||||||
bool deletingAddressSpace)
|
bool deletingAddressSpace, bool alreadyRemoved)
|
||||||
{
|
{
|
||||||
ASSERT(!area->IsWired());
|
ASSERT(!area->IsWired());
|
||||||
|
|
||||||
if (area->id >= 0)
|
if (area->id >= 0 && !alreadyRemoved)
|
||||||
VMAreas::Remove(area);
|
VMAreas::Remove(area);
|
||||||
|
|
||||||
// At this point the area is removed from the global hash table, but
|
// 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();
|
VMAreas::WriteLock();
|
||||||
{
|
{
|
||||||
VMAddressSpace::AreaIterator it = addressSpace->GetAreaIterator();
|
VMAddressSpace::AreaIterator it = addressSpace->GetAreaIterator();
|
||||||
while (VMArea* area = it.Next()) {
|
while (VMArea* area = it.Next())
|
||||||
VMAreas::Remove(area);
|
VMAreas::Remove(area);
|
||||||
area->id = INT32_MIN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
VMAreas::WriteUnlock();
|
VMAreas::WriteUnlock();
|
||||||
|
|
||||||
// delete all the areas in this address space
|
// delete all the areas in this address space
|
||||||
while (VMArea* area = addressSpace->FirstArea()) {
|
while (VMArea* area = addressSpace->FirstArea()) {
|
||||||
ASSERT(!area->IsWired());
|
ASSERT(!area->IsWired());
|
||||||
delete_area(addressSpace, area, deletingAddressSpace);
|
delete_area(addressSpace, area, deletingAddressSpace, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
addressSpace->WriteUnlock();
|
addressSpace->WriteUnlock();
|
||||||
|
|||||||
Reference in New Issue
Block a user