base: get rid of alloc align default value

When using the Allocator interface, one can't tell which alignment
resulting allocations fulfill. However, at least on ARM, given the
architectural alignment requirements of ARM memory accesses, one wants
memory allocations (what allocators are for in most cases) to be word
aligned automatically. Previously, at least the AVL allocator simply
called alloc_aligned without defining align in its alloc implementation.
This led to unaligned access faults (the default was 0) when using the
AVL allocator as Allocator (as done in the metadata management of a SLAB
of an AVL that uses the AVL as backing store). To avoid such pitfalls
in the future, we force users of alloc_aligned to always specify align
(why use alloc_aligned without align anyway).

Ref #1941
This commit is contained in:
Martin Stein 2016-04-18 16:01:41 +02:00 committed by Christian Helmuth
parent cdf57b60f9
commit a96130f20b
4 changed files with 13 additions and 10 deletions

View File

@ -163,7 +163,7 @@ struct Genode::Range_allocator : Allocator
* \param align alignment of new block specified
* as the power of two
*/
virtual Alloc_return alloc_aligned(size_t size, void **out_addr, int align = 0, addr_t from=0, addr_t to = ~0UL) = 0;
virtual Alloc_return alloc_aligned(size_t size, void **out_addr, int align, addr_t from=0, addr_t to = ~0UL) = 0;
/**
* Allocate block at address

View File

@ -131,7 +131,7 @@ class Genode::Allocator_avl_base : public Range_allocator
/**
* Find best-fitting block
*/
Block *find_best_fit(size_t size, unsigned align = 1,
Block *find_best_fit(size_t size, unsigned align,
addr_t from = 0UL, addr_t to = ~0UL);
/**
@ -260,7 +260,7 @@ class Genode::Allocator_avl_base : public Range_allocator
int add_range(addr_t base, size_t size) override;
int remove_range(addr_t base, size_t size) override;
Alloc_return alloc_aligned(size_t size, void **out_addr, int align = 0,
Alloc_return alloc_aligned(size_t size, void **out_addr, int align,
addr_t from = 0, addr_t to = ~0UL) override;
Alloc_return alloc_addr(size_t size, addr_t addr) override;
void free(void *addr) override;
@ -272,8 +272,11 @@ class Genode::Allocator_avl_base : public Range_allocator
** Allocator interface **
*************************/
bool alloc(size_t size, void **out_addr) override {
return (Allocator_avl_base::alloc_aligned(size, out_addr).is_ok()); }
bool alloc(size_t size, void **out_addr) override
{
return (Allocator_avl_base::alloc_aligned(
size, out_addr, log2(sizeof(addr_t))).is_ok());
}
void free(void *addr, size_t) override { free(addr); }

View File

@ -159,7 +159,7 @@ class Genode::Mapped_mem_allocator : public Genode::Core_mem_translator
int add_range(addr_t base, size_t size) override { return -1; }
int remove_range(addr_t base, size_t size) override { return -1; }
Alloc_return alloc_aligned(size_t size, void **out_addr,
int align = 0, addr_t from = 0,
int align, addr_t from = 0,
addr_t to = ~0UL) override;
Alloc_return alloc_addr(size_t size, addr_t addr) override {
return Alloc_return::RANGE_CONFLICT; }
@ -174,7 +174,7 @@ class Genode::Mapped_mem_allocator : public Genode::Core_mem_translator
*************************/
bool alloc(size_t size, void **out_addr) override {
return alloc_aligned(size, out_addr).is_ok(); }
return alloc_aligned(size, out_addr, log2(sizeof(addr_t))).is_ok(); }
void free(void *addr, size_t) override;
size_t consumed() const override { return _phys_alloc->consumed(); }
size_t overhead(size_t size) const override {
@ -277,7 +277,7 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
Alloc_return alloc_addr(size_t size, addr_t addr) override {
return Alloc_return::RANGE_CONFLICT; }
Alloc_return alloc_aligned(size_t size, void **out_addr, int align = 0,
Alloc_return alloc_aligned(size_t size, void **out_addr, int align,
addr_t from = 0, addr_t to = ~0UL) override
{
Lock::Guard lock_guard(_lock);
@ -300,7 +300,7 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
*************************/
bool alloc(size_t size, void **out_addr) override {
return alloc_aligned(size, out_addr).is_ok(); }
return alloc_aligned(size, out_addr, log2(sizeof(addr_t))).is_ok(); }
void free(void *addr, size_t size) override
{

View File

@ -91,7 +91,7 @@ class Genode::Synced_range_allocator : public Range_allocator
int remove_range(addr_t base, size_t size) override {
return _synced_object()->remove_range(base, size); }
Alloc_return alloc_aligned(size_t size, void **out_addr, int align = 0,
Alloc_return alloc_aligned(size_t size, void **out_addr, int align,
addr_t from = 0, addr_t to = ~0UL) override {
return _synced_object()->alloc_aligned(size, out_addr, align, from, to); }