From 42cef716e105e2e17e507406f762b0d685c4b27b Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Thu, 29 Nov 2012 16:48:12 +0100 Subject: [PATCH] CPU session meta data RAM quota upgrade support Fixes #541. --- .../src/core/include/cpu_session_component.h | 5 +++ .../src/core/include/cpu_session_component.h | 5 +++ .../src/core/include/cpu_session_component.h | 5 +++ base/include/base/platform_env.h | 32 ++++++++++++++++++- base/include/cpu_session/cpu_session.h | 4 ++- base/src/core/cpu_session_component.cc | 2 +- base/src/core/include/cpu_root.h | 6 ++++ base/src/core/include/cpu_session_component.h | 5 +++ 8 files changed, 61 insertions(+), 3 deletions(-) diff --git a/base-foc/src/core/include/cpu_session_component.h b/base-foc/src/core/include/cpu_session_component.h index 0353e72cb..49dddc76f 100644 --- a/base-foc/src/core/include/cpu_session_component.h +++ b/base-foc/src/core/include/cpu_session_component.h @@ -122,6 +122,11 @@ namespace Genode { */ ~Cpu_session_component(); + /** + * Register quota donation at allocator guard + */ + void upgrade_ram_quota(size_t ram_quota) { _md_alloc.upgrade(ram_quota); } + /*************************** ** CPU session interface ** diff --git a/base-linux/src/core/include/cpu_session_component.h b/base-linux/src/core/include/cpu_session_component.h index 65fee7fee..5c5612fec 100644 --- a/base-linux/src/core/include/cpu_session_component.h +++ b/base-linux/src/core/include/cpu_session_component.h @@ -117,6 +117,11 @@ namespace Genode { */ ~Cpu_session_component(); + /** + * Register quota donation at allocator guard + */ + void upgrade_ram_quota(size_t ram_quota) { _md_alloc.upgrade(ram_quota); } + /*************************** ** CPU session interface ** diff --git a/base-nova/src/core/include/cpu_session_component.h b/base-nova/src/core/include/cpu_session_component.h index 259a67544..c08e2275f 100644 --- a/base-nova/src/core/include/cpu_session_component.h +++ b/base-nova/src/core/include/cpu_session_component.h @@ -122,6 +122,11 @@ namespace Genode { */ ~Cpu_session_component(); + /** + * Register quota donation at allocator guard + */ + void upgrade_ram_quota(size_t ram_quota) { _md_alloc.upgrade(ram_quota); } + /*************************** ** CPU session interface ** diff --git a/base/include/base/platform_env.h b/base/include/base/platform_env.h index ad1d2b188..69d992ac1 100644 --- a/base/include/base/platform_env.h +++ b/base/include/base/platform_env.h @@ -125,6 +125,36 @@ namespace Genode { } }; + class Expanding_cpu_session_client : public Cpu_session_client + { + Cpu_session_capability _cap; + + public: + + Expanding_cpu_session_client(Cpu_session_capability cap) + : Cpu_session_client(cap), _cap(cap) { } + + Thread_capability create_thread(Name const &name, addr_t utcb) { + bool try_again = false; + do { + try { + return Cpu_session_client::create_thread(name, utcb); + } catch (Cpu_session::Out_of_metadata) { + + /* give up if the error occurred a second time */ + if (try_again) + break; + + PINF("upgrade quota donation for Env::CPU session"); + env()->parent()->upgrade(_cap, "ram_quota=8K"); + try_again = true; + } + } while (try_again); + + return Thread_capability(); + } + }; + private: Parent_client _parent_client; @@ -134,7 +164,7 @@ namespace Genode { Ram_session_capability ram_cap; Expanding_ram_session_client ram; Cpu_session_capability cpu_cap; - Cpu_session_client cpu; + Expanding_cpu_session_client cpu; Expanding_rm_session_client rm; Pd_session_client pd; diff --git a/base/include/cpu_session/cpu_session.h b/base/include/cpu_session/cpu_session.h index 3d9bdec79..98316c181 100644 --- a/base/include/cpu_session/cpu_session.h +++ b/base/include/cpu_session/cpu_session.h @@ -49,6 +49,7 @@ namespace Genode { class Thread_creation_failed : public Exception { }; class State_access_failed : public Exception { }; + class Out_of_metadata : public Exception { }; static const char *service_name() { return "CPU"; } @@ -67,6 +68,7 @@ namespace Genode { * \param utcb Base of the UTCB that will be used by the thread * \return capability representing the new thread * \throw Thread_creation_failed + * \throw Out_of_metadata */ virtual Thread_capability create_thread(Name const &name, addr_t utcb = 0) = 0; @@ -208,7 +210,7 @@ namespace Genode { *********************/ GENODE_RPC_THROW(Rpc_create_thread, Thread_capability, create_thread, - GENODE_TYPE_LIST(Thread_creation_failed), + GENODE_TYPE_LIST(Thread_creation_failed, Out_of_metadata), Name const &, addr_t); GENODE_RPC(Rpc_utcb, Ram_dataspace_capability, utcb, Thread_capability); GENODE_RPC(Rpc_kill_thread, void, kill_thread, Thread_capability); diff --git a/base/src/core/cpu_session_component.cc b/base/src/core/cpu_session_component.cc index 74bfdfdf3..fd42a48be 100644 --- a/base/src/core/cpu_session_component.cc +++ b/base/src/core/cpu_session_component.cc @@ -36,7 +36,7 @@ Thread_capability Cpu_session_component::create_thread(Name const &name, thread = new(&_thread_alloc) Cpu_thread_component(name.string(), _priority, utcb); } catch (Allocator::Out_of_memory) { - throw Thread_creation_failed(); + throw Out_of_metadata(); } _thread_list.insert(thread); diff --git a/base/src/core/include/cpu_root.h b/base/src/core/include/cpu_root.h index df7864bc8..9ac67f2a0 100644 --- a/base/src/core/include/cpu_root.h +++ b/base/src/core/include/cpu_root.h @@ -36,6 +36,12 @@ namespace Genode { return new (md_alloc()) Cpu_session_component(_thread_ep, _pager_ep, _md_alloc, args); } + void _upgrade_session(Cpu_session_component *cpu, const char *args) + { + size_t ram_quota = Arg_string::find_arg(args, "ram_quota").long_value(0); + cpu->upgrade_ram_quota(ram_quota); + } + public: /** diff --git a/base/src/core/include/cpu_session_component.h b/base/src/core/include/cpu_session_component.h index f2c1617a9..dc9c982be 100644 --- a/base/src/core/include/cpu_session_component.h +++ b/base/src/core/include/cpu_session_component.h @@ -116,6 +116,11 @@ namespace Genode { */ ~Cpu_session_component(); + /** + * Register quota donation at allocator guard + */ + void upgrade_ram_quota(size_t ram_quota) { _md_alloc.upgrade(ram_quota); } + /*************************** ** CPU session interface **