Integrate core's RAM service into the PD service

Fixes #2407
This commit is contained in:
Norman Feske
2017-05-11 20:03:28 +02:00
committed by Christian Helmuth
parent 5a3a1c704b
commit 0167d5af50
93 changed files with 871 additions and 1545 deletions

View File

@ -19,7 +19,6 @@
#include <base/child.h>
#include <util/arg_string.h>
#include <init/child_policy.h>
#include <ram_session/connection.h>
#include <cpu_session/connection.h>
#include <pd_session/connection.h>
#include <region_map/client.h>
@ -100,19 +99,11 @@ class Loader::Child : public Child_policy
Pd_session &ref_pd() override { return _env.pd(); }
Pd_session_capability ref_pd_cap() const override { return _env.pd_session_cap(); }
Ram_session &ref_ram() override { return _env.ram(); }
Ram_session_capability ref_ram_cap() const override { return _env.ram_session_cap(); }
void init(Pd_session &pd, Pd_session_capability pd_cap) override
{
pd.ref_account(ref_pd_cap());
ref_pd().transfer_quota(pd_cap, _cap_quota);
}
void init(Ram_session &ram, Ram_session_capability ram_cap) override
{
ram.ref_account(ref_ram_cap());
ref_ram().transfer_quota(ram_cap, _ram_quota);
ref_pd().transfer_quota(pd_cap, _ram_quota);
}
Service &resolve_session_request(Service::Name const &name,

View File

@ -158,10 +158,10 @@ class Loader::Session_component : public Rpc_object<Session>
struct Local_nitpicker_factory : Local_service<Nitpicker::Session_component>::Factory
{
Entrypoint &_ep;
Env &_env;
Region_map &_rm;
Ram_session &_ram;
Entrypoint &_ep;
Env &_env;
Region_map &_rm;
Ram_allocator &_ram;
Area _max_size;
Nitpicker::View_capability _parent_view;
@ -170,7 +170,8 @@ class Loader::Session_component : public Rpc_object<Session>
Constructible<Nitpicker::Session_component> session;
Local_nitpicker_factory(Entrypoint &ep, Env &env, Region_map &rm, Ram_session &ram)
Local_nitpicker_factory(Entrypoint &ep, Env &env,
Region_map &rm, Ram_allocator &ram)
: _ep(ep), _env(env), _rm(rm), _ram(ram) { }
void constrain_geometry(Area size) { _max_size = size; }

View File

@ -152,7 +152,7 @@ class Nitpicker::Session_component : public Rpc_object<Session>
Session_component(Entrypoint &ep,
Env &env,
Region_map &rm,
Ram_session &ram,
Ram_allocator &ram,
Area max_size,
Nitpicker::View_capability parent_view,
Signal_context_capability view_ready_sigh,

View File

@ -15,37 +15,38 @@
#define _RAM_SESSION_CLIENT_GUARD_H_
#include <base/lock.h>
#include <base/printf.h>
#include <base/log.h>
#include <base/ram_allocator.h>
#include <pd_session/client.h>
#include <dataspace/client.h>
#include <ram_session/client.h>
namespace Genode {
class Ram_session_client_guard : public Ram_session_client
class Ram_session_client_guard : public Ram_allocator
{
private:
size_t const _amount; /* total amount */
size_t _consumed; /* already consumed bytes */
Lock mutable _consumed_lock;
Pd_session_client _pd;
size_t const _amount; /* total amount */
size_t _consumed; /* already consumed bytes */
Lock mutable _consumed_lock;
public:
Ram_session_client_guard(Ram_session_capability session, Ram_quota amount)
: Ram_session_client(session), _amount(amount.value), _consumed(0) { }
Ram_session_client_guard(Pd_session_capability session, Ram_quota amount)
: _pd(session), _amount(amount.value), _consumed(0) { }
Ram_dataspace_capability alloc(size_t size, Cache_attribute cached) override
{
Lock::Guard _consumed_lock_guard(_consumed_lock);
if ((_amount - _consumed) < size) {
PWRN("Quota exceeded! amount=%lu, size=%lu, consumed=%lu",
_amount, size, _consumed);
warning("quota exceeded! amount=", _amount, ", "
"size=", size, ", consumed=", _consumed);
return Ram_dataspace_capability();
}
Ram_dataspace_capability cap =
Ram_session_client::alloc(size, cached);
Ram_dataspace_capability cap = _pd.alloc(size, cached);
_consumed += size;
@ -58,38 +59,14 @@ namespace Genode {
_consumed -= Dataspace_client(ds).size();
Ram_session_client::free(ds);
_pd.free(ds);
}
size_t dataspace_size(Ram_dataspace_capability ds) const override
{
return Ram_session_client::dataspace_size(ds);
}
void transfer_quota(Ram_session_capability ram_session, Ram_quota amount) override
{
Lock::Guard _consumed_lock_guard(_consumed_lock);
if ((_amount - _consumed) < amount.value) {
warning("Quota exceeded! amount=", _amount, ", "
"size=", amount.value, ", "
"consumed=", _consumed);
throw Out_of_ram();
}
Ram_session_client::transfer_quota(ram_session, amount);
_consumed += amount.value;
}
Ram_quota ram_quota() const override
{
return { _amount };
}
Ram_quota used_ram() const override
{
Lock::Guard _consumed_lock_guard(_consumed_lock);
return { _consumed };
return _pd.dataspace_size(ds);
}
};
}

View File

@ -31,7 +31,7 @@ namespace Genode {
Name const _name;
Ram_session &_ram;
Ram_allocator &_ram;
Attached_ram_dataspace _fg;
Attached_ram_dataspace _bg;
@ -48,9 +48,9 @@ namespace Genode {
enum Origin { PARENT_PROVIDED, SESSION_LOCAL };
Rom_module(Env &env, Xml_node config, Name const &name,
Ram_session &ram_session, Origin origin)
Ram_allocator &ram_allocator, Origin origin)
:
_name(name), _ram(ram_session),
_name(name), _ram(ram_allocator),
_fg(_ram, env.rm(), 0), _bg(_ram, env.rm(), 0),
_bg_has_pending_data(false),
_lock(Lock::LOCKED)
@ -158,7 +158,7 @@ namespace Genode {
Env &_env;
Xml_node const _config;
Lock _lock;
Ram_session &_ram_session;
Ram_allocator &_ram_allocator;
Allocator &_md_alloc;
List<Rom_module> _list;
@ -172,14 +172,15 @@ namespace Genode {
/**
* Constructor
*
* \param ram_session RAM session used as backing store for
* module data
* \param md_alloc backing store for ROM module meta data
* \param ram_allocator RAM allocator used as backing store for
* module data
* \param md_alloc backing store for ROM module meta data
*/
Rom_module_registry(Env &env, Xml_node config, Ram_session &ram_session,
Rom_module_registry(Env &env, Xml_node config,
Ram_allocator &ram_allocator,
Allocator &md_alloc)
:
_env(env), _config(config), _ram_session(ram_session),
_env(env), _config(config), _ram_allocator(ram_allocator),
_md_alloc(md_alloc)
{ }
@ -226,7 +227,7 @@ namespace Genode {
Lock::Guard guard(_lock);
Rom_module *module = new (&_md_alloc)
Rom_module(_env, _config, name, _ram_session,
Rom_module(_env, _config, name, _ram_allocator,
Rom_module::SESSION_LOCAL);
Rom_module_lock_guard module_guard(*module);
@ -247,7 +248,7 @@ namespace Genode {
Lock::Guard guard(_lock);
Rom_module *module = new (&_md_alloc)
Rom_module(_env, _config, name, _ram_session,
Rom_module(_env, _config, name, _ram_allocator,
Rom_module::PARENT_PROVIDED);
Rom_module_lock_guard module_guard(*module);

View File

@ -56,7 +56,7 @@ class Net::Stream_allocator
Stream_allocator(Genode::Ram_session &ram,
Genode::Region_map &rm,
Genode::size_t amount)
: _ram(ram, Genode::Ram_session_capability(), amount),
: _ram(ram, amount),
_heap(ram, rm),
_range_alloc(&_heap) {}

View File

@ -344,7 +344,7 @@ class Vfs_server::Session_component : public File_system::Session_rpc_object,
bool writable)
:
Session_rpc_object(env.ram().alloc(tx_buf_size), env.rm(), env.ep().rpc_ep()),
_ram(env.ram(), env.ram_session_cap(), ram_quota),
_ram(env.ram(), ram_quota),
_alloc(_ram, env.rm()),
_process_packet_handler(env.ep(), *this, &Session_component::_process_packets),
_vfs(vfs),