mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-19 15:43:56 +00:00
committed by
Christian Helmuth
parent
db5969e6cc
commit
fbc35cb796
@ -18,6 +18,7 @@
|
||||
|
||||
/* Genode includes */
|
||||
#include <base/slab.h>
|
||||
#include <util/misc_math.h>
|
||||
|
||||
/* Linux emulation environment includes */
|
||||
#include <lx_emul/impl/internal/slab_backend_alloc.h>
|
||||
@ -28,6 +29,8 @@ class Lx::Slab_alloc : public Genode::Slab
|
||||
{
|
||||
private:
|
||||
|
||||
size_t const _object_size;
|
||||
|
||||
/*
|
||||
* Each slab block in the slab contains about 8 objects (slab entries)
|
||||
* as proposed in the paper by Bonwick and block sizes are multiples of
|
||||
@ -35,15 +38,17 @@ class Lx::Slab_alloc : public Genode::Slab
|
||||
*/
|
||||
static size_t _calculate_block_size(size_t object_size)
|
||||
{
|
||||
size_t block_size = 8 * (object_size + sizeof(Genode::Slab_entry))
|
||||
+ sizeof(Genode::Slab_block);
|
||||
size_t block_size = 16*object_size;
|
||||
return Genode::align_addr(block_size, 12);
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Slab_alloc(size_t object_size, Slab_backend_alloc &allocator)
|
||||
: Slab(object_size, _calculate_block_size(object_size), 0, &allocator) { }
|
||||
:
|
||||
Slab(object_size, _calculate_block_size(object_size), 0, &allocator),
|
||||
_object_size(object_size)
|
||||
{ }
|
||||
|
||||
/**
|
||||
* Convenience slabe-entry allocation
|
||||
@ -51,7 +56,12 @@ class Lx::Slab_alloc : public Genode::Slab
|
||||
Genode::addr_t alloc()
|
||||
{
|
||||
Genode::addr_t result;
|
||||
return (Slab::alloc(slab_size(), (void **)&result) ? result : 0);
|
||||
return (Slab::alloc(_object_size, (void **)&result) ? result : 0);
|
||||
}
|
||||
|
||||
void free(void *ptr)
|
||||
{
|
||||
Slab::free(ptr, _object_size);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -152,23 +152,29 @@ class Genode::Slab_alloc : public Genode::Slab
|
||||
{
|
||||
private:
|
||||
|
||||
size_t _calculate_block_size(size_t object_size)
|
||||
Genode::size_t const _object_size;
|
||||
|
||||
static Genode::size_t _calculate_block_size(Genode::size_t object_size)
|
||||
{
|
||||
size_t block_size = 8 * (object_size + sizeof(Slab_entry)) + sizeof(Slab_block);
|
||||
Genode::size_t const block_size = 16*object_size;
|
||||
return align_addr(block_size, 12);
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Slab_alloc(size_t object_size, Backend_alloc *allocator)
|
||||
: Slab(object_size, _calculate_block_size(object_size), 0, allocator)
|
||||
{ }
|
||||
:
|
||||
Slab(object_size, _calculate_block_size(object_size), 0, allocator),
|
||||
_object_size(object_size)
|
||||
{ }
|
||||
|
||||
inline addr_t alloc()
|
||||
{
|
||||
addr_t result;
|
||||
return (Slab::alloc(slab_size(), (void **)&result) ? result : 0);
|
||||
}
|
||||
inline addr_t alloc()
|
||||
{
|
||||
Genode::addr_t result;
|
||||
return (Slab::alloc(_object_size, (void **)&result) ? result : 0);
|
||||
}
|
||||
|
||||
void free(void *ptr) { Slab::free(ptr, _object_size); }
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -169,23 +169,29 @@ class Genode::Slab_alloc : public Genode::Slab
|
||||
{
|
||||
private:
|
||||
|
||||
size_t _calculate_block_size(size_t object_size)
|
||||
Genode::size_t const _object_size;
|
||||
|
||||
static Genode::size_t _calculate_block_size(Genode::size_t object_size)
|
||||
{
|
||||
size_t block_size = 8 * (object_size + sizeof(Slab_entry)) + sizeof(Slab_block);
|
||||
return align_addr(block_size, 12);
|
||||
Genode::size_t const block_size = 16*object_size;
|
||||
return Genode::align_addr(block_size, 12);
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Slab_alloc(size_t object_size, Slab_backend_alloc *allocator)
|
||||
: Slab(object_size, _calculate_block_size(object_size), 0, allocator)
|
||||
{ }
|
||||
Slab_alloc(Genode::size_t object_size, Slab_backend_alloc &allocator)
|
||||
:
|
||||
Slab(object_size, _calculate_block_size(object_size), 0, &allocator),
|
||||
_object_size(object_size)
|
||||
{ }
|
||||
|
||||
inline addr_t alloc()
|
||||
{
|
||||
addr_t result;
|
||||
return (Slab::alloc(slab_size(), (void **)&result) ? result : 0);
|
||||
}
|
||||
Genode::addr_t alloc()
|
||||
{
|
||||
Genode::addr_t result;
|
||||
return (Slab::alloc(_object_size, (void **)&result) ? result : 0);
|
||||
}
|
||||
|
||||
void free(void *ptr) { Slab::free(ptr, _object_size); }
|
||||
};
|
||||
|
||||
|
||||
@ -247,7 +253,7 @@ class Malloc
|
||||
/* init slab allocators */
|
||||
for (unsigned i = SLAB_START_LOG2; i <= SLAB_STOP_LOG2; i++)
|
||||
_allocator[i - SLAB_START_LOG2] = new (Genode::env()->heap())
|
||||
Slab_alloc(1U << i, alloc);
|
||||
Slab_alloc(1U << i, *alloc);
|
||||
}
|
||||
|
||||
static unsigned long max_alloc() { return 1U << SLAB_STOP_LOG2; }
|
||||
|
@ -191,31 +191,29 @@ class Lx::Slab_alloc : public Genode::Slab
|
||||
{
|
||||
private:
|
||||
|
||||
/*
|
||||
* Each slab block in the slab contains about 8 objects (slab entries)
|
||||
* as proposed in the paper by Bonwick and block sizes are multiples of
|
||||
* page size.
|
||||
*/
|
||||
static size_t _calculate_block_size(size_t object_size)
|
||||
Genode::size_t const _object_size;
|
||||
|
||||
static Genode::size_t _calculate_block_size(Genode::size_t object_size)
|
||||
{
|
||||
size_t block_size = 8 * (object_size + sizeof(Genode::Slab_entry))
|
||||
+ sizeof(Genode::Slab_block);
|
||||
Genode::size_t const block_size = 16*object_size;
|
||||
return Genode::align_addr(block_size, 12);
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Slab_alloc(size_t object_size, Slab_backend_alloc &allocator)
|
||||
: Slab(object_size, _calculate_block_size(object_size), 0, &allocator) { }
|
||||
Slab_alloc(Genode::size_t object_size, Slab_backend_alloc &allocator)
|
||||
:
|
||||
Slab(object_size, _calculate_block_size(object_size), 0, &allocator),
|
||||
_object_size(object_size)
|
||||
{ }
|
||||
|
||||
/**
|
||||
* Convenience slabe-entry allocation
|
||||
*/
|
||||
addr_t alloc()
|
||||
Genode::addr_t alloc()
|
||||
{
|
||||
addr_t result;
|
||||
return (Slab::alloc(slab_size(), (void **)&result) ? result : 0);
|
||||
Genode::addr_t result;
|
||||
return (Slab::alloc(_object_size, (void **)&result) ? result : 0);
|
||||
}
|
||||
|
||||
void free(void *ptr) { Slab::free(ptr, _object_size); }
|
||||
};
|
||||
|
||||
|
||||
|
@ -65,6 +65,10 @@ class Wifi_session_component : public Nic::Session_component
|
||||
}
|
||||
|
||||
struct sk_buff *skb = ::alloc_skb(packet.size() + HEAD_ROOM, GFP_KERNEL);
|
||||
if (skb == nullptr) {
|
||||
PERR("Could not allocate new sk_buff");
|
||||
return false;
|
||||
}
|
||||
skb_reserve(skb, HEAD_ROOM);
|
||||
|
||||
unsigned char *data = skb_put(skb, packet.size());
|
||||
|
Reference in New Issue
Block a user