From 195be5ff6ea33c8912352c1083ff166237c4f66a Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Tue, 29 Nov 2022 12:21:02 +0100 Subject: [PATCH] core: Export interface for explicit thread migration and pinning. --- repos/base/include/base/thread.h | 2 ++ repos/base/include/cpu_session/client.h | 3 +++ repos/base/include/cpu_session/cpu_session.h | 12 +++++++++++- repos/base/src/core/cpu_session_component.cc | 6 ++++++ repos/base/src/core/include/cpu_session_component.h | 1 + 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/repos/base/include/base/thread.h b/repos/base/include/base/thread.h index 23c85e88c3..8604d2c2e4 100644 --- a/repos/base/include/base/thread.h +++ b/repos/base/include/base/thread.h @@ -429,6 +429,8 @@ class Genode::Thread * Thread affinity */ Affinity::Location affinity() const { return _affinity; } + + void pin(Affinity::Location &loc); }; #endif /* _INCLUDE__BASE__THREAD_H_ */ diff --git a/repos/base/include/cpu_session/client.h b/repos/base/include/cpu_session/client.h index e677d64ef5..60e65f801b 100644 --- a/repos/base/include/cpu_session/client.h +++ b/repos/base/include/cpu_session/client.h @@ -33,6 +33,9 @@ struct Genode::Cpu_session_client : Rpc_client void kill_thread(Thread_capability thread) override { call(thread); } + void migrate_thread(Thread_capability thread, Affinity::Location loc) override { + call(thread, loc); } + void exception_sigh(Signal_context_capability sigh) override { call(sigh); } diff --git a/repos/base/include/cpu_session/cpu_session.h b/repos/base/include/cpu_session/cpu_session.h index 67389f49e1..6297d5eadf 100644 --- a/repos/base/include/cpu_session/cpu_session.h +++ b/repos/base/include/cpu_session/cpu_session.h @@ -21,6 +21,7 @@ #include #include #include +#include namespace Genode { @@ -109,6 +110,14 @@ struct Genode::Cpu_session : Session */ virtual void kill_thread(Thread_capability thread) = 0; + /** + * Migrate a thread to a new location + * + * \param thread capability of the thread to migrate + * \param loc component-local location to migrate the thread to + */ + virtual void migrate_thread(Thread_capability thread, Genode::Affinity::Location loc) = 0; + /** * Register default signal handler for exceptions * @@ -237,6 +246,7 @@ struct Genode::Cpu_session : Session Capability, Name const &, Affinity::Location, Weight, addr_t); GENODE_RPC(Rpc_kill_thread, void, kill_thread, Thread_capability); + GENODE_RPC(Rpc_migrate_thread, void, migrate_thread, Thread_capability, Affinity::Location); GENODE_RPC(Rpc_exception_sigh, void, exception_sigh, Signal_context_capability); GENODE_RPC(Rpc_affinity_space, Affinity::Space, affinity_space); GENODE_RPC(Rpc_trace_control, Dataspace_capability, trace_control); @@ -247,7 +257,7 @@ struct Genode::Cpu_session : Session GENODE_RPC_INTERFACE(Rpc_create_thread, Rpc_kill_thread, Rpc_exception_sigh, Rpc_affinity_space, Rpc_trace_control, Rpc_ref_account, - Rpc_transfer_quota, Rpc_quota, Rpc_native_cpu); + Rpc_transfer_quota, Rpc_quota, Rpc_native_cpu, Rpc_migrate_thread); }; diff --git a/repos/base/src/core/cpu_session_component.cc b/repos/base/src/core/cpu_session_component.cc index 959e1ab113..760cacbb87 100644 --- a/repos/base/src/core/cpu_session_component.cc +++ b/repos/base/src/core/cpu_session_component.cc @@ -16,6 +16,7 @@ /* Genode includes */ #include #include +#include /* core includes */ #include @@ -23,6 +24,7 @@ #include #include + using namespace Genode; @@ -144,6 +146,10 @@ void Cpu_session_component::kill_thread(Thread_capability thread_cap) } } +void Cpu_session_component::migrate_thread(Thread_capability thread_cap, Affinity::Location loc) +{ + _thread_ep.apply(thread_cap, [&] (Cpu_thread_component *t) { t->affinity(_thread_affinity(loc)); }); +} void Cpu_session_component::exception_sigh(Signal_context_capability sigh) { diff --git a/repos/base/src/core/include/cpu_session_component.h b/repos/base/src/core/include/cpu_session_component.h index 328a498911..1b904ab3bf 100644 --- a/repos/base/src/core/include/cpu_session_component.h +++ b/repos/base/src/core/include/cpu_session_component.h @@ -169,6 +169,7 @@ class Genode::Cpu_session_component : public Session_object, Thread_capability create_thread(Capability, Name const &, Affinity::Location, Weight, addr_t) override; void kill_thread(Thread_capability) override; + void migrate_thread(Thread_capability, Affinity::Location) override; void exception_sigh(Signal_context_capability) override; Affinity::Space affinity_space() const override; Dataspace_capability trace_control() override;