diff --git a/repos/base-linux/src/core/include/core_env.h b/repos/base-linux/src/core/include/core_env.h index dcdaa1553..bcb41ac70 100644 --- a/repos/base-linux/src/core/include/core_env.h +++ b/repos/base-linux/src/core/include/core_env.h @@ -94,22 +94,22 @@ namespace Genode { return RAM_SESSION_IMPL::ref_account(session); } - int transfer_quota(Ram_session_capability session, size_t size) + int transfer_quota(Ram_session_capability session, Ram_quota size) { Lock::Guard lock_guard(_lock); return RAM_SESSION_IMPL::transfer_quota(session, size); } - size_t quota() + Ram_quota ram_quota() const override { Lock::Guard lock_guard(_lock); - return RAM_SESSION_IMPL::quota(); + return RAM_SESSION_IMPL::ram_quota(); } - size_t used() + Ram_quota used_ram() const override { Lock::Guard lock_guard(_lock); - return RAM_SESSION_IMPL::used(); + return RAM_SESSION_IMPL::used_ram(); } }; diff --git a/repos/base-linux/src/core/stack_area.cc b/repos/base-linux/src/core/stack_area.cc index 640895960..3dc437720 100644 --- a/repos/base-linux/src/core/stack_area.cc +++ b/repos/base-linux/src/core/stack_area.cc @@ -91,11 +91,11 @@ struct Stack_area_ram_session : Genode::Ram_session int ref_account(Genode::Ram_session_capability) override { return 0; } - int transfer_quota(Genode::Ram_session_capability, Genode::size_t) override { return 0; } + int transfer_quota(Genode::Ram_session_capability, Genode::Ram_quota) override { return 0; } - Genode::size_t quota() override { return 0; } + Genode::Ram_quota ram_quota() const override { return { 0 }; } - Genode::size_t used() override { return 0; } + Genode::Ram_quota used_ram() const override { return { 0 }; } }; diff --git a/repos/base-sel4/src/core/stack_area.cc b/repos/base-sel4/src/core/stack_area.cc index 05418cf5d..f3c8d5771 100644 --- a/repos/base-sel4/src/core/stack_area.cc +++ b/repos/base-sel4/src/core/stack_area.cc @@ -132,12 +132,12 @@ struct Stack_area_ram_session : Ram_session int ref_account(Ram_session_capability ram_session) override { return 0; } - int transfer_quota(Ram_session_capability ram_session, size_t amount) override { + int transfer_quota(Ram_session_capability ram_session, Ram_quota amount) override { return 0; } - size_t quota() override { return 0; } + Ram_quota ram_quota() const override { return { 0 }; } - size_t used() override { return 0; } + Ram_quota used_ram() const override { return { 0 }; } }; diff --git a/repos/base/include/base/child.h b/repos/base/include/base/child.h index c469056f3..c304872b3 100644 --- a/repos/base/include/base/child.h +++ b/repos/base/include/base/child.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -141,6 +142,7 @@ struct Genode::Child_policy virtual Ram_session &ref_ram() = 0; virtual Ram_session_capability ref_ram_cap() const = 0; + /** * Respond to the release of resources by the child * @@ -570,6 +572,15 @@ class Genode::Child : protected Rpc_object, */ void session_closed(Session_state &) override; + template + static UNIT _effective_quota(UNIT requested_quota, UNIT env_quota) + { + if (requested_quota.value < env_quota.value) + return UNIT { 0 }; + + return UNIT { requested_quota.value - env_quota.value }; + } + public: /** @@ -623,13 +634,13 @@ class Genode::Child : protected Rpc_object, void initiate_env_sessions(); /** - * RAM quota unconditionally consumed by the child's environment + * Quota unconditionally consumed by the child's environment */ - static size_t env_ram_quota() + static Ram_quota env_ram_quota() { - return Cpu_connection::RAM_QUOTA + Ram_connection::RAM_QUOTA + - Pd_connection::RAM_QUOTA + Log_connection::RAM_QUOTA + - 2*Rom_connection::RAM_QUOTA; + return { Cpu_connection::RAM_QUOTA + Ram_connection::RAM_QUOTA + + Pd_connection::RAM_QUOTA + Log_connection::RAM_QUOTA + + 2*Rom_connection::RAM_QUOTA }; } template @@ -639,14 +650,11 @@ class Genode::Child : protected Rpc_object, } /** - * Deduce session costs from usable ram quota + * Deduce env session costs from usable RAM quota */ - static size_t effective_ram_quota(size_t const ram_quota) + static Ram_quota effective_quota(Ram_quota quota) { - if (ram_quota < env_ram_quota()) - return 0; - - return ram_quota - env_ram_quota(); + return _effective_quota(quota, env_ram_quota()); } Ram_session_capability ram_session_cap() const { return _ram.cap(); } diff --git a/repos/base/include/base/connection.h b/repos/base/include/base/connection.h index 92a6d569d..98117ab11 100644 --- a/repos/base/include/base/connection.h +++ b/repos/base/include/base/connection.h @@ -54,7 +54,7 @@ class Genode::Connection_base : public Noncopyable void upgrade_ram(size_t bytes) { - String<64> const args("ram_quota=", bytes); + String<64> const args("ram_quota=", Ram_quota{bytes}); _env.upgrade(_id_space_element.id(), args.string()); } }; diff --git a/repos/base/include/base/session_state.h b/repos/base/include/base/session_state.h index 3c9bf4dd2..cfa243d8d 100644 --- a/repos/base/include/base/session_state.h +++ b/repos/base/include/base/session_state.h @@ -58,15 +58,15 @@ class Genode::Session_state : public Parent::Client, public Parent::Server, /** * Total of quota associated with this session */ - size_t _donated_ram_quota = 0; + Ram_quota _donated_ram_quota { 0 }; Factory *_factory = nullptr; Reconstructible::Element> _id_at_client; - Session_label const _label; - Args _args; - Affinity _affinity; + Session::Label const _label; + Args _args; + Affinity _affinity; public: @@ -87,7 +87,7 @@ class Genode::Session_state : public Parent::Client, public Parent::Server, CLOSED }; /** - * If set, the server reponds asynchronously to the session request. + * If set, the server responds asynchronously to the session request. * The client waits for a notification that is delivered as soon as * the server delivers the session capability. */ @@ -106,7 +106,7 @@ class Genode::Session_state : public Parent::Client, public Parent::Server, Session_capability cap; - size_t ram_upgrade = 0; + Ram_quota ram_upgrade { 0 }; void print(Output &out) const; @@ -129,7 +129,7 @@ class Genode::Session_state : public Parent::Client, public Parent::Server, Session_state(Service &service, Id_space &client_id_space, Parent::Client::Id client_id, - Session_label const &label, + Session::Label const &label, Args const &args, Affinity const &affinity); @@ -147,13 +147,13 @@ class Genode::Session_state : public Parent::Client, public Parent::Server, */ void confirm_ram_upgrade() { - ram_upgrade = 0; + ram_upgrade = Ram_quota { 0 }; } - void increase_donated_quota(size_t upgrade) + void increase_donated_quota(Ram_quota added_ram_quota) { - _donated_ram_quota += upgrade; - ram_upgrade = upgrade; + _donated_ram_quota.value += added_ram_quota.value; + ram_upgrade = added_ram_quota; } Parent::Client::Id id_at_client() const @@ -177,7 +177,7 @@ class Genode::Session_state : public Parent::Client, public Parent::Server, void generate_client_side_info(Xml_generator &, Detail detail) const; void generate_server_side_info(Xml_generator &, Detail detail) const; - size_t donated_ram_quota() const { return _donated_ram_quota; } + Ram_quota donated_ram_quota() const { return _donated_ram_quota; } bool alive() const { @@ -201,12 +201,12 @@ class Genode::Session_state : public Parent::Client, public Parent::Server, /** * Return client-side label of the session request */ - Session_label client_label() const { return label_from_args(_args.string()); } + Session::Label client_label() const { return label_from_args(_args.string()); } /** * Return label presented to the server along with the session request */ - Session_label label() const { return _label; } + Session::Label label() const { return _label; } /** * Assign owner diff --git a/repos/base/include/ram_session/client.h b/repos/base/include/ram_session/client.h index 7cef5ef88..985aeb3ef 100644 --- a/repos/base/include/ram_session/client.h +++ b/repos/base/include/ram_session/client.h @@ -42,12 +42,12 @@ struct Genode::Ram_session_client : Rpc_client int ref_account(Ram_session_capability ram_session) override { return call(ram_session); } - int transfer_quota(Ram_session_capability ram_session, size_t amount) override { - return call(ram_session, amount); } + int transfer_quota(Ram_session_capability ram_session, Ram_quota amount) override { + return call(ram_session, amount); } - size_t quota() override { return call(); } + Ram_quota ram_quota() const override { return call(); } - size_t used() override { return call(); } + Ram_quota used_ram() const override { return call(); } }; #endif /* _INCLUDE__RAM_SESSION__CLIENT_H_ */ diff --git a/repos/base/include/ram_session/ram_session.h b/repos/base/include/ram_session/ram_session.h index 498060141..e86025e61 100644 --- a/repos/base/include/ram_session/ram_session.h +++ b/repos/base/include/ram_session/ram_session.h @@ -21,10 +21,6 @@ #include namespace Genode { - - struct Ram_dataspace; - typedef Capability Ram_dataspace_capability; - struct Ram_session_client; struct Ram_session; } @@ -70,26 +66,22 @@ struct Genode::Ram_session : Session, Ram_allocator * Quota can only be transfered if the specified RAM session is * either the reference account for this session or vice versa. */ - virtual int transfer_quota(Ram_session_capability ram_session, size_t amount) = 0; + virtual int transfer_quota(Ram_session_capability ram_session, Ram_quota amount) = 0; /** * Return current quota limit */ - virtual size_t quota() = 0; + virtual Ram_quota ram_quota() const = 0; /** * Return used quota */ - virtual size_t used() = 0; + virtual Ram_quota used_ram() const = 0; /** * Return amount of available quota */ - size_t avail() - { - size_t q = quota(), u = used(); - return q > u ? q - u : 0; - } + Ram_quota avail_ram() const { return { ram_quota().value - used_ram().value }; } /********************* @@ -101,12 +93,12 @@ struct Genode::Ram_session : Session, Ram_allocator size_t, Cache_attribute); GENODE_RPC(Rpc_free, void, free, Ram_dataspace_capability); GENODE_RPC(Rpc_ref_account, int, ref_account, Ram_session_capability); - GENODE_RPC(Rpc_transfer_quota, int, transfer_quota, Ram_session_capability, size_t); - GENODE_RPC(Rpc_quota, size_t, quota); - GENODE_RPC(Rpc_used, size_t, used); + GENODE_RPC(Rpc_transfer_ram_quota, int, transfer_quota, Ram_session_capability, Ram_quota); + GENODE_RPC(Rpc_ram_quota, Ram_quota, ram_quota); + GENODE_RPC(Rpc_used_ram, Ram_quota, used_ram); GENODE_RPC_INTERFACE(Rpc_alloc, Rpc_free, Rpc_ref_account, - Rpc_transfer_quota, Rpc_quota, Rpc_used); + Rpc_transfer_ram_quota, Rpc_ram_quota, Rpc_used_ram); }; #endif /* _INCLUDE__RAM_SESSION__RAM_SESSION_H_ */ diff --git a/repos/base/include/root/component.h b/repos/base/include/root/component.h index fdd03bee1..a674b395f 100644 --- a/repos/base/include/root/component.h +++ b/repos/base/include/root/component.h @@ -138,33 +138,29 @@ class Genode::Root_component : public Rpc_object >, * We need to decrease 'ram_quota' by * the size of the session object. */ - size_t ram_quota = Arg_string::find_arg(args.string(), "ram_quota").ulong_value(0); + Ram_quota const ram_quota = ram_quota_from_args(args.string()); + size_t needed = sizeof(SESSION_TYPE) + md_alloc()->overhead(sizeof(SESSION_TYPE)); - if (needed > ram_quota) { + if (needed > ram_quota.value) { warning("insufficient ram quota " "for ", SESSION_TYPE::service_name(), " session, " "provided=", ram_quota, ", required=", needed); throw Root::Quota_exceeded(); } - size_t const remaining_ram_quota = ram_quota - needed; + Ram_quota const remaining_ram_quota { ram_quota.value - needed }; /* * Deduce ram quota needed for allocating the session object from the * donated ram quota. - * - * XXX the size of the 'adjusted_args' buffer should dependent - * on the message-buffer size and stack size. */ enum { MAX_ARGS_LEN = 256 }; char adjusted_args[MAX_ARGS_LEN]; strncpy(adjusted_args, args.string(), sizeof(adjusted_args)); - char ram_quota_buf[64]; - snprintf(ram_quota_buf, sizeof(ram_quota_buf), "%lu", - remaining_ram_quota); + Arg_string::set_arg(adjusted_args, sizeof(adjusted_args), - "ram_quota", ram_quota_buf); + "ram_quota", String<64>(remaining_ram_quota).string()); SESSION_TYPE *s = 0; try { s = _create_session(adjusted_args, affinity); } diff --git a/repos/base/src/core/include/core_env.h b/repos/base/src/core/include/core_env.h index d5862debd..b4980454d 100644 --- a/repos/base/src/core/include/core_env.h +++ b/repos/base/src/core/include/core_env.h @@ -96,22 +96,22 @@ namespace Genode { return RAM_SESSION_IMPL::ref_account(session); } - int transfer_quota(Ram_session_capability session, size_t size) + int transfer_quota(Ram_session_capability session, Ram_quota size) { Lock::Guard lock_guard(_lock); return RAM_SESSION_IMPL::transfer_quota(session, size); } - size_t quota() + Ram_quota ram_quota() const override { Lock::Guard lock_guard(_lock); - return RAM_SESSION_IMPL::quota(); + return RAM_SESSION_IMPL::ram_quota(); } - size_t used() + Ram_quota used_ram() const override { Lock::Guard lock_guard(_lock); - return RAM_SESSION_IMPL::used(); + return RAM_SESSION_IMPL::used_ram(); } }; diff --git a/repos/base/src/core/include/ram_session_component.h b/repos/base/src/core/include/ram_session_component.h index 45a89983d..1d2cd6fb7 100644 --- a/repos/base/src/core/include/ram_session_component.h +++ b/repos/base/src/core/include/ram_session_component.h @@ -180,9 +180,9 @@ namespace Genode { ***************************/ int ref_account(Ram_session_capability); - int transfer_quota(Ram_session_capability, size_t); - size_t quota() { return _quota_limit; } - size_t used() { return _payload; } + int transfer_quota(Ram_session_capability, Ram_quota); + Ram_quota ram_quota() const override { return { _quota_limit}; } + Ram_quota used_ram() const override { return { _payload}; } }; } diff --git a/repos/base/src/core/main.cc b/repos/base/src/core/main.cc index 1deed2fbe..4a479c3a1 100644 --- a/repos/base/src/core/main.cc +++ b/repos/base/src/core/main.cc @@ -131,7 +131,7 @@ class Core_child : public Child_policy Capability _core_cpu_cap; Cpu_session &_core_cpu; - size_t const _ram_quota; + Ram_quota const _ram_quota; Child _child; @@ -141,14 +141,14 @@ class Core_child : public Child_policy * Constructor */ Core_child(Registry &services, Ram_session &core_ram, - Capability core_ram_cap, size_t ram_quota, + Capability core_ram_cap, Ram_quota ram_quota, Cpu_session &core_cpu, Capability core_cpu_cap) : _entrypoint(nullptr, STACK_SIZE, "init_child", false), _services(services), _core_ram_cap(core_ram_cap), _core_ram(core_ram), _core_cpu_cap(core_cpu_cap), _core_cpu(core_cpu), - _ram_quota(Child::effective_ram_quota(ram_quota)), + _ram_quota(Child::effective_quota(ram_quota)), _child(*env_deprecated()->rm_session(), _entrypoint, *this) { _entrypoint.activate(); @@ -294,20 +294,23 @@ int main() "label=\"core\"", Affinity(), Cpu_session::QUOTA_LIMIT); Cpu_session_capability core_cpu_cap = core_env()->entrypoint()->manage(&core_cpu); - /* - * Transfer all left memory to init, but leave some memory left for core - * - * NOTE: exception objects thrown in core components are currently - * allocated on core's heap and not accounted by the component's meta data - * allocator - */ + /* calculate RAM to be assigned to init */ + size_t const platform_ram_limit = platform()->ram_alloc()->avail(); + size_t const preserved_ram_quota = 224*1024; - Genode::size_t const ram_quota = platform()->ram_alloc()->avail() - 224*1024; - log("", ram_quota / (1024*1024), " MiB RAM assigned to init"); + if (platform_ram_limit < preserved_ram_quota) { + error("platform RAM limit lower than preservation for core"); + return -1; + } + + size_t const avail_ram_quota = platform_ram_limit - preserved_ram_quota; + + log("", avail_ram_quota / (1024*1024), " MiB RAM " + "assigned to init"); static Reconstructible init(services, *env_deprecated()->ram_session(), env_deprecated()->ram_session_cap(), - ram_quota, core_cpu, core_cpu_cap); + Ram_quota{avail_ram_quota}, core_cpu, core_cpu_cap); platform()->wait_for_exit(); diff --git a/repos/base/src/core/ram_session_component.cc b/repos/base/src/core/ram_session_component.cc index 516e1ca07..f553721b1 100644 --- a/repos/base/src/core/ram_session_component.cc +++ b/repos/base/src/core/ram_session_component.cc @@ -274,10 +274,10 @@ int Ram_session_component::ref_account(Ram_session_capability ram_session_cap) int Ram_session_component::transfer_quota(Ram_session_capability ram_session_cap, - size_t amount) + Ram_quota amount) { auto lambda = [&] (Ram_session_component *dst) { - return _transfer_quota(dst, amount); }; + return _transfer_quota(dst, amount.value); }; if (this->cap() == ram_session_cap) return 0; diff --git a/repos/base/src/core/stack_area.cc b/repos/base/src/core/stack_area.cc index 58705e2d0..b8c718af9 100644 --- a/repos/base/src/core/stack_area.cc +++ b/repos/base/src/core/stack_area.cc @@ -134,10 +134,10 @@ struct Stack_area_ram_session : Ram_session size_t dataspace_size(Ram_dataspace_capability) const override { return 0; } - int ref_account (Ram_session_capability) override { return 0; } - int transfer_quota (Ram_session_capability, size_t) override { return 0; } - size_t quota () override { return 0; } - size_t used () override { return 0; } + int ref_account (Ram_session_capability) override { return 0; } + int transfer_quota (Ram_session_capability, Ram_quota) override { return 0; } + Ram_quota ram_quota () const override { return { 0 }; } + Ram_quota used_ram () const override { return { 0 }; } }; diff --git a/repos/base/src/include/base/internal/expanding_ram_session_client.h b/repos/base/src/include/base/internal/expanding_ram_session_client.h index 47523271d..d8c79db9d 100644 --- a/repos/base/src/include/base/internal/expanding_ram_session_client.h +++ b/repos/base/src/include/base/internal/expanding_ram_session_client.h @@ -16,7 +16,7 @@ /* Genode includes */ #include -#include +#include /* base-internal includes */ #include @@ -26,6 +26,11 @@ namespace Genode { class Expanding_ram_session_client; } struct Genode::Expanding_ram_session_client : Upgradeable_client { + void _request_ram_from_parent(size_t amount) + { + Parent &parent = *env_deprecated()->parent(); + parent.resource_request(String<128>("ram_quota=", amount).string()); + } Expanding_ram_session_client(Ram_session_capability cap, Parent::Client::Id id) : Upgradeable_client(cap, id) { } @@ -47,8 +52,6 @@ struct Genode::Expanding_ram_session_client : Upgradeable_clientparent()->resource_request(buf); + enum { OVERHEAD = 4096UL }; + _request_ram_from_parent(size + OVERHEAD); }, NUM_ATTEMPTS); } - int transfer_quota(Ram_session_capability ram_session, size_t amount) override + int transfer_quota(Ram_session_capability ram_session, Ram_quota amount) override { + /* + * Should the transfer fail because we don't have enough quota, request + * the needed amount from the parent. + */ enum { NUM_ATTEMPTS = 2 }; int ret = -1; for (unsigned i = 0; i < NUM_ATTEMPTS; i++) { @@ -76,15 +81,7 @@ struct Genode::Expanding_ram_session_client : Upgradeable_clientparent()->resource_request(buf); + _request_ram_from_parent(amount.value); } return ret; } diff --git a/repos/base/src/include/base/internal/platform_env.h b/repos/base/src/include/base/internal/platform_env.h index 86a6b5cf9..f16023746 100644 --- a/repos/base/src/include/base/internal/platform_env.h +++ b/repos/base/src/include/base/internal/platform_env.h @@ -117,9 +117,9 @@ class Genode::Platform_env : public Env_deprecated, void release() { - log("used before freeing emergency=", _resources.ram.used()); + log("used before freeing emergency=", _resources.ram.used_ram()); _resources.ram.free(_emergency_ram_ds); - log("used after freeing emergency=", _resources.ram.used()); + log("used after freeing emergency=", _resources.ram.used_ram()); } diff --git a/repos/base/src/lib/base/child.cc b/repos/base/src/lib/base/child.cc index c16d43a6d..1f2450b77 100644 --- a/repos/base/src/lib/base/child.cc +++ b/repos/base/src/lib/base/child.cc @@ -37,7 +37,7 @@ namespace { class Transfer { bool _ack; - size_t _quantum; + Ram_quota _quantum; Ram_session_capability _from; Ram_session_capability _to; @@ -54,7 +54,7 @@ namespace { * * \throw Quota_exceeded */ - Transfer(size_t quantum, + Transfer(Ram_quota quantum, Ram_session_capability from, Ram_session_capability to) : _ack(false), _quantum(quantum), _from(from), _to(to) @@ -240,28 +240,27 @@ Session_capability Child::session(Parent::Client::Id id, /* filter session affinity */ Affinity const filtered_affinity = _policy.filter_session_affinity(affinity); - size_t const ram_quota = Arg_string::find_arg(argbuf, "ram_quota").ulong_value(0); + Ram_quota const ram_quota = ram_quota_from_args(argbuf); /* portion of quota to keep for ourself to maintain the session meta data */ size_t const keep_ram_quota = _session_factory.session_costs(); - if (ram_quota < keep_ram_quota) + if (ram_quota.value < keep_ram_quota) throw Parent::Quota_exceeded(); /* ram quota to be forwarded to the server */ - size_t const forward_ram_quota = ram_quota - keep_ram_quota; + Ram_quota const forward_ram_quota { ram_quota.value - keep_ram_quota }; /* adjust the session information as presented to the server */ - Arg_string::set_arg(argbuf, sizeof(argbuf), "ram_quota", - forward_ram_quota); + Arg_string::set_arg(argbuf, sizeof(argbuf), "ram_quota", forward_ram_quota.value); /* may throw a 'Parent::Service_denied' exception */ Child_policy::Route route = _resolve_session_request(_policy, name.string(), argbuf); Service &service = route.service; Session_state &session = - create_session(_policy.name(), service, route.label, _session_factory, - _id_space, id, argbuf, filtered_affinity); + create_session(_policy.name(), service, route.label, + _session_factory, _id_space, id, argbuf, filtered_affinity); _policy.session_state_changed(); @@ -380,8 +379,8 @@ Parent::Upgrade_result Child::upgrade(Client::Id id, Parent::Upgrade_args const return; } - size_t const ram_quota = - Arg_string::find_arg(args.string(), "ram_quota").ulong_value(0); + Ram_quota const ram_quota { + Arg_string::find_arg(args.string(), "ram_quota").ulong_value(0) }; try { /* transfer quota from client to ourself */ @@ -431,8 +430,8 @@ void Child::_revert_quota_and_destroy(Session_state &session) * quota that we preserved for locally storing the session meta data * ('session_costs'). */ - Transfer donation_to_client(session.donated_ram_quota() + - _session_factory.session_costs(), + Transfer donation_to_client(Ram_quota{session.donated_ram_quota().value + + _session_factory.session_costs()}, _policy.ref_ram_cap(), ram_session_cap()); /* finish transaction */ donation_from_service.acknowledge(); diff --git a/repos/base/src/lib/base/component.cc b/repos/base/src/lib/base/component.cc index 1b9547c7a..99dbefb5d 100644 --- a/repos/base/src/lib/base/component.cc +++ b/repos/base/src/lib/base/component.cc @@ -133,23 +133,24 @@ namespace { /* extract session quota as specified by the 'Connection' */ char argbuf[Parent::Session_args::MAX_SIZE]; strncpy(argbuf, args.string(), sizeof(argbuf)); - size_t ram_quota = Arg_string::find_arg(argbuf, "ram_quota").ulong_value(0); + Ram_quota ram_quota = ram_quota_from_args(argbuf); - return retry([&] () { + return retry( + [&] () { - Arg_string::set_arg(argbuf, sizeof(argbuf), "ram_quota", - String<32>(Number_of_bytes(ram_quota)).string()); + Arg_string::set_arg(argbuf, sizeof(argbuf), "ram_quota", + String<32>(ram_quota).string()); - Session_capability cap = - _parent.session(id, name, Parent::Session_args(argbuf), affinity); + Session_capability cap = + _parent.session(id, name, Parent::Session_args(argbuf), affinity); - if (cap.valid()) - return cap; + if (cap.valid()) + return cap; - _block_for_session(); - return _parent.session_cap(id); - }, - [&] () { + _block_for_session(); + return _parent.session_cap(id); + }, + [&] () { /* * If our RAM session has less quota available than the * session quota, the session-quota transfer failed. In @@ -159,18 +160,14 @@ namespace { * Otherwise, the session-quota transfer succeeded but * the request was denied by the server. */ - if (ram_quota > ram().avail()) { - - /* issue resource request */ - char buf[128]; - snprintf(buf, sizeof(buf), "ram_quota=%lu", ram_quota); - - _parent.resource_request(Parent::Resource_args(buf)); + if (ram_quota.value > ram().avail_ram().value) { + Parent::Resource_args args(String<64>("ram_quota=", ram_quota)); + _parent.resource_request(args); } else { - ram_quota += 4096; + ram_quota = Ram_quota { ram_quota.value + 4096 }; } - - }, NUM_ATTEMPTS); + }, + NUM_ATTEMPTS); warning("giving up to increase session quota for ", name.string(), " session " "after ", (int)NUM_ATTEMPTS, " attempts"); diff --git a/repos/base/src/lib/base/root_proxy.cc b/repos/base/src/lib/base/root_proxy.cc index c33f0f56d..fb787769e 100644 --- a/repos/base/src/lib/base/root_proxy.cc +++ b/repos/base/src/lib/base/root_proxy.cc @@ -195,13 +195,11 @@ void Root_proxy::_handle_session_request(Xml_node request) _id_space.apply(id, [&] (Session &session) { - size_t ram_quota = request.attribute_value("ram_quota", 0UL); + Ram_quota const ram_quota { request.attribute_value("ram_quota", 0UL) }; - char buf[64]; - snprintf(buf, sizeof(buf), "ram_quota=%ld", ram_quota); + String<80> const args("ram_quota=", ram_quota); - // XXX handle Root::Invalid_args - Root_client(session.service.root).upgrade(session.cap, buf); + Root_client(session.service.root).upgrade(session.cap, args.string()); _env.parent().session_response(id, Parent::SESSION_OK); }); diff --git a/repos/base/src/lib/base/session_state.cc b/repos/base/src/lib/base/session_state.cc index 0661d9d89..27ba1f568 100644 --- a/repos/base/src/lib/base/session_state.cc +++ b/repos/base/src/lib/base/session_state.cc @@ -76,7 +76,7 @@ void Session_state::generate_session_request(Xml_generator &xml) const xml.node("upgrade", [&] () { xml.attribute("id", id_at_server->id().value); - xml.attribute("ram_quota", ram_upgrade); + xml.attribute("ram_quota", ram_upgrade.value); }); break; @@ -101,7 +101,7 @@ void Session_state::generate_client_side_info(Xml_generator &xml, Detail detail) xml.attribute("service", _service.name()); xml.attribute("label", _label); xml.attribute("state", String<32>(Formatted_phase(phase))); - xml.attribute("ram", String<32>(Number_of_bytes(_donated_ram_quota))); + xml.attribute("ram", String<32>(_donated_ram_quota)); if (detail.args == Detail::ARGS) xml.node("args", [&] () { xml.append_sanitized(_args.string()); }); @@ -160,7 +160,7 @@ Session_state::Session_state(Service &service, Affinity const &affinity) : _service(service), - _donated_ram_quota(Arg_string::find_arg(args.string(), "ram_quota").ulong_value(0)), + _donated_ram_quota(ram_quota_from_args(args.string())), _id_at_client(*this, client_id_space, client_id), _label(label), _args(args), _affinity(affinity) { } diff --git a/repos/base/src/test/ds_ownership/main.cc b/repos/base/src/test/ds_ownership/main.cc index ac9dfcb4f..16fc8a1de 100644 --- a/repos/base/src/test/ds_ownership/main.cc +++ b/repos/base/src/test/ds_ownership/main.cc @@ -29,7 +29,7 @@ void Component::construct(Genode::Env &env) log("allocate dataspace from one RAM session"); ram_1.ref_account(env.ram_session_cap()); - env.ram().transfer_quota(ram_1.cap(), 8*1024); + env.ram().transfer_quota(ram_1.cap(), Ram_quota{8*1024}); Ram_dataspace_capability ds = ram_1.alloc(sizeof(unsigned)); log("attempt to free dataspace from foreign RAM session"); @@ -41,11 +41,11 @@ void Component::construct(Genode::Env &env) log("attach operation succeeded"); log("free dataspace from legitimate RAM session"); - size_t const quota_before_free = ram_1.avail(); + Ram_quota const quota_before_free { ram_1.avail_ram() }; ram_1.free(ds); - size_t const quota_after_free = ram_1.avail(); + Ram_quota const quota_after_free { ram_1.avail_ram() }; - if (quota_after_free > quota_before_free) + if (quota_after_free.value > quota_before_free.value) log("test succeeded"); else error("test failed"); diff --git a/repos/base/src/test/rm_fault/main.cc b/repos/base/src/test/rm_fault/main.cc index cd1a32d3c..6b5a693d2 100644 --- a/repos/base/src/test/rm_fault/main.cc +++ b/repos/base/src/test/rm_fault/main.cc @@ -106,7 +106,7 @@ class Test_child_policy : public Child_policy { enum { CHILD_QUOTA = 1*1024*1024 }; session.ref_account(_env.ram_session_cap()); - _env.ram().transfer_quota(cap, CHILD_QUOTA); + _env.ram().transfer_quota(cap, Ram_quota{CHILD_QUOTA}); } void init(Pd_session &session, Pd_session_capability cap) override diff --git a/repos/dde_rump/src/lib/rump/hypercall.cc b/repos/dde_rump/src/lib/rump/hypercall.cc index 3e5fbe6cc..6a536c008 100644 --- a/repos/dde_rump/src/lib/rump/hypercall.cc +++ b/repos/dde_rump/src/lib/rump/hypercall.cc @@ -162,7 +162,7 @@ int rumpuser_getparam(const char *name, void *buf, size_t buflen) if (!Genode::strcmp(name, "RUMP_MEMLIMIT")) { /* leave 2 MB for the Genode */ - size_t rump_ram = Rump::env().env().ram().avail(); + size_t rump_ram = Rump::env().env().ram().avail_ram().value; if (rump_ram <= RESERVE_MEM) { Genode::error("insufficient quota left: ", diff --git a/repos/demo/include/launchpad/launchpad.h b/repos/demo/include/launchpad/launchpad.h index 06db291b1..2d7c891e0 100644 --- a/repos/demo/include/launchpad/launchpad.h +++ b/repos/demo/include/launchpad/launchpad.h @@ -58,7 +58,8 @@ class Launchpad_child : public Genode::Child_policy, Genode::Ram_session_capability _ref_ram_cap; Genode::Ram_session_client _ref_ram { _ref_ram_cap }; - Genode::size_t const _ram_quota; + + Genode::Ram_quota const _ram_quota; Parent_services &_parent_services; Child_services &_child_services; @@ -96,14 +97,15 @@ class Launchpad_child : public Genode::Child_policy, Genode::Allocator &alloc, Genode::Session_label const &label, Binary_name const &elf_name, - Genode::size_t ram_quota, + Genode::Ram_quota ram_quota, Parent_services &parent_services, Child_services &child_services, Genode::Dataspace_capability config_ds) : _name(label), _elf_name(elf_name), _env(env), _alloc(alloc), - _ref_ram_cap(env.ram_session_cap()), _ram_quota(ram_quota), + _ref_ram_cap(env.ram_session_cap()), + _ram_quota(Genode::Child::effective_quota(ram_quota)), _parent_services(parent_services), _child_services(child_services), _session_requester(env.ep().rpc_ep(), _env.ram(), _env.rm()), @@ -231,6 +233,8 @@ class Launchpad public: + typedef Genode::Ram_quota Ram_quota; + Launchpad(Genode::Env &env, unsigned long initial_quota); unsigned long initial_quota() { return _initial_quota; } @@ -262,7 +266,7 @@ class Launchpad Genode::Allocator &) { } Launchpad_child *start_child(Launchpad_child::Name const &binary_name, - unsigned long quota, + Ram_quota quota, Genode::Dataspace_capability config_ds); /** diff --git a/repos/demo/src/app/launchpad/launcher.cc b/repos/demo/src/app/launchpad/launcher.cc index 5924442a6..63fb5a312 100644 --- a/repos/demo/src/app/launchpad/launcher.cc +++ b/repos/demo/src/app/launchpad/launcher.cc @@ -20,7 +20,8 @@ using namespace Scout; void Launcher::launch() { - _launchpad->start_child(prg_name(), quota(), + _launchpad->start_child(prg_name(), + Launchpad::Ram_quota{quota()}, _config ? _config->config_ds() : Genode::Dataspace_capability()); } diff --git a/repos/demo/src/app/launchpad/main.cc b/repos/demo/src/app/launchpad/main.cc index e118d1064..ca8678565 100644 --- a/repos/demo/src/app/launchpad/main.cc +++ b/repos/demo/src/app/launchpad/main.cc @@ -63,7 +63,7 @@ class Avail_quota_update : public Scout::Tick */ int on_tick() { - size_t new_avail = _ram.avail(); + size_t new_avail = _ram.avail_ram().value; /* update launchpad window if needed */ if (new_avail != _avail) @@ -108,7 +108,7 @@ struct Main : Scout::Event_handler Launchpad_window _launchpad { _env, _graphics_backend, _initial_position, _initial_size, - _max_size, _env.ram().avail() }; + _max_size, _env.ram().avail_ram().value }; void _process_config() { diff --git a/repos/demo/src/app/scout/launcher.cc b/repos/demo/src/app/scout/launcher.cc index 2ffe5818e..efc29bcea 100644 --- a/repos/demo/src/app/scout/launcher.cc +++ b/repos/demo/src/app/scout/launcher.cc @@ -98,7 +98,7 @@ Dataspace_capability Config_registry::config(char const *name) void Launcher::init(Genode::Env &env, Allocator &alloc) { - static Launchpad launchpad(env, env.ram().avail()); + static Launchpad launchpad(env, env.ram().avail_ram().value); _launchpad_ptr = &launchpad; _alloc_ptr = &alloc; _env_ptr = &env; @@ -114,6 +114,7 @@ void Launcher::launch() throw Missing_launchpad_init_call(); } - _launchpad_ptr->start_child(prg_name(), quota(), + _launchpad_ptr->start_child(prg_name(), + Launchpad::Ram_quota{quota()}, config_registry.config(prg_name().string())); } diff --git a/repos/demo/src/lib/launchpad/launchpad.cc b/repos/demo/src/lib/launchpad/launchpad.cc index 25b42c50b..da126050a 100644 --- a/repos/demo/src/lib/launchpad/launchpad.cc +++ b/repos/demo/src/lib/launchpad/launchpad.cc @@ -143,7 +143,7 @@ void Launchpad::process_config(Genode::Xml_node config_node) Launchpad_child *Launchpad::start_child(Launchpad_child::Name const &binary_name, - unsigned long ram_quota, + Ram_quota ram_quota, Dataspace_capability config_ds) { log("starting ", binary_name, " with quota ", ram_quota); @@ -152,27 +152,27 @@ Launchpad_child *Launchpad::start_child(Launchpad_child::Name const &binary_name Launchpad_child::Name const unique_name = _get_unique_child_name(binary_name); log("using unique child name \"", unique_name, "\""); - if (ram_quota > _env.ram().avail()) { - error("child's ram quota is higher than our available quota, using available quota"); + if (ram_quota.value > _env.ram().avail_ram().value) { + warning("child's ram quota is higher than our available quota, using available quota"); - size_t const avail = _env.ram().avail(); + size_t const avail = _env.ram().avail_ram().value; size_t const preserved = 256*1024; if (avail < preserved) { error("giving up, our own quota is too low (", avail, ")"); return 0; } - ram_quota = avail - preserved; + ram_quota = Ram_quota { avail - preserved }; } size_t metadata_size = 4096*16 + sizeof(Launchpad_child); - if (metadata_size > ram_quota) { + if (metadata_size > ram_quota.value) { error("too low ram_quota to hold child metadata"); return 0; } - ram_quota -= metadata_size; + ram_quota = Ram_quota { ram_quota.value - metadata_size }; try { Launchpad_child *c = new (&_sliced_heap) @@ -182,7 +182,7 @@ Launchpad_child *Launchpad::start_child(Launchpad_child::Name const &binary_name Lock::Guard lock_guard(_children_lock); _children.insert(c); - add_child(unique_name, ram_quota, *c, _heap); + add_child(unique_name, ram_quota.value, *c, _heap); return c; } catch (...) { diff --git a/repos/gems/include/gems/report_rom_slave.h b/repos/gems/include/gems/report_rom_slave.h index 8768dbab8..717514da8 100644 --- a/repos/gems/include/gems/report_rom_slave.h +++ b/repos/gems/include/gems/report_rom_slave.h @@ -43,8 +43,8 @@ class Report_rom_slave : public Genode::Noncopyable protected: - static Name _name() { return "report_rom"; } - static Genode::size_t _quota() { return 1024*1024; } + static Name _name() { return "report_rom"; } + static Genode::Ram_quota _quota() { return { 1024*1024 }; } public: diff --git a/repos/gems/src/app/launcher/menu_view_slave.h b/repos/gems/src/app/launcher/menu_view_slave.h index a70fd6bbc..ddb834e2f 100644 --- a/repos/gems/src/app/launcher/menu_view_slave.h +++ b/repos/gems/src/app/launcher/menu_view_slave.h @@ -73,8 +73,8 @@ class Launcher::Menu_view_slave configure(config); } - static Name _name() { return "menu_view"; } - static Genode::size_t _quota() { return 6*1024*1024; } + static Name _name() { return "menu_view"; } + static Genode::Ram_quota _quota() { return { 6*1024*1024 }; } public: diff --git a/repos/gems/src/app/launcher/nit_fader_slave.h b/repos/gems/src/app/launcher/nit_fader_slave.h index eb531727d..6d6115a4d 100644 --- a/repos/gems/src/app/launcher/nit_fader_slave.h +++ b/repos/gems/src/app/launcher/nit_fader_slave.h @@ -45,8 +45,8 @@ class Launcher::Nit_fader_slave protected: - static Name _name() { return "nit_fader"; } - static size_t _quota() { return 2*1024*1024; } + static Name _name() { return "nit_fader"; } + static Genode::Ram_quota _quota() { return { 2*1024*1024 }; } public: diff --git a/repos/libports/src/lib/libc/sysctl.cc b/repos/libports/src/lib/libc/sysctl.cc index f8eab46ca..0b93408cf 100644 --- a/repos/libports/src/lib/libc/sysctl.cc +++ b/repos/libports/src/lib/libc/sysctl.cc @@ -52,7 +52,7 @@ extern "C" long sysconf(int name) case _SC_PAGESIZE: return PAGESIZE; case _SC_PHYS_PAGES: - return _global_env->ram().quota() / PAGESIZE; + return _global_env->ram().ram_quota().value / PAGESIZE; default: Genode::warning(__func__, "(", name, ") not implemented"); return Libc::Errno(EINVAL); @@ -127,7 +127,7 @@ extern "C" int __sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, case HW_PHYSMEM: case HW_USERMEM: - *(unsigned long*)oldp = _global_env->ram().quota(); + *(unsigned long*)oldp = _global_env->ram().ram_quota().value; *oldlenp = sizeof(unsigned long); return 0; diff --git a/repos/libports/src/test/moon/main.cc b/repos/libports/src/test/moon/main.cc index 694c29f4c..26883d2cb 100644 --- a/repos/libports/src/test/moon/main.cc +++ b/repos/libports/src/test/moon/main.cc @@ -63,7 +63,7 @@ static int l_quota(lua_State *lua) return 0; } - lua_pushnumber(lua, Moon::env->ram.quota()); + lua_pushnumber(lua, Moon::env->ram.ram_quota().value); return 1; } diff --git a/repos/os/include/cli_monitor/child.h b/repos/os/include/cli_monitor/child.h index 7b951ed72..030776843 100644 --- a/repos/os/include/cli_monitor/child.h +++ b/repos/os/include/cli_monitor/child.h @@ -190,7 +190,7 @@ class Cli_monitor::Child_base : public Genode::Child_policy /* wake up child if resource request is in flight */ size_t const req = requested_ram_quota(); - if (req && _child.ram().avail() >= req) { + if (req && _child.ram().avail_ram().value >= req) { _child.notify_resource_avail(); /* clear request state */ @@ -256,9 +256,9 @@ class Cli_monitor::Child_base : public Genode::Child_policy { return Ram_status(_ram_quota, _ram_limit, - _ram_quota - _child.ram().quota(), - _child.ram().used(), - _child.ram().avail(), + _ram_quota - _child.ram().ram_quota().value, + _child.ram().used_ram().value, + _child.ram().avail_ram().value, requested_ram_quota()); } @@ -281,7 +281,7 @@ class Cli_monitor::Child_base : public Genode::Child_policy void init(Genode::Ram_session &session, Genode::Ram_session_capability cap) override { session.ref_account(_ref_ram_cap); - _ref_ram.transfer_quota(cap, _ram_quota); + _ref_ram.transfer_quota(cap, Genode::Ram_quota{_ram_quota}); } Genode::Service &resolve_session_request(Genode::Service::Name const &name, @@ -309,8 +309,8 @@ class Cli_monitor::Child_base : public Genode::Child_policy if (_withdraw_on_yield_response) { enum { RESERVE = 4*1024*1024 }; - size_t amount = _child.ram().avail() < RESERVE - ? 0 : _child.ram().avail() - RESERVE; + size_t amount = _child.ram().avail_ram().value < RESERVE + ? 0 : _child.ram().avail_ram().value - RESERVE; /* try to immediately withdraw freed-up resources */ try { withdraw_ram_quota(amount); } diff --git a/repos/os/include/cli_monitor/ram.h b/repos/os/include/cli_monitor/ram.h index 0340e5544..0aa4bdcfd 100644 --- a/repos/os/include/cli_monitor/ram.h +++ b/repos/os/include/cli_monitor/ram.h @@ -37,11 +37,11 @@ class Cli_monitor::Ram void _validate_preservation() { - if (_ram.avail() < _preserve) + if (_ram.avail_ram().value < _preserve) Genode::Signal_transmitter(_yield_sigh).submit(); /* verify to answer outstanding resource requests too */ - if (_ram.avail() > _preserve) + if (_ram.avail_ram().value > _preserve) Genode::Signal_transmitter(_resource_avail_sigh).submit(); } @@ -86,7 +86,8 @@ class Cli_monitor::Ram { Genode::Lock::Guard guard(_lock); - return Status(_ram.quota(), _ram.used(), _ram.avail(), _preserve); + return Status(_ram.ram_quota().value, _ram.used_ram().value, + _ram.avail_ram().value, _preserve); } void validate_preservation() @@ -109,7 +110,7 @@ class Cli_monitor::Ram Genode::Lock::Guard guard(_lock); int const ret = - Genode::Ram_session_client(from).transfer_quota(_ram_cap, amount); + Genode::Ram_session_client(from).transfer_quota(_ram_cap, Genode::Ram_quota{amount}); if (ret != 0) throw Transfer_quota_failed(); @@ -124,18 +125,18 @@ class Cli_monitor::Ram { Genode::Lock::Guard guard(_lock); - if (_ram.avail() < (_preserve + amount)) { + if (_ram.avail_ram().value < (_preserve + amount)) { Genode::Signal_transmitter(_yield_sigh).submit(); throw Transfer_quota_failed(); } - int const ret = _ram.transfer_quota(to, amount); + int const ret = _ram.transfer_quota(to, Genode::Ram_quota{amount}); if (ret != 0) throw Transfer_quota_failed(); } - size_t avail() const { return _ram.avail(); } + size_t avail() const { return _ram.avail_ram().value; } }; #endif /* _INCLUDE__CLI_MONITOR__RAM_H_ */ diff --git a/repos/os/include/loader_session/client.h b/repos/os/include/loader_session/client.h index b1eecec9e..11f0497c9 100644 --- a/repos/os/include/loader_session/client.h +++ b/repos/os/include/loader_session/client.h @@ -34,7 +34,7 @@ struct Loader::Session_client : Genode::Rpc_client void commit_rom_module(Name const &name) override { call(name); } - void ram_quota(size_t quantum) override { + void ram_quota(Ram_quota quantum) override { call(quantum); } void constrain_geometry(Area size) override { diff --git a/repos/os/include/loader_session/connection.h b/repos/os/include/loader_session/connection.h index f5e31fbe6..85ae33b8b 100644 --- a/repos/os/include/loader_session/connection.h +++ b/repos/os/include/loader_session/connection.h @@ -26,10 +26,11 @@ struct Loader::Connection : Genode::Connection, Session_client /** * Constructor */ - Connection(Genode::Env &env, size_t ram_quota) + Connection(Genode::Env &env, Ram_quota ram_quota) : Genode::Connection(env, session(env.parent(), - "ram_quota=%ld", ram_quota)), + "ram_quota=%ld", + ram_quota.value)), Session_client(cap()) { } diff --git a/repos/os/include/loader_session/loader_session.h b/repos/os/include/loader_session/loader_session.h index 6098884c5..5ce86b728 100644 --- a/repos/os/include/loader_session/loader_session.h +++ b/repos/os/include/loader_session/loader_session.h @@ -31,6 +31,7 @@ namespace Loader { using Genode::Dataspace_capability; using Genode::Signal_context_capability; + using Genode::Ram_quota; struct Session; } @@ -101,7 +102,7 @@ struct Loader::Session : Genode::Session * If 'ram_quota' is not called prior calling 'start', all available * session resources will be assigned to the subsystem. */ - virtual void ram_quota(size_t quantum) = 0; + virtual void ram_quota(Ram_quota quantum) = 0; /** * Constrain size of the nitpicker buffer used by the subsystem @@ -166,7 +167,7 @@ struct Loader::Session : Genode::Session GENODE_RPC_THROW(Rpc_commit_rom_module, void, commit_rom_module, GENODE_TYPE_LIST(Rom_module_does_not_exist), Name const &); - GENODE_RPC(Rpc_ram_quota, void, ram_quota, size_t); + GENODE_RPC(Rpc_ram_quota, void, ram_quota, Ram_quota); GENODE_RPC(Rpc_constrain_geometry, void, constrain_geometry, Area); GENODE_RPC(Rpc_parent_view, void, parent_view, Nitpicker::View_capability); GENODE_RPC(Rpc_view_ready_sigh, void, view_ready_sigh, Signal_context_capability); diff --git a/repos/os/include/os/ram_session_guard.h b/repos/os/include/os/ram_session_guard.h index 134b7aab0..10cf00bf4 100644 --- a/repos/os/include/os/ram_session_guard.h +++ b/repos/os/include/os/ram_session_guard.h @@ -48,7 +48,7 @@ class Genode::Ram_session_guard : public Genode::Ram_session template int transfer_quota(Ram_session_capability ram_session, size_t amount) { - int const error = transfer_quota(ram_session, amount); + int const error = transfer_quota(ram_session, Ram_quota{amount}); if (error == RM_SESSION_INSUFFICIENT_QUOTA) throw T(); @@ -98,7 +98,7 @@ class Genode::Ram_session_guard : public Genode::Ram_session if (amount > _used) return -4; - int error = ram_session.transfer_quota(_session_cap, amount); + int error = ram_session.transfer_quota(_session_cap, Ram_quota{amount}); if (!error) _used -= amount; @@ -140,22 +140,21 @@ class Genode::Ram_session_guard : public Genode::Ram_session return _session.ref_account(ram_session); } int transfer_quota(Ram_session_capability ram_session, - size_t amount) override + Ram_quota amount) override { - if (_used + amount <= _used || _used + amount > _quota) + if (_used + amount.value <= _used || _used + amount.value > _quota) return RM_SESSION_INSUFFICIENT_QUOTA; int const error = _session.transfer_quota(ram_session, amount); if (!error) - _used += amount; + _used += amount.value; return error; } - size_t quota() override { return _quota; } - - size_t used() override { return _used; } + Ram_quota ram_quota() const override { return Ram_quota{_quota}; } + Ram_quota used_ram() const override { return Ram_quota{_used}; } }; #endif /* _INCLUDE__OS__RAM_SESSION_GUARD_H_ */ diff --git a/repos/os/include/os/slave.h b/repos/os/include/os/slave.h index 2084ecd9c..1bfc91a83 100644 --- a/repos/os/include/os/slave.h +++ b/repos/os/include/os/slave.h @@ -56,7 +56,7 @@ class Genode::Slave::Policy : public Child_policy Binary_name const _binary_name; Ram_session_client _ram; Genode::Parent_service _binary_service; - size_t _ram_quota; + Ram_quota const _ram_quota; Parent_services &_parent_services; Rpc_entrypoint &_ep; Child_policy_dynamic_rom_file _config_policy; @@ -83,7 +83,7 @@ class Genode::Slave::Policy : public Child_policy Rpc_entrypoint &ep, Region_map &rm, Ram_session_capability ram_cap, - size_t ram_quota) + Ram_quota ram_quota) : _label(label), _binary_name(binary_name), _ram(ram_cap), _binary_service(Rom_session::service_name()), diff --git a/repos/os/src/app/dummy/main.cc b/repos/os/src/app/dummy/main.cc index f6f965490..6bbfd9dbe 100644 --- a/repos/os/src/app/dummy/main.cc +++ b/repos/os/src/app/dummy/main.cc @@ -95,7 +95,7 @@ struct Dummy::Log_service size_t const ram_quota = Arg_string::find_arg(args, "ram_quota").ulong_value(0); - if (_ram.avail() >= ram_quota) + if (_ram.avail_ram().value >= ram_quota) log("received session quota upgrade"); } }; diff --git a/repos/os/src/drivers/platform/spec/x86/device_pd.h b/repos/os/src/drivers/platform/spec/x86/device_pd.h index fe4915b5c..f00707428 100644 --- a/repos/os/src/drivers/platform/spec/x86/device_pd.h +++ b/repos/os/src/drivers/platform/spec/x86/device_pd.h @@ -34,7 +34,7 @@ class Platform::Device_pd_policy Device_pd_policy(Genode::Rpc_entrypoint &slave_ep, Genode::Region_map &local_rm, Genode::Ram_session_capability ram_ref_cap, - Genode::size_t ram_quota, + Genode::Ram_quota ram_quota, Genode::Session_label const &label) : Genode::Slave::Policy(label, "device_pd", *this, slave_ep, local_rm, diff --git a/repos/os/src/drivers/platform/spec/x86/device_pd/main.cc b/repos/os/src/drivers/platform/spec/x86/device_pd/main.cc index 10477c142..27bb4ccd1 100644 --- a/repos/os/src/drivers/platform/spec/x86/device_pd/main.cc +++ b/repos/os/src/drivers/platform/spec/x86/device_pd/main.cc @@ -59,7 +59,7 @@ struct Expanding_region_map_client : Genode::Region_map_client [&] () { enum { UPGRADE_QUOTA = 4096 }; - if (_env.ram().avail() < UPGRADE_QUOTA) + if (_env.ram().avail_ram().value < UPGRADE_QUOTA) throw; Genode::String<32> arg("ram_quota=", (unsigned)UPGRADE_QUOTA); diff --git a/repos/os/src/drivers/platform/spec/x86/pci_session_component.h b/repos/os/src/drivers/platform/spec/x86/pci_session_component.h index 1c13971a6..3bd9c6a8a 100644 --- a/repos/os/src/drivers/platform/spec/x86/pci_session_component.h +++ b/repos/os/src/drivers/platform/spec/x86/pci_session_component.h @@ -252,7 +252,7 @@ class Platform::Session_component : public Genode::Rpc_object _ram.ref_account(_env_ram_cap); enum { OVERHEAD = 4096 }; - if (_env_ram.transfer_quota(_ram, OVERHEAD) != 0) + if (_env_ram.transfer_quota(_ram, Genode::Ram_quota{OVERHEAD}) != 0) throw Genode::Root::Quota_exceeded(); } @@ -322,7 +322,7 @@ class Platform::Session_component : public Genode::Rpc_object Genode::Session_label const &label) try : _reservation(guard, RAM_QUOTA), - _policy(ep, local_rm, ref_ram, RAM_QUOTA, label), + _policy(ep, local_rm, ref_ram, Genode::Ram_quota{RAM_QUOTA}, label), _child(local_rm, ep, _policy), _connection(_policy, Genode::Slave::Args()) { } @@ -984,10 +984,11 @@ class Platform::Session_component : public Genode::Rpc_object if (!_env_ram.withdraw(UPGRADE_QUOTA)) _rollback(size, ram_cap); - if (_env_ram.transfer_quota(_ram, UPGRADE_QUOTA)) + if (_env_ram.transfer_quota(_ram, Genode::Ram_quota{UPGRADE_QUOTA})) throw Fatal(); - if (_ram.transfer_quota(_device_pd->ram_session_cap(), UPGRADE_QUOTA)) + if (_ram.transfer_quota(_device_pd->ram_session_cap(), + Genode::Ram_quota{UPGRADE_QUOTA})) throw Fatal(); }); } diff --git a/repos/os/src/init/child.cc b/repos/os/src/init/child.cc index 834ef5d35..0df1cce29 100644 --- a/repos/os/src/init/child.cc +++ b/repos/os/src/init/child.cc @@ -198,9 +198,9 @@ void Init::Child::apply_ram_upgrade() _resources.assigned_ram_quota = Ram_quota { _resources.assigned_ram_quota.value + transfer }; - _check_resource_constraints(_ram_limit_accessor.ram_limit()); + _check_ram_constraints(_ram_limit_accessor.ram_limit()); - ref_ram().transfer_quota(_child.ram_session_cap(), transfer); + ref_ram().transfer_quota(_child.ram_session_cap(), Ram_quota{transfer}); /* wake up child that blocks on a resource request */ if (_requested_resources.constructed()) { @@ -231,14 +231,14 @@ void Init::Child::apply_ram_downgrade() /* give up if the child's available RAM is exhausted */ size_t const preserved = 16*1024; - size_t const avail = _child.ram().avail(); + size_t const avail = _child.ram().avail_ram().value; if (avail < preserved) break; size_t const transfer = min(avail - preserved, decrease); - if (_child.ram().transfer_quota(ref_ram_cap(), transfer) == 0) { + if (_child.ram().transfer_quota(ref_ram_cap(), Ram_quota{transfer}) == 0) { _resources.assigned_ram_quota = Ram_quota { _resources.assigned_ram_quota.value - transfer }; break; @@ -335,7 +335,7 @@ void Init::Child::init(Ram_session &session, Ram_session_capability cap) ? _resources.effective_ram_quota().value - initial_session_costs : 0; if (transfer_ram) - _env.ram().transfer_quota(cap, transfer_ram); + _env.ram().transfer_quota(cap, Ram_quota{transfer_ram}); } @@ -630,14 +630,14 @@ Init::Child::Child(Env &env, _ram_limit_accessor(ram_limit_accessor), _name_registry(name_registry), _resources(_resources_from_start_node(start_node, prio_levels, affinity_space)), - _resources_checked((_check_resource_constraints(ram_limit), true)), + _resources_checked((_check_ram_constraints(ram_limit), true)), _parent_services(parent_services), _child_services(child_services), _session_requester(_env.ep().rpc_ep(), _env.ram(), _env.rm()) { if (_verbose.enabled()) { log("child \"", _unique_name, "\""); - log(" RAM quota: ", Number_of_bytes(_resources.effective_ram_quota().value)); + log(" RAM quota: ", _resources.effective_ram_quota()); log(" ELF binary: ", _binary_name); log(" priority: ", _resources.priority); } diff --git a/repos/os/src/init/child.h b/repos/os/src/init/child.h index f3054feb1..169692cf9 100644 --- a/repos/os/src/init/child.h +++ b/repos/os/src/init/child.h @@ -130,7 +130,7 @@ class Init::Child : Child_policy, Child_service::Wakeup Ram_quota effective_ram_quota() const { - return Ram_quota { Genode::Child::effective_ram_quota(assigned_ram_quota.value) }; + return Genode::Child::effective_quota(assigned_ram_quota); } }; @@ -167,7 +167,7 @@ class Init::Child : Child_policy, Child_service::Wakeup Resources _resources; - void _check_resource_constraints(Ram_quota ram_limit) + void _check_ram_constraints(Ram_quota ram_limit) { if (_resources.effective_ram_quota().value == 0) warning("no valid RAM RESOURCE for child \"", _unique_name, "\""); diff --git a/repos/os/src/init/main.cc b/repos/os/src/init/main.cc index a95a5df03..7218d9477 100644 --- a/repos/os/src/init/main.cc +++ b/repos/os/src/init/main.cc @@ -59,7 +59,7 @@ struct Init::Main : State_reporter::Producer, Child::Default_route_accessor, { Ram_quota const preserved_ram = _preserved_ram_from_config(_config.xml()); - Ram_quota avail_ram { _env.ram().avail() }; + Ram_quota avail_ram = _env.ram().avail_ram(); if (preserved_ram.value > avail_ram.value) { error("RAM preservation exceeds available memory"); diff --git a/repos/os/src/init/server.cc b/repos/os/src/init/server.cc index 31e5439da..6fc4524c8 100644 --- a/repos/os/src/init/server.cc +++ b/repos/os/src/init/server.cc @@ -180,15 +180,15 @@ void Init::Server::_handle_create_session_request(Xml_node request, char argbuf[Parent::Session_args::MAX_SIZE]; strncpy(argbuf, args.string(), sizeof(argbuf)); - size_t const ram_quota = Arg_string::find_arg(argbuf, "ram_quota").ulong_value(0); + Ram_quota const ram_quota = ram_quota_from_args(argbuf); size_t const keep_quota = route.service.factory().session_costs(); - if (ram_quota < keep_quota) + if (ram_quota.value < keep_quota) throw Genode::Service::Quota_exceeded(); - size_t const forward_ram_quota = ram_quota - keep_quota; + Ram_quota const forward_ram_quota { ram_quota.value - keep_quota }; - Arg_string::set_arg(argbuf, sizeof(argbuf), "ram_quota", forward_ram_quota); + Arg_string::set_arg(argbuf, sizeof(argbuf), "ram_quota", forward_ram_quota.value); Session_state &session = route.service.create_session(route.service.factory(), @@ -237,7 +237,7 @@ void Init::Server::_handle_upgrade_session_request(Xml_node request, { _client_id_space.apply(id, [&] (Session_state &session) { - size_t const ram_quota = request.attribute_value("ram_quota", 0UL); + Ram_quota const ram_quota { request.attribute_value("ram_quota", 0UL) }; session.phase = Session_state::UPGRADE_REQUESTED; diff --git a/repos/os/src/init/utils.h b/repos/os/src/init/utils.h index f75bb46c1..7e3a8e98f 100644 --- a/repos/os/src/init/utils.h +++ b/repos/os/src/init/utils.h @@ -136,16 +136,11 @@ namespace Init { inline void generate_ram_info(Xml_generator &xml, Ram_session const &ram) { - /* - * The const cast is needed because the 'Ram_session' accessors are - * non-const methods. - */ - Ram_session &ram_nonconst = const_cast(ram); typedef String<32> Value; - xml.attribute("quota", Value(Number_of_bytes(ram_nonconst.quota()))); - xml.attribute("used", Value(Number_of_bytes(ram_nonconst.used()))); - xml.attribute("avail", Value(Number_of_bytes(ram_nonconst.avail()))); + xml.attribute("quota", Value(ram.ram_quota())); + xml.attribute("used", Value(ram.used_ram())); + xml.attribute("avail", Value(ram.avail_ram())); } /** diff --git a/repos/os/src/server/loader/child.h b/repos/os/src/server/loader/child.h index 437650ec4..4e9e573dd 100644 --- a/repos/os/src/server/loader/child.h +++ b/repos/os/src/server/loader/child.h @@ -45,7 +45,7 @@ class Loader::Child : public Child_policy Session_label const _label; Name const _binary_name; - size_t const _ram_quota; + Ram_quota const _ram_quota; Parent_services &_parent_services; @@ -62,7 +62,7 @@ class Loader::Child : public Child_policy Allocator &alloc, Name const &binary_name, Session_label const &label, - size_t ram_quota, + Ram_quota ram_quota, Parent_services &parent_services, Service &local_rom_service, Service &local_cpu_service, @@ -74,7 +74,7 @@ class Loader::Child : public Child_policy _alloc(alloc), _label(label), _binary_name(binary_name), - _ram_quota(Genode::Child::effective_ram_quota(ram_quota)), + _ram_quota(Genode::Child::effective_quota(ram_quota)), _parent_services(parent_services), _local_nitpicker_service(local_nitpicker_service), _local_rom_service(local_rom_service), diff --git a/repos/os/src/server/loader/main.cc b/repos/os/src/server/loader/main.cc index 666eb2877..bbbcd0e8f 100644 --- a/repos/os/src/server/loader/main.cc +++ b/repos/os/src/server/loader/main.cc @@ -204,7 +204,7 @@ class Loader::Session_component : public Rpc_object Env &_env; Session_label const _label; Xml_node const _config; - size_t const _ram_quota; + Ram_quota const _ram_quota; Ram_session_client_guard _local_ram { _env.ram_session_cap(), _ram_quota }; Heap _md_alloc { _local_ram, _env.rm() }; size_t _subsystem_ram_quota_limit = 0; @@ -244,7 +244,7 @@ class Loader::Session_component : public Rpc_object * Constructor */ Session_component(Env &env, Session_label const &label, - Xml_node config, size_t quota) + Xml_node config, Ram_quota quota) : _env(env), _label(label), _config(config), _ram_quota(quota) { @@ -287,9 +287,9 @@ class Loader::Session_component : public Rpc_object throw Rom_module_does_not_exist(); } } - void ram_quota(size_t quantum) override + void ram_quota(Ram_quota quantum) override { - _subsystem_ram_quota_limit = quantum; + _subsystem_ram_quota_limit = quantum.value; } void constrain_geometry(Area size) override @@ -335,13 +335,14 @@ class Loader::Session_component : public Rpc_object } size_t const ram_quota = (_subsystem_ram_quota_limit > 0) - ? min(_subsystem_ram_quota_limit, _ram_quota) - : _ram_quota; + ? min(_subsystem_ram_quota_limit, _ram_quota.value) + : _ram_quota.value; try { _child.construct(_env, _md_alloc, binary_name.string(), prefixed_label(_label, Session_label(label.string())), - ram_quota, _parent_services, _rom_service, + Ram_quota{ram_quota}, + _parent_services, _rom_service, _cpu_service, _pd_service, _nitpicker_service, _fault_sigh); } @@ -372,8 +373,6 @@ class Loader::Root : public Root_component Session_component *_create_session(const char *args) { - size_t quota = Arg_string::find_arg(args, "ram_quota").ulong_value(0); - Xml_node session_config(""); Session_label const label = label_from_args(args); @@ -381,7 +380,8 @@ class Loader::Root : public Root_component try { session_config = Session_policy(label, _config); } catch (...) { } - return new (md_alloc()) Session_component(_env, label, session_config, quota); + return new (md_alloc()) Session_component(_env, label, session_config, + ram_quota_from_args(args)); } public: diff --git a/repos/os/src/server/loader/ram_session_client_guard.h b/repos/os/src/server/loader/ram_session_client_guard.h index 6d86581eb..9db1288b2 100644 --- a/repos/os/src/server/loader/ram_session_client_guard.h +++ b/repos/os/src/server/loader/ram_session_client_guard.h @@ -31,8 +31,8 @@ namespace Genode { public: - Ram_session_client_guard(Ram_session_capability session, size_t amount) - : Ram_session_client(session), _amount(amount), _consumed(0) { } + Ram_session_client_guard(Ram_session_capability session, Ram_quota amount) + : Ram_session_client(session), _amount(amount.value), _consumed(0) { } Ram_dataspace_capability alloc(size_t size, Cache_attribute cached) override { @@ -66,33 +66,34 @@ namespace Genode { return Ram_session_client::dataspace_size(ds); } - int transfer_quota(Ram_session_capability ram_session, size_t amount) override + int transfer_quota(Ram_session_capability ram_session, Ram_quota amount) override { Lock::Guard _consumed_lock_guard(_consumed_lock); - if ((_amount - _consumed) < amount) { - PWRN("Quota exceeded! amount=%lu, size=%lu, consumed=%lu", - _amount, amount, _consumed); + if ((_amount - _consumed) < amount.value) { + warning("Quota exceeded! amount=", _amount, ", " + "size=", amount.value, ", " + "consumed=", _consumed); return -1; } int result = Ram_session_client::transfer_quota(ram_session, amount); if (result == 0) - _consumed += amount; + _consumed += amount.value; return result; } - size_t quota() override + Ram_quota ram_quota() const override { - return _amount; + return { _amount }; } - size_t used() override + Ram_quota used_ram() const override { Lock::Guard _consumed_lock_guard(_consumed_lock); - return _consumed; + return { _consumed }; } }; } diff --git a/repos/os/src/server/nitpicker/main.cc b/repos/os/src/server/nitpicker/main.cc index 7905d3577..55996c890 100644 --- a/repos/os/src/server/nitpicker/main.cc +++ b/repos/os/src/server/nitpicker/main.cc @@ -974,7 +974,7 @@ class Nitpicker::Session_component : public Genode::Rpc_object, if (::Session::texture()) { enum { PRESERVED_RAM = 128*1024 }; - if (_env.ram().avail() > _buffer_size + PRESERVED_RAM) { + if (_env.ram().avail_ram().value > _buffer_size + PRESERVED_RAM) { src_texture = static_cast const *>(::Session::texture()); } else { Genode::warning("not enough RAM to preserve buffer content during resize"); diff --git a/repos/os/src/test/bomb/main.cc b/repos/os/src/test/bomb/main.cc index 79b820f76..960733e10 100644 --- a/repos/os/src/test/bomb/main.cc +++ b/repos/os/src/test/bomb/main.cc @@ -32,7 +32,7 @@ class Bomb_child : public Child_policy Env &_env; Binary_name const _binary_name; Name const _label; - size_t const _ram_quota; + Ram_quota const _ram_quota; Registry > &_parent_services; @@ -45,12 +45,12 @@ class Bomb_child : public Child_policy Bomb_child(Env &env, Name const &binary_name, Name const &label, - size_t ram_quota, + Ram_quota const ram_quota, Registry > &parent_services, unsigned generation) : _env(env), _binary_name(binary_name), _label(label), - _ram_quota(Child::effective_ram_quota(ram_quota)), + _ram_quota(Child::effective_quota(ram_quota)), _parent_services(parent_services) { String<64> config(""); @@ -158,7 +158,7 @@ struct Bomb unsigned const generation = config.xml().attribute_value("generations", 1U); unsigned const children = config.xml().attribute_value("children", 2U); unsigned const sleeptime = config.xml().attribute_value("sleep", 2000U); - unsigned long const demand = config.xml().attribute_value("demand", 1024UL * 1024); + size_t const ram_demand = config.xml().attribute_value("demand", 1024UL * 1024); Heap heap { env.ram(), env.rm() }; @@ -169,9 +169,10 @@ struct Bomb void construct_children() { - unsigned long avail = env.ram().avail(); - unsigned long amount = (avail - demand) / children; - if (amount < (demand * children)) { + unsigned long avail_ram = env.ram().avail_ram().value; + Ram_quota const ram_amount { (avail_ram - ram_demand) / children }; + + if (ram_amount.value < (ram_demand * children)) { log("I'm a leaf node - generation ", generation, " - not enough memory."); return; @@ -191,7 +192,8 @@ struct Bomb unique_child_name(child_registry, binary_name, generation - 1), - amount, parent_services, generation - 1); + ram_amount, + parent_services, generation - 1); } /* master if we have a timer connection */ @@ -241,7 +243,7 @@ struct Bomb timer->sigh(signal_timeout); log("rounds=", rounds, " generations=", generation, " children=", - children, " sleep=", sleeptime, " demand=", demand/1024, "K"); + children, " sleep=", sleeptime, " demand=", ram_demand/1024, "K"); } construct_children(); diff --git a/repos/os/src/test/dynamic_config/loader/main.cc b/repos/os/src/test/dynamic_config/loader/main.cc index 3971d61d4..f2706ae0b 100644 --- a/repos/os/src/test/dynamic_config/loader/main.cc +++ b/repos/os/src/test/dynamic_config/loader/main.cc @@ -24,7 +24,7 @@ struct Main Env &env; int counter { -1 }; - Loader::Connection loader { env, 8 * 1024 * 1024 }; + Loader::Connection loader { env, Ram_quota{8*1024*1024} }; Timer::Connection timer { env }; Signal_handler
timer_handler { env.ep(), *this, &Main::handle_timer }; diff --git a/repos/os/src/test/dynamic_config/master/main.cc b/repos/os/src/test/dynamic_config/master/main.cc index 7d7edcecb..a526c4ab4 100644 --- a/repos/os/src/test/dynamic_config/master/main.cc +++ b/repos/os/src/test/dynamic_config/master/main.cc @@ -36,7 +36,7 @@ struct Test::Policy Policy(Env &env, Name const &name) : Slave::Policy(name, name, *this, env.ep().rpc_ep(), env.rm(), - env.ram_session_cap(), 1024*1024) + env.ram_session_cap(), Ram_quota{1024*1024}) { } }; diff --git a/repos/os/src/test/fault_detection/main.cc b/repos/os/src/test/fault_detection/main.cc index c2f3e152c..f5960fd08 100644 --- a/repos/os/src/test/fault_detection/main.cc +++ b/repos/os/src/test/fault_detection/main.cc @@ -70,7 +70,7 @@ class Test_child : public Genode::Child_policy private: Env &_env; - size_t const _ram_quota = 1024*1024; + Ram_quota const _ram_quota { 1024*1024 }; Binary_name const _binary_name; Signal_context_capability _sigh; Parent_service _cpu_service { _env, Cpu_session::service_name() }; @@ -162,7 +162,7 @@ struct Faulting_loader_child_test void start_iteration(Env &env, Signal_context_capability fault_sigh) { - loader.construct(env, 1024*1024); + loader.construct(env, Ram_quota{1024*1024}); /* register fault handler at loader session */ loader->fault_sigh(fault_sigh); @@ -207,7 +207,7 @@ struct Faulting_loader_grand_child_test void start_iteration(Env &env, Signal_context_capability fault_sigh) { - loader.construct(env, 2*1024*1024); + loader.construct(env, Ram_quota{2*1024*1024}); /* import config into loader session */ { diff --git a/repos/os/src/test/loader/main.cc b/repos/os/src/test/loader/main.cc index 03fbe0c22..1de7a9007 100644 --- a/repos/os/src/test/loader/main.cc +++ b/repos/os/src/test/loader/main.cc @@ -25,7 +25,7 @@ struct Test::Main { Env &_env; - Loader::Connection _loader { _env, 8*1024*1024 }; + Loader::Connection _loader { _env, Ram_quota{8*1024*1024} }; Timer::Connection _timer { _env }; Loader::Area _size; diff --git a/repos/os/src/test/resource_request/main.cc b/repos/os/src/test/resource_request/main.cc index 37110ff1b..780e2f158 100644 --- a/repos/os/src/test/resource_request/main.cc +++ b/repos/os/src/test/resource_request/main.cc @@ -28,7 +28,7 @@ namespace Test { static void print_quota_stats(Genode::Ram_session &ram) { - Genode::log("quota: avail=", ram.avail(), " used=", ram.used()); + Genode::log("quota: avail=", ram.avail_ram().value, " used=", ram.used_ram().value); } @@ -139,7 +139,7 @@ void Component::construct(Genode::Env &env) * Consume initial quota to let the test trigger the corner cases of * exceeded quota. */ - size_t const avail_quota = env.ram().avail(); + size_t const avail_quota = env.ram().avail_ram().value; enum { KEEP_QUOTA = 64*1024 }; size_t const wasted_quota = (avail_quota >= KEEP_QUOTA) ? avail_quota - KEEP_QUOTA : 0; @@ -181,7 +181,7 @@ void Component::construct(Genode::Env &env) dummy_handlers[i].destruct(); } print_quota_stats(env.ram()); - size_t const used_quota_after_draining_session = env.ram().used(); + size_t const used_quota_after_draining_session = env.ram().used_ram().value; /* * When creating a new session, we try to donate RAM quota to the server. @@ -192,20 +192,20 @@ void Component::construct(Genode::Env &env) static Ram_connection ram(env); ram.ref_account(env.ram_session_cap()); print_quota_stats(env.ram()); - size_t const used_quota_after_session_request = env.ram().used(); + size_t const used_quota_after_session_request = env.ram().used_ram().value; /* * Quota transfers from the component's RAM session may result in resource * requests, too. */ log("\n-- out-of-memory during transfer-quota --"); - int ret = env.ram().transfer_quota(ram.cap(), 512*1024); + int ret = env.ram().transfer_quota(ram.cap(), Ram_quota{512*1024}); if (ret != 0) { error("transfer quota failed (ret = ", ret, ")"); throw Error(); } print_quota_stats(env.ram()); - size_t const used_quota_after_transfer = env.ram().used(); + size_t const used_quota_after_transfer = env.ram().used_ram().value; /* * Finally, resource requests could be caused by a regular allocation, @@ -214,7 +214,7 @@ void Component::construct(Genode::Env &env) log("\n-- out-of-memory during RAM allocation --"); env.ram().alloc(512*1024); print_quota_stats(env.ram()); - size_t const used_quota_after_alloc = env.ram().used(); + size_t const used_quota_after_alloc = env.ram().used_ram().value; /* * Validate asserted effect of the individual steps on the used quota. diff --git a/repos/os/src/test/resource_yield/main.cc b/repos/os/src/test/resource_yield/main.cc index fd2868819..37812a02f 100644 --- a/repos/os/src/test/resource_yield/main.cc +++ b/repos/os/src/test/resource_yield/main.cc @@ -98,7 +98,7 @@ void Test::Child::_handle_periodic_timeout() { size_t const chunk_size = 1024*1024; - if (_env.ram().avail() < chunk_size) { + if (_env.ram().avail_ram().value < chunk_size) { if (_expand) { log("quota consumed, request additional resources"); @@ -197,8 +197,8 @@ class Test::Parent void _print_status() { - log("quota: ", _child.ram().quota() / 1024, " KiB " - "used: ", _child.ram().used() / 1024, " KiB"); + log("quota: ", _child.ram().ram_quota().value / 1024, " KiB " + "used: ", _child.ram().used_ram().value / 1024, " KiB"); } size_t _used_ram_prior_yield = 0; @@ -229,7 +229,7 @@ class Test::Parent void _request_yield() { /* remember quantum of resources used by the child */ - _used_ram_prior_yield = _child.ram().used(); + _used_ram_prior_yield = _child.ram().used_ram().value; log("request yield (ram prior yield: ", _used_ram_prior_yield); @@ -259,7 +259,7 @@ class Test::Parent _print_status(); /* validate that the amount of yielded resources matches the request */ - size_t const used_after_yield = _child.ram().used(); + size_t const used_after_yield = _child.ram().used_ram().value; if (used_after_yield + 5*1024*1024 > _used_ram_prior_yield) { error("child has not yielded enough resources"); throw Insufficient_yield(); @@ -296,7 +296,7 @@ class Test::Parent : Slave::Policy(Label("child"), "test-resource_yield", *this, env.ep().rpc_ep(), env.rm(), - env.ram_session_cap(), SLAVE_QUOTA), + env.ram_session_cap(), Ram_quota{SLAVE_QUOTA}), _parent(parent) { configure(""); diff --git a/repos/os/src/test/vfs_stress/main.cc b/repos/os/src/test/vfs_stress/main.cc index cbac14755..a4be07ccc 100644 --- a/repos/os/src/test/vfs_stress/main.cc +++ b/repos/os/src/test/vfs_stress/main.cc @@ -495,7 +495,7 @@ void Component::construct(Genode::Env &env) /* populate the directory file system at / */ vfs_root.num_dirent("/"); - size_t initial_consumption = env.ram().used(); + size_t initial_consumption = env.ram().used_ram().value; /************************** ** Generate directories ** @@ -517,7 +517,7 @@ void Component::construct(Genode::Env &env) log("created ",count," empty directories, ", (elapsed_ms*1000)/count,"μs/op , ", - env.ram().used()/1024,"KB consumed"); + env.ram().used_ram().value/1024,"KiB consumed"); } @@ -541,7 +541,7 @@ void Component::construct(Genode::Env &env) log("created ",count," empty files, ", (elapsed_ms*1000)/count,"μs/op, ", - env.ram().used()/1024,"KB consumed"); + env.ram().used_ram().value/1024,"KiB consumed"); } @@ -551,7 +551,7 @@ void Component::construct(Genode::Env &env) if (!config_xml.attribute_value("write", true)) { elapsed_ms = timer.elapsed_ms(); - log("total: ",elapsed_ms,"ms, ",env.ram().used()/1024,"K consumed"); + log("total: ",elapsed_ms,"ms, ",env.ram().used_ram().value/1024,"K consumed"); return die(env, 0); } { @@ -572,7 +572,7 @@ void Component::construct(Genode::Env &env) log("wrote ",count," bytes ", count/elapsed_ms,"kB/s, ", - env.ram().used()/1024,"KB consumed"); + env.ram().used_ram().value/1024,"KiB consumed"); } @@ -583,7 +583,7 @@ void Component::construct(Genode::Env &env) if (!config_xml.attribute_value("read", true)) { elapsed_ms = timer.elapsed_ms(); - log("total: ",elapsed_ms,"ms, ",env.ram().used()/1024,"KB consumed"); + log("total: ",elapsed_ms,"ms, ",env.ram().used_ram().value/1024,"KiB consumed"); return die(env, 0); } { @@ -603,7 +603,7 @@ void Component::construct(Genode::Env &env) log("read ",count," bytes, ", count/elapsed_ms,"kB/s, ", - env.ram().used()/1024,"KB consumed"); + env.ram().used_ram().value/1024,"KiB consumed"); } @@ -613,7 +613,7 @@ void Component::construct(Genode::Env &env) if (!config_xml.attribute_value("unlink", true)) { elapsed_ms = timer.elapsed_ms(); - log("total: ",elapsed_ms,"ms, ",env.ram().used()/1024,"KB consumed"); + log("total: ",elapsed_ms,"ms, ",env.ram().used_ram().value/1024,"KiB consumed"); return die(env, 0); } @@ -635,18 +635,18 @@ void Component::construct(Genode::Env &env) vfs_root.sync("/"); log("unlinked ",count," files in ",elapsed_ms,"ms, ", - env.ram().used()/1024,"KB consumed"); + env.ram().used_ram().value/1024,"KiB consumed"); } log("total: ",timer.elapsed_ms(),"ms, ", - env.ram().used()/1024,"KB consumed"); + env.ram().used_ram().value/1024,"KiB consumed"); - size_t outstanding = env.ram().used() - initial_consumption; + size_t outstanding = env.ram().used_ram().value - initial_consumption; if (outstanding) { if (outstanding < 1024) error(outstanding, "B not freed after unlink and sync!"); else - error(outstanding/1024,"KB not freed after unlink and sync!"); + error(outstanding/1024,"KiB not freed after unlink and sync!"); } die(env, 0); diff --git a/repos/ports/src/app/gdb_monitor/app_child.h b/repos/ports/src/app/gdb_monitor/app_child.h index a3b39d0e7..cd97f2c93 100644 --- a/repos/ports/src/app/gdb_monitor/app_child.h +++ b/repos/ports/src/app/gdb_monitor/app_child.h @@ -59,7 +59,7 @@ class Gdb_monitor::App_child : public Child_policy Region_map &_rm; - size_t _ram_quota; + Ram_quota _ram_quota; Rpc_entrypoint _entrypoint; @@ -111,7 +111,7 @@ class Gdb_monitor::App_child : public Child_policy App_child(Env &env, Allocator &alloc, char const *unique_name, - size_t ram_quota, + Ram_quota ram_quota, Signal_receiver &signal_receiver, Xml_node target_node) : diff --git a/repos/ports/src/app/gdb_monitor/gdbserver/genode-low.cc b/repos/ports/src/app/gdb_monitor/gdbserver/genode-low.cc index 4d39fb021..a1154a5a7 100644 --- a/repos/ports/src/app/gdb_monitor/gdbserver/genode-low.cc +++ b/repos/ports/src/app/gdb_monitor/gdbserver/genode-low.cc @@ -467,7 +467,7 @@ extern "C" int fork() return -1; } - Number_of_bytes ram_quota = genode_env->ram().avail() - preserved_ram_quota; + Number_of_bytes ram_quota = genode_env->ram().avail_ram().value - preserved_ram_quota; /* start the application */ @@ -482,7 +482,7 @@ extern "C" int fork() App_child *child = new (alloc) App_child(*genode_env, alloc, filename, - ram_quota, + Ram_quota{ram_quota}, signal_receiver, target_node); diff --git a/repos/ports/src/app/gdb_monitor/ram_session_component.cc b/repos/ports/src/app/gdb_monitor/ram_session_component.cc index d2b298f20..f6ad2bfa2 100644 --- a/repos/ports/src/app/gdb_monitor/ram_session_component.cc +++ b/repos/ports/src/app/gdb_monitor/ram_session_component.cc @@ -56,20 +56,20 @@ int Ram_session_component::ref_account(Ram_session_capability ram_session_cap) int Ram_session_component::transfer_quota(Ram_session_capability ram_session_cap, - size_t amount) + Ram_quota amount) { return _parent_ram_session.transfer_quota(ram_session_cap, amount); } -size_t Ram_session_component::quota() +Ram_quota Ram_session_component::ram_quota() const { - return _parent_ram_session.quota(); + return _parent_ram_session.ram_quota(); } -size_t Ram_session_component::used() +Ram_quota Ram_session_component::used_ram() const { - return _parent_ram_session.used(); + return _parent_ram_session.used_ram(); } diff --git a/repos/ports/src/app/gdb_monitor/ram_session_component.h b/repos/ports/src/app/gdb_monitor/ram_session_component.h index b61f892dc..4700e3e11 100644 --- a/repos/ports/src/app/gdb_monitor/ram_session_component.h +++ b/repos/ports/src/app/gdb_monitor/ram_session_component.h @@ -60,9 +60,9 @@ class Gdb_monitor::Ram_session_component : public Rpc_object void free(Ram_dataspace_capability) override; size_t dataspace_size(Ram_dataspace_capability) const override; int ref_account(Ram_session_capability) override; - int transfer_quota(Ram_session_capability, size_t) override; - size_t quota() override; - size_t used() override; + int transfer_quota(Ram_session_capability, Ram_quota) override; + Ram_quota ram_quota() const override; + Ram_quota used_ram() const override; }; #endif /* _RAM_SESSION_COMPONENT_H_ */ diff --git a/repos/ports/src/app/seoul/main.cc b/repos/ports/src/app/seoul/main.cc index b3849c28b..ef88ccf08 100644 --- a/repos/ports/src/app/seoul/main.cc +++ b/repos/ports/src/app/seoul/main.cc @@ -1403,7 +1403,7 @@ void Component::construct(Genode::Env &env) Genode::log("--- Vancouver VMM starting ---"); /* request max available memory */ - vm_size = env.ram().avail(); + vm_size = env.ram().avail_ram().value; /* reserve some memory for the VMM */ vm_size -= 8 * 1024 * 1024; /* calculate max memory for the VM */ diff --git a/repos/ports/src/lib/libc_noux/plugin.cc b/repos/ports/src/lib/libc_noux/plugin.cc index 6dc832680..2d33bd024 100644 --- a/repos/ports/src/lib/libc_noux/plugin.cc +++ b/repos/ports/src/lib/libc_noux/plugin.cc @@ -341,7 +341,7 @@ extern "C" int getrlimit(int resource, struct rlimit *rlim) #endif return 0; case RLIMIT_RSS: - rlim->rlim_cur = rlim->rlim_max = Genode::env()->ram_session()->quota(); + rlim->rlim_cur = rlim->rlim_max = Genode::env()->ram_session()->ram_quota().value; return 0; case RLIMIT_NPROC: case RLIMIT_NOFILE: diff --git a/repos/ports/src/noux/ram_session_component.h b/repos/ports/src/noux/ram_session_component.h index 45688d4de..778849bc7 100644 --- a/repos/ports/src/noux/ram_session_component.h +++ b/repos/ports/src/noux/ram_session_component.h @@ -189,9 +189,9 @@ class Noux::Ram_session_component : public Rpc_object } int ref_account(Ram_session_capability) { return 0; } - int transfer_quota(Ram_session_capability, size_t) { return 0; } - size_t quota() { return _ram.quota(); } - size_t used() { return _used_ram_quota; } + int transfer_quota(Ram_session_capability, Ram_quota) { return 0; } + Ram_quota ram_quota() const override { return _ram.ram_quota(); } + Ram_quota used_ram() const override { return Ram_quota{_used_ram_quota}; } }; #endif /* _NOUX__RAM_SESSION_COMPONENT_H_ */ diff --git a/repos/ports/src/virtualbox/rt.cc b/repos/ports/src/virtualbox/rt.cc index 3764ae5ff..c3b3c88a9 100644 --- a/repos/ports/src/virtualbox/rt.cc +++ b/repos/ports/src/virtualbox/rt.cc @@ -75,7 +75,7 @@ class Avl_ds : public Genode::Avl_node genode_env().ram().free(_ds); Genode::log("free up ", _size, " ", _mem_allocated, "/", _mem_unused, " hit=", hit, "/", hit_coarse, " avail=", - genode_env().ram().avail()); + genode_env().ram().avail_ram()); } void unused() @@ -140,7 +140,7 @@ class Avl_ds : public Genode::Avl_node while (_unused_ds.first() && cbx && (_mem_allocated + cb > MEMORY_MAX || _mem_unused + cb > MEMORY_CACHED || - genode_env().ram().avail() < cb * 2 + genode_env().ram().avail_ram().value < cb * 2 ) ) { diff --git a/repos/ports/src/virtualbox/sup.cc b/repos/ports/src/virtualbox/sup.cc index bef5e583a..8469beebc 100644 --- a/repos/ports/src/virtualbox/sup.cc +++ b/repos/ports/src/virtualbox/sup.cc @@ -379,7 +379,7 @@ HRESULT genode_check_memory_config(ComObjPtr machine) return rc; /* Request max available memory */ - size_t memory_genode = genode_env().ram().avail() >> 20; + size_t memory_genode = genode_env().ram().avail_ram().value >> 20; size_t memory_vmm = 28; if (memory_vbox + memory_vmm > memory_genode) { diff --git a/repos/ports/src/virtualbox5/sup.cc b/repos/ports/src/virtualbox5/sup.cc index 13ead6eea..e3bc7bf9f 100644 --- a/repos/ports/src/virtualbox5/sup.cc +++ b/repos/ports/src/virtualbox5/sup.cc @@ -382,7 +382,7 @@ HRESULT genode_check_memory_config(ComObjPtr machine) return rc; /* Request max available memory */ - size_t memory_genode = genode_env().ram().avail() >> 20; + size_t memory_genode = genode_env().ram().avail_ram().value >> 20; size_t memory_vmm = 28; if (memory_vbox + memory_vmm > memory_genode) {