From e9032904a34ce353fcb012acb2d822c8fae1547a Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Thu, 2 Oct 2014 19:47:36 +0200 Subject: [PATCH] Increase slab-block size in signal component The backend allocator for the slab is a sliced heap, which hands out allocations with page-size granularity (4096 bytes). Therefore, the slab-block size should also be about a multiple of the page size minus some bytes of overhead. Additional adjustments: - The slab-block size and the default quota-upgrade amount for SIGNAL sessions depends on the platform bit width now. - The signal test also stresses the case of many managed context in one session including creation and destruction of the used signal receiver in repeated rounds. --- repos/base/src/base/signal/signal.cc | 9 ++++++-- .../core/include/signal_session_component.h | 3 ++- repos/os/src/test/signal/main.cc | 21 +++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/repos/base/src/base/signal/signal.cc b/repos/base/src/base/signal/signal.cc index e44819d8d8..2527ac0cfd 100644 --- a/repos/base/src/base/signal/signal.cc +++ b/repos/base/src/base/signal/signal.cc @@ -295,8 +295,13 @@ Signal_context_capability Signal_receiver::manage(Signal_context *context) if (try_again) break; - PINF("upgrading quota donation for SIGNAL session"); - env()->parent()->upgrade(signal_connection()->cap(), "ram_quota=4K"); + size_t const quota = 1024*sizeof(long); + char buf[64]; + snprintf(buf, sizeof(buf), "ram_quota=%zu", quota); + + PINF("upgrading quota donation for SIGNAL session (%zu bytes)", quota); + + env()->parent()->upgrade(signal_connection()->cap(), buf); try_again = true; } } while (try_again); diff --git a/repos/base/src/core/include/signal_session_component.h b/repos/base/src/core/include/signal_session_component.h index a30db51430..8a148a8440 100644 --- a/repos/base/src/core/include/signal_session_component.h +++ b/repos/base/src/core/include/signal_session_component.h @@ -143,7 +143,8 @@ namespace Genode { Signal_source_component _source; Signal_source_capability _source_cap; Allocator_guard _md_alloc; - Tslab _contexts_slab; + Tslab _contexts_slab; Ipc_ostream *_ipc_ostream; public: diff --git a/repos/os/src/test/signal/main.cc b/repos/os/src/test/signal/main.cc index 2cb80c4067..2d90749c60 100644 --- a/repos/os/src/test/signal/main.cc +++ b/repos/os/src/test/signal/main.cc @@ -562,6 +562,7 @@ class Signal_context_destroyer : public Thread<4096> } }; + static void synchronized_context_destruction_test() { Signal_receiver receiver; @@ -598,6 +599,25 @@ static void synchronized_context_destruction_test() } +static void many_managed_contexts() +{ + for (unsigned round = 0; round < 10; ++round) { + + unsigned const num_contexts = 200 + 5*round; + printf("round %u: create and manage %u contexts\n", round, num_contexts); + + Signal_receiver rec; + + for (unsigned i = 0; i < num_contexts; ++i) { + Id_signal_context *context = new (env()->heap()) Id_signal_context(i); + rec.manage(context); + } + } + + printf("many contexts finished\n"); +} + + /** * Main program */ @@ -611,6 +631,7 @@ int main(int, char **) lazy_receivers_test(); check_context_management(); synchronized_context_destruction_test(); + many_managed_contexts(); printf("--- signalling test finished ---\n"); return 0;