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) {