From 79fba6c2ac2478addc35b65e48ff1e70695a6981 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Fri, 31 Jan 2020 15:50:34 +0100 Subject: [PATCH] core: add kernel-specific UTCB quota bookkeeping Fix #859 --- repos/base-hw/src/core/cpu_session_support.cc | 7 +++++ .../base-pistachio/lib/mk/core-pistachio.inc | 2 +- .../src/core/cpu_session_platform.cc | 26 ------------------- repos/base/src/core/cpu_session_component.cc | 6 +++++ repos/base/src/core/cpu_session_support.cc | 3 +++ .../src/core/include/cpu_session_component.h | 5 ++++ 6 files changed, 22 insertions(+), 27 deletions(-) delete mode 100644 repos/base-pistachio/src/core/cpu_session_platform.cc diff --git a/repos/base-hw/src/core/cpu_session_support.cc b/repos/base-hw/src/core/cpu_session_support.cc index d39cf864d..caf2257c5 100644 --- a/repos/base-hw/src/core/cpu_session_support.cc +++ b/repos/base-hw/src/core/cpu_session_support.cc @@ -18,6 +18,9 @@ #include #include +/* base-internal includes */ +#include + using namespace Genode; @@ -33,3 +36,7 @@ Cpu_session::Quota Cpu_session_component::quota() size_t const u = quota_lim_downscale(_quota, spu); return { spu, u }; } + + +size_t Cpu_session_component::_utcb_quota_size() { + return sizeof(Native_utcb); } diff --git a/repos/base-pistachio/lib/mk/core-pistachio.inc b/repos/base-pistachio/lib/mk/core-pistachio.inc index 85c0c3fbf..5add470f6 100644 --- a/repos/base-pistachio/lib/mk/core-pistachio.inc +++ b/repos/base-pistachio/lib/mk/core-pistachio.inc @@ -9,7 +9,7 @@ SRC_CC = stack_area.cc \ core_rpc_cap_alloc.cc \ core_region_map.cc \ cpu_session_component.cc \ - cpu_session_platform.cc \ + cpu_session_support.cc \ cpu_thread_component.cc \ capability_space.cc \ dataspace_component.cc \ diff --git a/repos/base-pistachio/src/core/cpu_session_platform.cc b/repos/base-pistachio/src/core/cpu_session_platform.cc deleted file mode 100644 index 4aafd7502..000000000 --- a/repos/base-pistachio/src/core/cpu_session_platform.cc +++ /dev/null @@ -1,26 +0,0 @@ -/* - * \brief Platform-specific parts of the core CPU session interface - * \author Martin Stein - * \date 2012-04-17 - */ - -/* - * Copyright (C) 2009-2017 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU Affero General Public License version 3. - */ - -/* Genode includes */ -#include - -using namespace Genode; - - -Dataspace_capability Cpu_thread_component::utcb() -{ - return Dataspace_capability(); -} - - -Cpu_session::Quota Cpu_session_component::quota() { return Quota(); } diff --git a/repos/base/src/core/cpu_session_component.cc b/repos/base/src/core/cpu_session_component.cc index f2ad0ce3f..2ea820937 100644 --- a/repos/base/src/core/cpu_session_component.cc +++ b/repos/base/src/core/cpu_session_component.cc @@ -34,6 +34,10 @@ Thread_capability Cpu_session_component::create_thread(Capability pd { Trace::Thread_name thread_name(name.string()); + if (!_md_alloc.withdraw(_utcb_quota_size())) { + throw Out_of_ram(); + } + Cpu_thread_component *thread = 0; if (weight.value == 0) { @@ -121,6 +125,8 @@ void Cpu_session_component::_unsynchronized_kill_thread(Thread_capability thread Lock::Guard lock_guard(_thread_alloc_lock); destroy(&_thread_alloc, thread); } + + _md_alloc.upgrade(_utcb_quota_size()); } diff --git a/repos/base/src/core/cpu_session_support.cc b/repos/base/src/core/cpu_session_support.cc index 641f69f7e..66f6523b8 100644 --- a/repos/base/src/core/cpu_session_support.cc +++ b/repos/base/src/core/cpu_session_support.cc @@ -28,3 +28,6 @@ Dataspace_capability Cpu_thread_component::utcb() Cpu_session::Quota Cpu_session_component::quota() { return Quota(); } + + +size_t Cpu_session_component::_utcb_quota_size() { return 0; } diff --git a/repos/base/src/core/include/cpu_session_component.h b/repos/base/src/core/include/cpu_session_component.h index 57c9d4c04..c8e959686 100644 --- a/repos/base/src/core/include/cpu_session_component.h +++ b/repos/base/src/core/include/cpu_session_component.h @@ -128,6 +128,11 @@ class Genode::Cpu_session_component : public Rpc_object, */ Affinity::Location _thread_affinity(Affinity::Location) const; + /** + * Return the UTCB quota size that needs to be accounted per thread + */ + size_t _utcb_quota_size(); + /* * Noncopyable */