From 6d837c9e2628fffa4f6df05ae1b9aa60c3382525 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Wed, 7 Aug 2013 23:10:28 +0200 Subject: [PATCH] Attach affinity information to session requests This patch extends the 'Parent::session()' and 'Root::session()' functions with an additional 'affinity' parameter, which is inteded to express the preferred affinity of the new session. For CPU sessions provided by core, the values will be used to select the set of CPUs assigned to the CPU session. For other services, the session affinity information can be utilized to optimize the locality of the server thread with the client. For example, to enable the IRQ session to route an IRQ to the CPU core on which the corresponding device driver (the IRQ client) is running. --- base-linux/src/base/env/platform_env.cc | 7 ++++--- base-linux/src/base/env/platform_env.h | 3 ++- base/include/base/affinity.h | 2 ++ base/include/base/child.h | 3 ++- base/include/base/service.h | 18 +++++++++-------- base/include/parent/client.h | 5 +++-- base/include/parent/parent.h | 17 ++++++++++------ base/include/root/client.h | 4 ++-- base/include/root/component.h | 20 ++++++++++++++++--- base/include/root/root.h | 6 ++++-- base/src/base/child/child.cc | 5 +++-- base/src/core/include/core_parent.h | 3 ++- base/src/core/include/irq_root.h | 2 +- base/src/core/include/rm_root.h | 4 ++-- base/src/core/main.cc | 7 ++++--- dde_ipxe/src/drivers/nic_stat/main.cc | 3 ++- gems/src/server/d3m/block_service.h | 14 ++++++++----- gems/src/server/d3m/input_service.h | 3 ++- gems/src/server/d3m/nic_service.h | 6 ++++-- os/include/init/child.h | 5 +++-- os/include/init/child_policy.h | 3 ++- os/include/os/child_policy_dynamic_rom.h | 4 +++- os/include/os/static_root.h | 2 +- os/src/drivers/acpi/main.cc | 12 +++++++---- os/src/drivers/pci/main.cc | 2 +- os/src/server/loader/child.h | 2 +- os/src/server/loader/main.cc | 18 ++++++++++------- .../server/terminal_crosslink/terminal_root.h | 3 ++- ports/src/app/gdb_monitor/app_child.h | 14 +++++++------ ports/src/app/gdb_monitor/rom.h | 4 ++-- ports/src/noux/local_cpu_service.h | 2 +- ports/src/noux/local_noux_service.h | 6 +++++- ports/src/noux/local_ram_service.h | 2 +- ports/src/noux/local_rm_service.h | 2 +- ports/src/noux/local_rom_service.h | 2 +- 35 files changed, 137 insertions(+), 78 deletions(-) diff --git a/base-linux/src/base/env/platform_env.cc b/base-linux/src/base/env/platform_env.cc index b6aa58768..a40df1b6b 100644 --- a/base-linux/src/base/env/platform_env.cc +++ b/base-linux/src/base/env/platform_env.cc @@ -56,7 +56,8 @@ Platform_env_base::Rm_session_mmap::_dataspace_writable(Dataspace_capability ds) Session_capability Platform_env::Local_parent::session(Service_name const &service_name, - Session_args const &args) + Session_args const &args, + Affinity const &affinity) { if (strcmp(service_name.string(), Rm_session::service_name()) == 0) @@ -66,7 +67,7 @@ Platform_env::Local_parent::session(Service_name const &service_name, .ulong_value(~0); if (size == 0) - return Parent_client::session(service_name, args); + return Parent_client::session(service_name, args, affinity); Rm_session_mmap *rm = new (env()->heap()) Rm_session_mmap(true, size); @@ -74,7 +75,7 @@ Platform_env::Local_parent::session(Service_name const &service_name, return Session_capability::local_cap(rm); } - return Parent_client::session(service_name, args); + return Parent_client::session(service_name, args, affinity); } diff --git a/base-linux/src/base/env/platform_env.h b/base-linux/src/base/env/platform_env.h index a28a0d74f..a84ff9d9b 100644 --- a/base-linux/src/base/env/platform_env.h +++ b/base-linux/src/base/env/platform_env.h @@ -387,7 +387,8 @@ namespace Genode { **********************/ Session_capability session(Service_name const &, - Session_args const &); + Session_args const &, + Affinity const & = Affinity()); void close(Session_capability); /** diff --git a/base/include/base/affinity.h b/base/include/base/affinity.h index 19014029e..1f95f935c 100644 --- a/base/include/base/affinity.h +++ b/base/include/base/affinity.h @@ -117,6 +117,8 @@ namespace Genode { Space _space; Location _location; + public: + Affinity(Space const &space, Location const &location) : _space(space), _location(location) { } diff --git a/base/include/base/child.h b/base/include/base/child.h index e8ea04268..37479e35d 100644 --- a/base/include/base/child.h +++ b/base/include/base/child.h @@ -269,7 +269,8 @@ namespace Genode { **********************/ void announce(Service_name const &, Root_capability); - Session_capability session(Service_name const &, Session_args const &); + Session_capability session(Service_name const &, Session_args const &, + Affinity const &); void upgrade(Session_capability, Upgrade_args const &); void close(Session_capability); void exit(int); diff --git a/base/include/base/service.h b/base/include/base/service.h index e5ddadcd0..32ca62877 100644 --- a/base/include/base/service.h +++ b/base/include/base/service.h @@ -126,13 +126,15 @@ namespace Genode { /** * Create session * - * \param args session-construction arguments + * \param args session-construction arguments + * \param affinity preferred CPU affinity of session * * \throw Invalid_args * \throw Unavailable * \throw Quota_exceeded */ - virtual Session_capability session(const char *args) = 0; + virtual Session_capability session(char const *args, + Affinity const &affinity) = 0; /** * Extend resource donation to an existing session @@ -175,9 +177,9 @@ namespace Genode { Local_service(const char *name, Root *root) : Service(name), _root(root) { } - Session_capability session(const char *args) + Session_capability session(const char *args, Affinity const &affinity) { - try { return _root->session(args); } + try { return _root->session(args, affinity); } catch (Root::Invalid_args) { throw Invalid_args(); } catch (Root::Unavailable) { throw Unavailable(); } catch (Root::Quota_exceeded) { throw Quota_exceeded(); } @@ -200,9 +202,9 @@ namespace Genode { Parent_service(const char *name) : Service(name) { } - Session_capability session(const char *args) + Session_capability session(const char *args, Affinity const &affinity) { - try { return env()->parent()->session(name(), args); } + try { return env()->parent()->session(name(), args, affinity); } catch (Parent::Unavailable) { PWRN("parent has no service \"%s\"", name()); throw Unavailable(); @@ -245,12 +247,12 @@ namespace Genode { Server *server() const { return _server; } - Session_capability session(const char *args) + Session_capability session(const char *args, Affinity const &affinity) { if (!_root_cap.valid()) throw Unavailable(); - try { return _root.session(args); } + try { return _root.session(args, affinity); } catch (Root::Invalid_args) { throw Invalid_args(); } catch (Root::Unavailable) { throw Unavailable(); } catch (Root::Quota_exceeded) { throw Quota_exceeded(); } diff --git a/base/include/parent/client.h b/base/include/parent/client.h index 44b2ea1b8..cfc53ec2d 100644 --- a/base/include/parent/client.h +++ b/base/include/parent/client.h @@ -30,8 +30,9 @@ namespace Genode { call(service, root); } Session_capability session(Service_name const &service, - Session_args const &args) { - return call(service, args); } + Session_args const &args, + Affinity const &affinity) { + return call(service, args, affinity); } void upgrade(Session_capability to_session, Upgrade_args const &args) { call(to_session, args); } diff --git a/base/include/parent/parent.h b/base/include/parent/parent.h index 2850488fb..448693c32 100644 --- a/base/include/parent/parent.h +++ b/base/include/parent/parent.h @@ -107,6 +107,7 @@ namespace Genode { * * \param service_name name of the requested interface * \param args session constructor arguments + * \param affinity preferred CPU affinity for the session * * \throw Service_denied parent denies session request * \throw Quota_exceeded our own quota does not suffice for @@ -119,13 +120,15 @@ namespace Genode { * 'session()' template instead. */ virtual Session_capability session(Service_name const &service_name, - Session_args const &args) = 0; + Session_args const &args, + Affinity const &affinity = Affinity()) = 0; /** * Create session to a service * - * \param SESSION_TYPE session interface type - * \param args session constructor arguments + * \param SESSION_TYPE session interface type + * \param args session constructor arguments + * \param affinity preferred CPU affinity for the session * * \throw Service_denied parent denies session request * \throw Quota_exceeded our own quota does not suffice for @@ -135,9 +138,11 @@ namespace Genode { * \return capability to new session */ template - Capability session(Session_args const &args) + Capability session(Session_args const &args, + Affinity const &affinity = Affinity()) { - Session_capability cap = session(SESSION_TYPE::service_name(), args); + Session_capability cap = session(SESSION_TYPE::service_name(), + args, affinity); return reinterpret_cap_cast(cap); } @@ -176,7 +181,7 @@ namespace Genode { Service_name const &, Root_capability); GENODE_RPC_THROW(Rpc_session, Session_capability, session, GENODE_TYPE_LIST(Service_denied, Quota_exceeded, Unavailable), - Service_name const &, Session_args const &); + Service_name const &, Session_args const &, Affinity const &); GENODE_RPC_THROW(Rpc_upgrade, void, upgrade, GENODE_TYPE_LIST(Quota_exceeded), Session_capability, Upgrade_args const &); diff --git a/base/include/root/client.h b/base/include/root/client.h index fbb5ac5c6..96b02ee85 100644 --- a/base/include/root/client.h +++ b/base/include/root/client.h @@ -24,8 +24,8 @@ namespace Genode { explicit Root_client(Root_capability root) : Rpc_client(root) { } - Session_capability session(Session_args const &args) { - return call(args); } + Session_capability session(Session_args const &args, Affinity const &affinity) { + return call(args, affinity); } void upgrade(Session_capability session, Upgrade_args const &args) { call(session, args); } diff --git a/base/include/root/component.h b/base/include/root/component.h index bd33d2889..7706689bf 100644 --- a/base/include/root/component.h +++ b/base/include/root/component.h @@ -120,12 +120,25 @@ namespace Genode { * by 'Root_component' must be used for allocating the session * object. * + * If the server implementation does not evaluate the session + * affinity, it suffices to override the overload without the + * affinity argument. + * * \throw Allocator::Out_of_memory typically caused by the * meta-data allocator * \throw Root::Invalid_args typically caused by the * session-component constructor */ - virtual SESSION_TYPE *_create_session(const char *args) = 0; + virtual SESSION_TYPE *_create_session(const char *args, + Affinity const &) + { + return _create_session(args); + } + + virtual SESSION_TYPE *_create_session(const char *args) + { + throw Root::Invalid_args(); + } /** * Inform session about a quota upgrade @@ -175,7 +188,8 @@ namespace Genode { ** Root interface ** ********************/ - Session_capability session(Root::Session_args const &args) + Session_capability session(Root::Session_args const &args, + Affinity const &affinity) { if (!args.is_valid_string()) throw Root::Invalid_args(); @@ -213,7 +227,7 @@ namespace Genode { "ram_quota", ram_quota_buf); SESSION_TYPE *s = 0; - try { s = _create_session(adjusted_args); } + try { s = _create_session(adjusted_args, affinity); } catch (Allocator::Out_of_memory) { throw Root::Quota_exceeded(); } return _ep->manage(s); diff --git a/base/include/root/root.h b/base/include/root/root.h index 5e67594cf..f11bf77c4 100644 --- a/base/include/root/root.h +++ b/base/include/root/root.h @@ -17,6 +17,7 @@ #include #include #include +#include #include namespace Genode { @@ -46,7 +47,8 @@ namespace Genode { * * \return capability to new session */ - virtual Session_capability session(Session_args const &args) = 0; + virtual Session_capability session(Session_args const &args, + Affinity const &affinity) = 0; /** * Extend resource donation to an existing session @@ -65,7 +67,7 @@ namespace Genode { GENODE_RPC_THROW(Rpc_session, Session_capability, session, GENODE_TYPE_LIST(Unavailable, Quota_exceeded, Invalid_args), - Session_args const &); + Session_args const &, Affinity const &); GENODE_RPC_THROW(Rpc_upgrade, void, upgrade, GENODE_TYPE_LIST(Invalid_args), Session_capability, Upgrade_args const &); diff --git a/base/src/base/child/child.cc b/base/src/base/child/child.cc index e2dffd295..ed8d3a12b 100644 --- a/base/src/base/child/child.cc +++ b/base/src/base/child/child.cc @@ -242,7 +242,8 @@ void Child::announce(Parent::Service_name const &name, Root_capability root) Session_capability Child::session(Parent::Service_name const &name, - Parent::Session_args const &args) + Parent::Session_args const &args, + Affinity const &affinity) { if (!name.is_valid_string() || !args.is_valid_string()) throw Unavailable(); @@ -273,7 +274,7 @@ Session_capability Child::session(Parent::Service_name const &name, /* create session */ Session_capability cap; - try { cap = service->session(_args); } + try { cap = service->session(_args, affinity); } catch (Service::Invalid_args) { throw Service_denied(); } catch (Service::Unavailable) { throw Service_denied(); } catch (Service::Quota_exceeded) { throw Quota_exceeded(); } diff --git a/base/src/core/include/core_parent.h b/base/src/core/include/core_parent.h index f7e7a2fcc..4c0dadb86 100644 --- a/base/src/core/include/core_parent.h +++ b/base/src/core/include/core_parent.h @@ -45,7 +45,8 @@ namespace Genode { PDBG("implement me, please"); } - Session_capability session(Service_name const &, Session_args const &); + Session_capability session(Service_name const &, Session_args const &, + Affinity const &); void upgrade(Session_capability, Upgrade_args const &) { diff --git a/base/src/core/include/irq_root.h b/base/src/core/include/irq_root.h index e9bd3a5c8..c75ddaea0 100644 --- a/base/src/core/include/irq_root.h +++ b/base/src/core/include/irq_root.h @@ -56,7 +56,7 @@ namespace Genode { ** Root interface ** ********************/ - Session_capability session(Session_args const &args) + Session_capability session(Session_args const &args, Affinity const &affinity) { if (!args.is_valid_string()) throw Invalid_args(); diff --git a/base/src/core/include/rm_root.h b/base/src/core/include/rm_root.h index fa854ae69..edb7afc00 100644 --- a/base/src/core/include/rm_root.h +++ b/base/src/core/include/rm_root.h @@ -56,9 +56,9 @@ namespace Genode { size == 0 ? _vm_size : size); } - Session_capability session(Root::Session_args const &args) + Session_capability session(Root::Session_args const &args, Affinity const &affinity) { - Session_capability cap = Root_component::session(args); + Session_capability cap = Root_component::session(args, affinity); /* lookup rm_session_component object */ Object_pool::Guard rm_session(ep()->lookup_and_lock(cap)); diff --git a/base/src/core/main.cc b/base/src/core/main.cc index 0c314bb7b..4bb5ae7a5 100644 --- a/base/src/core/main.cc +++ b/base/src/core/main.cc @@ -84,12 +84,13 @@ Platform_generic *Genode::platform() { return platform_specific(); } *************************/ Session_capability Core_parent::session(Parent::Service_name const &name, - Parent::Session_args const &args) + Parent::Session_args const &args, + Affinity const &affinity) { Service *service = local_services.find(name.string()); if (service) - return service->session(args.string()); + return service->session(args.string(), affinity); PWRN("service_name=\"%s\" arg=\"%s\" not handled", name.string(), args.string()); return Session_capability(); @@ -235,7 +236,7 @@ int main() /* create ram session for init and transfer some of our own quota */ Ram_session_capability init_ram_session_cap - = static_cap_cast(ram_root.session("ram_quota=32K")); + = static_cap_cast(ram_root.session("ram_quota=32K", Affinity())); Ram_session_client(init_ram_session_cap).ref_account(env()->ram_session_cap()); Cpu_connection init_cpu("init"); diff --git a/dde_ipxe/src/drivers/nic_stat/main.cc b/dde_ipxe/src/drivers/nic_stat/main.cc index ea0ccf8d9..fcedf3f2d 100644 --- a/dde_ipxe/src/drivers/nic_stat/main.cc +++ b/dde_ipxe/src/drivers/nic_stat/main.cc @@ -156,7 +156,8 @@ int main(int, char **) 6*4096 + tx_buf_size + rx_buf_size, tx_buf_size, rx_buf_size)) */ - nic_root.session("ram_quota=155648, tx_buf_size=65536, rx_buf_size=65536"); + nic_root.session("ram_quota=155648, tx_buf_size=65536, rx_buf_size=65536", + Affinity()); sleep_forever(); return 0; diff --git a/gems/src/server/d3m/block_service.h b/gems/src/server/d3m/block_service.h index 367e5f5aa..5c384b891 100644 --- a/gems/src/server/d3m/block_service.h +++ b/gems/src/server/d3m/block_service.h @@ -51,7 +51,9 @@ class Iso9660_boot_probe Proxy_service(Genode::Session_capability session) : Genode::Service("proxy"), _session(session) { } - Genode::Session_capability session(const char *) { return _session; } + Genode::Session_capability session(char const *, + Genode::Affinity const &) + { return _session; } void upgrade(Genode::Session_capability session, const char *) { } @@ -127,7 +129,8 @@ class Iso9660_boot_probe { char const *args = "ram_quota=140K, tx_buf_size=128K"; Genode::Root_client root(_block_root); - return Genode::static_cap_cast(root.session(args)); + return Genode::static_cap_cast + (root.session(args, Genode::Affinity())); } /** @@ -152,7 +155,7 @@ class Iso9660_boot_probe char args[Genode::Root::Session_args::MAX_SIZE]; Genode::snprintf(args, sizeof(args), "ram_quota=4K, filename=\"%s\"", boot_tag_name); - rom_root.session(args); + rom_root.session(args, Genode::Affinity()); } public: @@ -297,11 +300,12 @@ namespace Block { Root(Driver_registry &driver_registry) : _driver_registry(driver_registry) { } - Genode::Session_capability session(Genode::Root::Session_args const &args) + Genode::Session_capability session(Genode::Root::Session_args const &args, + Genode::Affinity const &affinity) { PDBG("\nsession requested args=\"%s\"", args.string()); Genode::Root_capability root = _driver_registry.root(); - return Genode::Root_client(root).session(args); + return Genode::Root_client(root).session(args, affinity); } void upgrade(Genode::Session_capability, diff --git a/gems/src/server/d3m/input_service.h b/gems/src/server/d3m/input_service.h index a81da2c9a..cd60bc1f2 100644 --- a/gems/src/server/d3m/input_service.h +++ b/gems/src/server/d3m/input_service.h @@ -55,7 +55,8 @@ namespace Input { try { using namespace Genode; - return static_cap_cast(Root_client(root).session(args)); + return static_cap_cast + (Root_client(root).session(args, Genode::Affinity())); } catch (...) { throw Source_unavailable(); } diff --git a/gems/src/server/d3m/nic_service.h b/gems/src/server/d3m/nic_service.h index 43c1b4d1d..89a4d45de 100644 --- a/gems/src/server/d3m/nic_service.h +++ b/gems/src/server/d3m/nic_service.h @@ -40,7 +40,8 @@ namespace Nic { public: - Genode::Session_capability session(Session_args const &args) + Genode::Session_capability session(Session_args const &args, + Genode::Affinity const &affinity) { if (!args.is_valid_string()) throw Invalid_args(); @@ -48,7 +49,8 @@ namespace Nic { throw Unavailable(); try { - return Genode::Root_client(_nic_provider.root()).session(args.string()); + return Genode::Root_client(_nic_provider.root()) + .session(args.string(), affinity); } catch (...) { throw Unavailable(); } diff --git a/os/include/init/child.h b/os/include/init/child.h index 05321e25a..fb762ed85 100644 --- a/os/include/init/child.h +++ b/os/include/init/child.h @@ -229,7 +229,8 @@ namespace Init { } } - Genode::Session_capability session(const char *args) + Genode::Session_capability session(const char *args, + Genode::Affinity const &affinity) { /* * This function is called from the context of the client's @@ -246,7 +247,7 @@ namespace Init { _applicants_lock.unlock(); Genode::Session_capability cap; - try { cap = Genode::Root_client(_root).session(args); } + try { cap = Genode::Root_client(_root).session(args, affinity); } catch (Genode::Root::Invalid_args) { throw Invalid_args(); } catch (Genode::Root::Unavailable) { throw Unavailable(); } catch (Genode::Root::Quota_exceeded) { throw Quota_exceeded(); } diff --git a/os/include/init/child_policy.h b/os/include/init/child_policy.h index 5561a0644..5ac369112 100644 --- a/os/include/init/child_policy.h +++ b/os/include/init/child_policy.h @@ -171,7 +171,8 @@ namespace Init { Local_rom_service(Genode::Rom_session_capability rom_cap, bool valid) : Genode::Service("ROM"), _rom_cap(rom_cap), _valid(valid) { } - Genode::Session_capability session(const char * /*args*/) + Genode::Session_capability session(char const * /*args*/, + Genode::Affinity const &) { if (!_valid) throw Invalid_args(); diff --git a/os/include/os/child_policy_dynamic_rom.h b/os/include/os/child_policy_dynamic_rom.h index 475317b2d..d8dd5b70c 100644 --- a/os/include/os/child_policy_dynamic_rom.h +++ b/os/include/os/child_policy_dynamic_rom.h @@ -135,7 +135,9 @@ namespace Genode { ** Service interface ** ***********************/ - Session_capability session(const char *) { return _rom_session_cap; } + Session_capability session(const char *, Affinity const &) { + return _rom_session_cap; } + void upgrade(Session_capability, const char *) { } void close(Session_capability) { } diff --git a/os/include/os/static_root.h b/os/include/os/static_root.h index c2bfaf45b..d35577ad0 100644 --- a/os/include/os/static_root.h +++ b/os/include/os/static_root.h @@ -51,7 +51,7 @@ class Genode::Static_root : public Genode::Rpc_object session(Root::Session_args const &args) + Capability session(Root::Session_args const &args, Affinity const &) { return _session; } diff --git a/os/src/drivers/acpi/main.cc b/os/src/drivers/acpi/main.cc index 24282b109..bbf21393d 100644 --- a/os/src/drivers/acpi/main.cc +++ b/os/src/drivers/acpi/main.cc @@ -74,7 +74,8 @@ namespace Irq { /** * Remap IRQ number and create IRQ session at parent */ - Genode::Session_capability session(Root::Session_args const &args) + Genode::Session_capability session(Root::Session_args const &args, + Genode::Affinity const &) { using namespace Genode; @@ -127,7 +128,8 @@ namespace Pci { Root(Provider &pci_provider) : _pci_provider(pci_provider) { } - Genode::Session_capability session(Session_args const &args) + Genode::Session_capability session(Session_args const &args, + Genode::Affinity const &affinity) { if (!args.is_valid_string()) throw Invalid_args(); @@ -135,7 +137,8 @@ namespace Pci { throw Unavailable(); try { - return Genode::Root_client(_pci_provider.root()).session(args.string()); + return Genode::Root_client(_pci_provider.root()) + .session(args.string(), affinity); } catch (...) { throw Unavailable(); } @@ -179,7 +182,8 @@ class Pci_policy : public Genode::Slave_policy, public Pci::Provider try { using namespace Genode; - session = static_cap_cast(Root_client(_cap).session(args)); + session = static_cap_cast(Root_client(_cap) + .session(args, Genode::Affinity())); } catch (...) { return; } Acpi::configure_pci_devices(session); diff --git a/os/src/drivers/pci/main.cc b/os/src/drivers/pci/main.cc index 4ce6071dd..86927fe58 100644 --- a/os/src/drivers/pci/main.cc +++ b/os/src/drivers/pci/main.cc @@ -94,7 +94,7 @@ int main(int argc, char **argv) static Device_pd_policy device_pd_policy(device_pd_ep); static Genode::Slave device_pd_slave(device_pd_ep, device_pd_policy, PCI_DEVICE_PD_RAM_QUOTA); - session_dev_pd = Genode::Root_client(device_pd_policy.root()).session(""); + session_dev_pd = Genode::Root_client(device_pd_policy.root()).session("", Affinity()); } catch (...) { PWRN("PCI device protection domain for IOMMU support is not available"); } diff --git a/os/src/server/loader/child.h b/os/src/server/loader/child.h index a748b3a87..2083f1d05 100644 --- a/os/src/server/loader/child.h +++ b/os/src/server/loader/child.h @@ -95,7 +95,7 @@ namespace Loader { try { char args[Session::Name::MAX_SIZE]; snprintf(args, sizeof(args), "ram_quota=4K, filename=\"%s\"", name); - return static_cap_cast(_local_rom_service.session(args)); + return static_cap_cast(_local_rom_service.session(args, Affinity())); } catch (Genode::Parent::Service_denied) { PERR("Lookup for ROM module \"%s\" failed", name); throw; diff --git a/os/src/server/loader/main.cc b/os/src/server/loader/main.cc index 14c490744..b0378192b 100644 --- a/os/src/server/loader/main.cc +++ b/os/src/server/loader/main.cc @@ -73,7 +73,8 @@ namespace Loader { _close(_rom_sessions.first()); } } - Genode::Session_capability session(const char *args) + Genode::Session_capability session(char const *args, + Affinity const &affinity) { /* try to find ROM module at local ROM service */ try { @@ -97,7 +98,7 @@ namespace Loader { } catch (...) { } /* fall back to parent_rom_service */ - return _parent_rom_service.session(args); + return _parent_rom_service.session(args, affinity); } void close(Session_capability session) @@ -145,9 +146,10 @@ namespace Loader { { Local_cpu_service() : Intercepted_parent_service("CPU") { } - Genode::Session_capability session(const char *args) + Genode::Session_capability session(char const *args, + Affinity const &affinity) { - Capability cap = env()->parent()->session(args); + Capability cap = env()->parent()->session(args, affinity); Cpu_session_client(cap).exception_handler(Thread_capability(), fault_sigh); return cap; } @@ -160,9 +162,10 @@ namespace Loader { { Local_rm_service() : Intercepted_parent_service("RM") { } - Genode::Session_capability session(const char *args) + Genode::Session_capability session(char const *args, + Affinity const &affinity) { - Capability cap = env()->parent()->session(args); + Capability cap = env()->parent()->session(args, affinity); Rm_session_client(cap).fault_handler(fault_sigh); return cap; } @@ -195,7 +198,8 @@ namespace Loader { destroy(&_md_alloc, open_session); } - Genode::Session_capability session(const char *args) + Genode::Session_capability session(char const *args, + Affinity const &) { if (open_session) throw Unavailable(); diff --git a/os/src/server/terminal_crosslink/terminal_root.h b/os/src/server/terminal_crosslink/terminal_root.h index 0fb093b09..3da64732f 100644 --- a/os/src/server/terminal_crosslink/terminal_root.h +++ b/os/src/server/terminal_crosslink/terminal_root.h @@ -41,7 +41,8 @@ namespace Terminal { public: - Session_capability session(Root::Session_args const &args) + Session_capability session(Root::Session_args const &args, + Genode::Affinity const &) { if (!(_session_state & FIRST_SESSION_OPEN)) { _session_state |= FIRST_SESSION_OPEN; diff --git a/ports/src/app/gdb_monitor/app_child.h b/ports/src/app/gdb_monitor/app_child.h index b6d0f1cd0..1ef53232c 100644 --- a/ports/src/app/gdb_monitor/app_child.h +++ b/ports/src/app/gdb_monitor/app_child.h @@ -85,9 +85,10 @@ namespace Gdb_monitor { _rm_root(entrypoint, md_alloc, managed_ds_map) { } - Genode::Session_capability session(const char *args) + Genode::Session_capability session(const char *args, + Genode::Affinity const &affinity) { - return _rm_root.session(args); + return _rm_root.session(args, affinity); } void upgrade(Genode::Session_capability, const char *) { } @@ -102,7 +103,7 @@ namespace Gdb_monitor { { _entrypoint.manage(&_rm_root); Capability cap = static_cap_cast - (_rm_root.session("ram_quota=64K")); + (_rm_root.session("ram_quota=64K", Affinity())); Rm_session_client rm(cap); rm.fault_handler(_gdb_stub_thread.exception_signal_receiver()->manage(new (env()->heap()) Signal_context())); @@ -114,7 +115,7 @@ namespace Gdb_monitor { _entrypoint.manage(&_cpu_root); char args[64]; Genode::snprintf(args, sizeof(args), "ram_quota=32K, label=\"%s\"", _unique_name); - return static_cap_cast(_cpu_root.session(args)); + return static_cap_cast(_cpu_root.session(args, Affinity())); } /** @@ -172,7 +173,8 @@ namespace Gdb_monitor { ** Root interface ** ********************/ - Session_capability session(Session_args const &args) + Session_capability session(Session_args const &args, + Affinity const &affinity) { using namespace Genode; @@ -183,7 +185,7 @@ namespace Gdb_monitor { /* forward session quota to child */ env()->ram_session()->transfer_quota(_child_ram, ram_quota); - Session_capability cap = _child_root.session(args); + Session_capability cap = _child_root.session(args, affinity); /* * Keep information about donated quota in '_sessions' diff --git a/ports/src/app/gdb_monitor/rom.h b/ports/src/app/gdb_monitor/rom.h index 06a6fea15..1df8a6022 100644 --- a/ports/src/app/gdb_monitor/rom.h +++ b/ports/src/app/gdb_monitor/rom.h @@ -114,8 +114,8 @@ namespace Gdb_monitor { : Service("ROM"), _root(entrypoint, md_alloc) { } - Capability session(char const *args) { - return _root.session(args); } + Capability session(char const *args, Affinity const &affinity) { + return _root.session(args, affinity); } void upgrade(Capability, char const *) { } diff --git a/ports/src/noux/local_cpu_service.h b/ports/src/noux/local_cpu_service.h index 62c926c58..c070ecdf9 100644 --- a/ports/src/noux/local_cpu_service.h +++ b/ports/src/noux/local_cpu_service.h @@ -37,7 +37,7 @@ namespace Noux { _cap(cap) { } - Genode::Session_capability session(const char *args) + Genode::Session_capability session(const char *args, Affinity const &) { PDBG("Implement me!"); return Genode::Session_capability(); diff --git a/ports/src/noux/local_noux_service.h b/ports/src/noux/local_noux_service.h index 4a0a294b0..31c799d2e 100644 --- a/ports/src/noux/local_noux_service.h +++ b/ports/src/noux/local_noux_service.h @@ -33,7 +33,11 @@ namespace Noux { Local_noux_service(Genode::Session_capability cap) : Service(Session::service_name()), _cap(cap) { } - Genode::Session_capability session(const char *args) { return _cap; } + Genode::Session_capability session(const char *args, Affinity const &) + { + return _cap; + } + void upgrade(Genode::Session_capability, const char *args) { } void close(Genode::Session_capability) { } }; diff --git a/ports/src/noux/local_ram_service.h b/ports/src/noux/local_ram_service.h index dbd057722..6f6f925f1 100644 --- a/ports/src/noux/local_ram_service.h +++ b/ports/src/noux/local_ram_service.h @@ -35,7 +35,7 @@ namespace Noux { Service(Ram_session::service_name()), _ep(ep) { } - Genode::Session_capability session(const char *args) + Genode::Session_capability session(const char *args, Affinity const &) { PDBG("Implement me!"); return Genode::Session_capability(); diff --git a/ports/src/noux/local_rm_service.h b/ports/src/noux/local_rm_service.h index 7edd8a20c..7217c1b57 100644 --- a/ports/src/noux/local_rm_service.h +++ b/ports/src/noux/local_rm_service.h @@ -103,7 +103,7 @@ namespace Noux { _ds_registry(ds_registry) { } - Genode::Session_capability session(const char *args) + Genode::Session_capability session(const char *args, Affinity const &) { addr_t start = Arg_string::find_arg(args, "start").ulong_value(~0UL); size_t size = Arg_string::find_arg(args, "size").ulong_value(0); diff --git a/ports/src/noux/local_rom_service.h b/ports/src/noux/local_rom_service.h index c097cc3e8..51a7ec460 100644 --- a/ports/src/noux/local_rom_service.h +++ b/ports/src/noux/local_rom_service.h @@ -42,7 +42,7 @@ namespace Noux { _ds_registry(ds_registry) { } - Genode::Session_capability session(const char *args) + Genode::Session_capability session(const char *args, Affinity const &) { enum { NAME_MAX_LEN = 128 }; char name[NAME_MAX_LEN];