genode/base/include/rm_session/client.h
Christian Prochaska 570156b38c l4lx: allocate memory in chunks
When L4Linux tries to allocate a dataspace of the size of its physical
memory, this allocation can fail, because the 'l4re_ma_alloc()' function
in the 'l4lx' library always tries to allocate a contiguous dataspace of
the given size and there might be no contiguous free area left.

With this patch, memory gets allocated in chunks: if the size to be
allocated exceeds the configured chunk size, a managed dataspace gets
created and filled with multiple memory chunks of at most the chunk size.

The chunk size is 16M by default and can be configured in an l4linux
config node:

<config args="...">
	<ram chunk_size="16M"/>
</config>

Fixes #695.
2013-03-20 14:22:04 +01:00

58 lines
1.5 KiB
C++

/*
* \brief Client-side region manager session interface
* \author Christian Helmuth
* \date 2006-07-11
*/
/*
* Copyright (C) 2006-2013 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#ifndef _INCLUDE__RM_SESSION__CLIENT_H_
#define _INCLUDE__RM_SESSION__CLIENT_H_
#include <rm_session/capability.h>
#include <base/rpc_client.h>
namespace Genode {
struct Rm_session_client : Rpc_client<Rm_session>
{
explicit Rm_session_client(Rm_session_capability session)
: Rpc_client<Rm_session>(session) { }
Local_addr attach(Dataspace_capability ds, size_t size = 0,
off_t offset = 0, bool use_local_addr = false,
Local_addr local_addr = 0,
bool executable = false)
{
return call<Rpc_attach>(ds, size, offset,
use_local_addr, local_addr,
executable);
}
void detach(Local_addr local_addr) {
call<Rpc_detach>(local_addr); }
Pager_capability add_client(Thread_capability thread) {
return call<Rpc_add_client>(thread); }
void remove_client(Pager_capability pager) {
call<Rpc_remove_client>(pager); }
void fault_handler(Signal_context_capability handler) {
call<Rpc_fault_handler>(handler); }
State state() {
return call<Rpc_state>(); }
Dataspace_capability dataspace() {
return call<Rpc_dataspace>(); }
};
}
#endif /* _INCLUDE__RM_SESSION__CLIENT_H_ */