From 0f3ac4cb9f0a7116ab07202505495d9eb5348b8c Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Thu, 19 Mar 2020 16:53:22 +0100 Subject: [PATCH] base-hw: let upgrade_cap_slab reflect Out_of_caps This patch reflects the Out_of_caps exception from core to the client, in addition to the already covered Out_of_ram exception. It thereby eliminates a potential abort in core, which I observed with the tool_chain_auto.run script: Kernel: RPC upgrade_cap_slab Error: Uncaught exception of type 'Genode::Quota_guard::Limit_exceeded' Warning: abort called - thread: entrypoint In addition to propagating the exception, the patch add the client-side exception-handling code to the base library. Fixes #3703 --- .../include/hw_native_pd/hw_native_pd.h | 2 +- repos/base-hw/src/lib/base/env_deprecated.cc | 25 +++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/repos/base-hw/include/hw_native_pd/hw_native_pd.h b/repos/base-hw/include/hw_native_pd/hw_native_pd.h index 026b41a74..845c45fd3 100644 --- a/repos/base-hw/include/hw_native_pd/hw_native_pd.h +++ b/repos/base-hw/include/hw_native_pd/hw_native_pd.h @@ -30,7 +30,7 @@ struct Genode::Hw_native_pd : Pd_session::Native_pd *********************/ GENODE_RPC_THROW(Rpc_upgrade_cap_slab, void, upgrade_cap_slab, - GENODE_TYPE_LIST(Out_of_ram)); + GENODE_TYPE_LIST(Out_of_ram, Out_of_caps)); GENODE_RPC_INTERFACE(Rpc_upgrade_cap_slab); }; diff --git a/repos/base-hw/src/lib/base/env_deprecated.cc b/repos/base-hw/src/lib/base/env_deprecated.cc index e061ab098..964beeb5f 100644 --- a/repos/base-hw/src/lib/base/env_deprecated.cc +++ b/repos/base-hw/src/lib/base/env_deprecated.cc @@ -61,13 +61,28 @@ void Genode::upgrade_capability_slab() return; } - retry( + auto request_resources_from_parent = [&] (Ram_quota ram, Cap_quota caps) + { + /* + * The call of 'resource_request' is handled synchronously by + * 'Expanding_parent_client'. + */ + String<100> const args("ram_quota=", ram, ", cap_quota=", caps); + internal_env().parent().resource_request(args.string()); + }; + + retry( [&] () { - Genode::Hw_native_pd_client pd(native_pd_cap); - pd.upgrade_cap_slab(); + retry( + [&] () { + Genode::Hw_native_pd_client pd(native_pd_cap); + pd.upgrade_cap_slab(); + }, + [&] () { + request_resources_from_parent(Ram_quota{8192}, Cap_quota{0}); + }); }, [&] () { - internal_env().upgrade(Parent::Env::pd(), - String<100>("ram_quota=", 8192).string()); + request_resources_from_parent(Ram_quota{0}, Cap_quota{2}); }); }