From 3c4372210e7824666fcfcc7c9c66fb5ea6f15885 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 15 Nov 2016 10:34:22 +0100 Subject: [PATCH] core: remove redundant datastructure Avl allocator provides a method to lookup any element, which is sufficient to find all regions to destruct. Issue #2173 --- .../src/core/include/region_map_component.h | 4 -- repos/base/src/core/region_map_component.cc | 37 ++++--------------- 2 files changed, 8 insertions(+), 33 deletions(-) diff --git a/repos/base/src/core/include/region_map_component.h b/repos/base/src/core/include/region_map_component.h index 4346b3843..92b58d3e0 100644 --- a/repos/base/src/core/include/region_map_component.h +++ b/repos/base/src/core/include/region_map_component.h @@ -285,12 +285,8 @@ class Genode::Region_map_component : public Genode::Weak_object Ref_slab; - Ref_slab _ref_slab; /* backing store for - region list */ Allocator_avl_tpl _map; /* region map for attach, detach, pagefaults */ - List _regions; /* region list for destruction */ - Fifo _faulters; /* list of threads that faulted at the region map and wait for fault resolution */ diff --git a/repos/base/src/core/region_map_component.cc b/repos/base/src/core/region_map_component.cc index 0c8ff56b8..004442d8e 100644 --- a/repos/base/src/core/region_map_component.cc +++ b/repos/base/src/core/region_map_component.cc @@ -392,16 +392,6 @@ Region_map_component::attach(Dataspace_capability ds_cap, size_t size, _map.metadata(r, Rm_region((addr_t)r, size, true, dsc, offset, this)); Rm_region *region = _map.metadata(r); - /* also update region list */ - Rm_region_ref *p; - try { p = new(&_ref_slab) Rm_region_ref(region); } - catch (Allocator::Out_of_memory) { - _map.free(r); - throw Out_of_metadata(); - } - - _regions.insert(p); - /* inform dataspace about attachment */ dsc->attached_to(region); @@ -552,16 +542,6 @@ void Region_map_component::detach(Local_addr local_addr) * region maps. */ unmap_managed(this, ®ion, 1); - - /* update region list */ - Rm_region_ref *p = _regions.first(); - for (; p; p = p->next()) - if (p->region() == region_ptr) break; - - if (p) { - _regions.remove(p); - destroy(&_ref_slab, p); - } } @@ -641,7 +621,6 @@ Region_map_component::Region_map_component(Rpc_entrypoint &ep, : _ds_ep(&ep), _thread_ep(&ep), _session_ep(&ep), _md_alloc(md_alloc), - _ref_slab(&_md_alloc), _map(&_md_alloc), _pager_ep(&pager_ep), _ds(align_addr(vm_size, get_page_size_log2())), _ds_cap(_type_deduction_helper(_ds_ep->manage(&_ds))) @@ -687,17 +666,17 @@ Region_map_component::~Region_map_component() } while (cl); /* detach all regions */ - Rm_region_ref *ref; - do { - void * local_addr; + while (true) { + addr_t out_addr = 0; + { Lock::Guard lock_guard(_lock); - ref = _ref_slab.first_object(); - if (!ref) break; - local_addr = reinterpret_cast(ref->region()->base()); + if (!_map.any_block_addr(&out_addr)) + break; } - detach(local_addr); - } while (ref); + + detach(out_addr); + } /* revoke dataspace representation */ _ds_ep->dissolve(&_ds);