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 b6aa587684..a40df1b6bc 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 a28a0d74fb..a84ff9d9bd 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 19014029e4..1f95f935cf 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 e8ea042683..37479e35df 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 e5ddadcd09..32ca62877d 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 44b2ea1b88..cfc53ec2d3 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 2850488fbc..448693c32a 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 fbb5ac5c62..96b02ee858 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 bd33d28891..7706689bf2 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 5e67594cf2..f11bf77c4c 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 e2dffd295c..ed8d3a12be 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 f7e7a2fcc8..4c0dadb866 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 e9bd3a5c8b..c75ddaea06 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 fa854ae692..edb7afc006 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 0c314bb7b3..4bb5ae7a58 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 ea0ccf8d97..fcedf3f2d0 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 367e5f5aa5..5c384b8915 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 a81da2c9a2..cd60bc1f21 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 43c1b4d1d9..89a4d45deb 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 05321e25ac..fb762ed854 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 5561a0644c..5ac3691125 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 475317b2d7..d8dd5b70cf 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 c2bfaf45ba..d35577ad0a 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 24282b1095..bbf21393d2 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 4ce6071dd2..86927fe588 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 a748b3a87c..2083f1d05c 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 14c4907441..b0378192bc 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 0fb093b098..3da64732fa 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 b6d0f1cd00..1ef53232c0 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 06a6fea15f..1df8a60226 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 62c926c588..c070ecdf94 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 4a0a294b02..31c799d2ec 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 dbd0577221..6f6f925f1a 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 7edd8a20ca..7217c1b579 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 c097cc3e8b..51a7ec4609 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];