From ba9ef7fdee07c42bc772c8b515bc9d808c401112 Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Thu, 15 Jun 2017 15:20:19 +0200 Subject: [PATCH] foc: use slab for meta-data in RPC cap factory --- .../src/core/include/rpc_cap_factory.h | 22 ++++++++++++++++--- repos/base-foc/src/core/rpc_cap_factory.cc | 6 ++--- repos/os/run/timer.run | 5 ++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/repos/base-foc/src/core/include/rpc_cap_factory.h b/repos/base-foc/src/core/include/rpc_cap_factory.h index 0d45757ee4..41df0c1ce6 100644 --- a/repos/base-foc/src/core/include/rpc_cap_factory.h +++ b/repos/base-foc/src/core/include/rpc_cap_factory.h @@ -16,9 +16,14 @@ /* Genode includes */ #include -#include +#include +#include #include +/* base-internal includes */ +#include + + namespace Genode { class Rpc_cap_factory; } class Genode::Rpc_cap_factory @@ -31,11 +36,22 @@ class Genode::Rpc_cap_factory }; Object_pool _pool; - Allocator &_md_alloc; + + /* + * Dimension '_entry_slab' such that slab blocks (including the + * meta-data overhead of the sliced-heap blocks) are page sized. + */ + static constexpr size_t SLAB_BLOCK_SIZE = + get_page_size() - Sliced_heap::meta_data_size(); + + uint8_t _initial_sb[SLAB_BLOCK_SIZE]; + + Tslab _entry_slab; public: - Rpc_cap_factory(Allocator &md_alloc) : _md_alloc(md_alloc) { } + Rpc_cap_factory(Allocator &md_alloc) + : _entry_slab(md_alloc, _initial_sb) { } ~Rpc_cap_factory(); diff --git a/repos/base-foc/src/core/rpc_cap_factory.cc b/repos/base-foc/src/core/rpc_cap_factory.cc index fefc8001fa..c18f5e6cb3 100644 --- a/repos/base-foc/src/core/rpc_cap_factory.cc +++ b/repos/base-foc/src/core/rpc_cap_factory.cc @@ -144,7 +144,7 @@ Native_capability Rpc_cap_factory::alloc(Native_capability ep) * so this is not an issue. */ if (cap.valid()) - _pool.insert(new (_md_alloc) Entry(cap)); + _pool.insert(new (_entry_slab) Entry(cap)); return cap; } @@ -167,7 +167,7 @@ void Rpc_cap_factory::free(Native_capability cap) } else warning("Could not find capability to be deleted"); }); - if (entry) destroy(_md_alloc, entry); + if (entry) destroy(_entry_slab, entry); } @@ -175,7 +175,7 @@ Rpc_cap_factory::~Rpc_cap_factory() { _pool.remove_all([this] (Entry *e) { if (!e) return; - destroy(_md_alloc, e); + destroy(_entry_slab, e); }); } diff --git a/repos/os/run/timer.run b/repos/os/run/timer.run index d7018e5c4b..9d3a9bce67 100644 --- a/repos/os/run/timer.run +++ b/repos/os/run/timer.run @@ -26,12 +26,11 @@ install_config { - - + - +