From c89715f905f2e0d7bda3eefe29a6b333c2b337c3 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Tue, 11 Oct 2022 18:00:47 +0200 Subject: [PATCH] Make Topology service part of a component's environment, just like CPU. --- repos/base/include/base/child.h | 3 ++ repos/base/include/base/env.h | 13 +++++ repos/base/include/deprecated/env.h | 5 ++ repos/base/include/parent/parent.h | 3 +- repos/base/src/core/include/core_env.h | 3 ++ .../internal/expanding_topo_session_client.h | 51 +++++++++++++++++++ .../src/include/base/internal/platform_env.h | 7 ++- repos/base/src/lib/base/component.cc | 7 +++ .../base/src/lib/base/env_session_id_space.cc | 3 +- 9 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 repos/base/src/include/base/internal/expanding_topo_session_client.h diff --git a/repos/base/include/base/child.h b/repos/base/include/base/child.h index d38a3d75bd..403be1d9e9 100644 --- a/repos/base/include/base/child.h +++ b/repos/base/include/base/child.h @@ -26,6 +26,7 @@ #include #include #include +#include #include namespace Genode { @@ -609,6 +610,7 @@ class Genode::Child : protected Rpc_object, Env_connection _cpu { *this, Env::cpu(), _policy.name() }; Env_connection _log { *this, Env::log(), _policy.name() }; Env_connection _binary { *this, Env::binary(), _policy.binary_name() }; + Env_connection _topo { *this, Env::topo(), _policy.name() }; Constructible > _linker { }; @@ -761,6 +763,7 @@ class Genode::Child : protected Rpc_object, Ram_allocator &ram() { return _pd.session(); } Ram_allocator const &ram() const { return _pd.session(); } Cpu_session &cpu() { return _cpu.session(); } + Topo_session &topo() { return _topo.session(); } Pd_session &pd() { return _pd.session(); } Pd_session const &pd() const { return _pd.session(); } diff --git a/repos/base/include/base/env.h b/repos/base/include/base/env.h index 57842dad8b..3425abbe67 100644 --- a/repos/base/include/base/env.h +++ b/repos/base/include/base/env.h @@ -18,6 +18,7 @@ #include #include #include +#include namespace Genode { struct Env; } @@ -48,6 +49,12 @@ struct Genode::Env : Interface */ Ram_allocator &ram() { return pd(); } + /** + * @brief Topology model + * + */ + virtual Topo_session &topo() = 0; + /** * Entrypoint for handling RPC requests and signals */ @@ -63,6 +70,12 @@ struct Genode::Env : Interface */ virtual Pd_session_capability pd_session_cap() = 0; + /** + * @brief Return the Topo-session capability + * + */ + virtual Topo_session_capability topo_session_cap() = 0; + /** * ID space of sessions obtained from the parent */ diff --git a/repos/base/include/deprecated/env.h b/repos/base/include/deprecated/env.h index 4164e40c2c..5a76a0a8cb 100644 --- a/repos/base/include/deprecated/env.h +++ b/repos/base/include/deprecated/env.h @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include #include #include @@ -87,6 +89,9 @@ struct Genode::Env_deprecated : Interface */ virtual Pd_session *pd_session() = 0; virtual Pd_session_capability pd_session_cap() = 0; + + virtual Topo_session *topo_session() = 0; + virtual Topo_session_capability topo_session_cap() = 0; }; #endif /* _INCLUDE__DEPRECATED__ENV_H_ */ diff --git a/repos/base/include/parent/parent.h b/repos/base/include/parent/parent.h index 7379342e5b..2bc99ce6c6 100644 --- a/repos/base/include/parent/parent.h +++ b/repos/base/include/parent/parent.h @@ -71,7 +71,8 @@ class Genode::Parent static Client::Id log() { return { 3 }; } static Client::Id binary() { return { 4 }; } static Client::Id linker() { return { 5 }; } - static Client::Id last() { return { 5 }; } + static Client::Id topo() { return { 6 }; } + static Client::Id last() { return { 6 }; } /** * True if session ID refers to an environment session diff --git a/repos/base/src/core/include/core_env.h b/repos/base/src/core/include/core_env.h index 9f7278ed9d..8b52ec1661 100644 --- a/repos/base/src/core/include/core_env.h +++ b/repos/base/src/core/include/core_env.h @@ -18,6 +18,7 @@ /* Genode includes */ #include #include +#include /* base-internal includes */ #include @@ -98,6 +99,8 @@ class Genode::Core_env : public Env_deprecated, Noncopyable Pd_session *pd_session() override { return &_pd_session; } Cpu_session *cpu_session() override { ASSERT_NEVER_CALLED; } Cpu_session_capability cpu_session_cap() override { ASSERT_NEVER_CALLED; } + Topo_session *topo_session() override { ASSERT_NEVER_CALLED; } + Topo_session_capability topo_session_cap() override { ASSERT_NEVER_CALLED; } Pd_session_capability pd_session_cap() override { return _pd_session.cap(); } }; diff --git a/repos/base/src/include/base/internal/expanding_topo_session_client.h b/repos/base/src/include/base/internal/expanding_topo_session_client.h new file mode 100644 index 0000000000..6dce83d90d --- /dev/null +++ b/repos/base/src/include/base/internal/expanding_topo_session_client.h @@ -0,0 +1,51 @@ +/* + * \brief Topology session client that upgrades its session quota on demand + * \author Michael Müller + * \date 2022-10-06 + * + * A topology session stores the component's view on the hardware topology, i.e. it's location within the NUMA topology. + */ + +/* + * Copyright (C) 2022 Michael Müller + * + * This file is part of EalánOS which is based on the Genode OS framework + * released under the terms of the GNU Affero General Public License version 3. + */ + +#pragma once + +#include +#include + +#include + +namespace Genode { + struct Expanding_topo_session_client; +} + +struct Genode::Expanding_topo_session_client : Upgradeable_client +{ + Expanding_topo_session_client(Parent &parent, Genode::Topo_session_capability cap, Parent::Client::Id id) + : + Upgradeable_client + (parent, static_cap_cast(cap), id) + { } + + Node *node_affinity_of(Affinity::Location &loc) override + { + return retry( + [&]() + { + return retry( + [&]() + { + return Topo_session_client::node_affinity_of(loc); + }, + [&]() + { upgrade_caps(2); }); + }, + [&]() + { upgrade_ram(8 * 1024); }); + } +}; \ No newline at end of file diff --git a/repos/base/src/include/base/internal/platform_env.h b/repos/base/src/include/base/internal/platform_env.h index a4919ff640..5d8d3ad06c 100644 --- a/repos/base/src/include/base/internal/platform_env.h +++ b/repos/base/src/include/base/internal/platform_env.h @@ -34,6 +34,7 @@ #include #include #include +#include namespace Genode { @@ -60,13 +61,15 @@ class Genode::Platform_env : public Platform_env_base Expanding_pd_session_client pd; Expanding_cpu_session_client cpu; Expanding_region_map_client rm; + Expanding_topo_session_client topo; Resources(Parent &parent) : pd (parent, request (parent, Parent::Env::pd())), cpu(parent, request(parent, Parent::Env::cpu()), Parent::Env::cpu()), - rm(parent, pd.rpc_cap(), pd.address_space(), Parent::Env::pd()) + rm(parent, pd.rpc_cap(), pd.address_space(), Parent::Env::pd()), + topo(parent, request(parent, Parent::Env::topo()), Parent::Env::topo()) { } }; @@ -107,6 +110,8 @@ class Genode::Platform_env : public Platform_env_base Pd_session *pd_session() override { return &_resources.pd; } Pd_session_capability pd_session_cap() override { return _resources.pd.rpc_cap(); } Region_map *rm_session() override { return &_resources.rm; } + Topo_session *topo_session() override { return &_resources.topo; } + Topo_session_capability topo_session_cap() override { return _resources.topo.rpc_cap(); } }; #endif /* _INCLUDE__BASE__INTERNAL__PLATFORM_ENV_H_ */ diff --git a/repos/base/src/lib/base/component.cc b/repos/base/src/lib/base/component.cc index 82b8642ca7..622690e9a4 100644 --- a/repos/base/src/lib/base/component.cc +++ b/repos/base/src/lib/base/component.cc @@ -22,6 +22,7 @@ /* base-internal includes */ #include +#include /* * XXX remove this pointer once 'Env_deprecated' is removed @@ -78,6 +79,7 @@ namespace { Genode::Region_map &rm() override { return *Genode::env_deprecated()->rm_session(); } Genode::Pd_session &pd() override { return *Genode::env_deprecated()->pd_session(); } Genode::Entrypoint &ep() override { return _ep; } + Genode::Topo_session &topo() override { return *Genode::env_deprecated()->topo_session(); } Genode::Cpu_session_capability cpu_session_cap() override { @@ -94,6 +96,11 @@ namespace { return Genode::env_session_id_space(); } + Genode::Topo_session_capability topo_session_cap() override + { + return Genode::env_deprecated()->topo_session_cap(); + } + void _block_for_session() { /* diff --git a/repos/base/src/lib/base/env_session_id_space.cc b/repos/base/src/lib/base/env_session_id_space.cc index dca120f1bc..ea893ab02a 100644 --- a/repos/base/src/lib/base/env_session_id_space.cc +++ b/repos/base/src/lib/base/env_session_id_space.cc @@ -34,7 +34,8 @@ Id_space &Genode::env_session_id_space() cpu { dummy, id_space, Parent::Env::cpu() }, log { dummy, id_space, Parent::Env::log() }, binary { dummy, id_space, Parent::Env::binary() }, - linker { dummy, id_space, Parent::Env::linker() }; + linker { dummy, id_space, Parent::Env::linker() }, + topo { dummy, id_space, Parent::Env::topo() }; return id_space; }