From a96130f20bfc1bd31f1262912e0de9cef28aa54e Mon Sep 17 00:00:00 2001 From: Martin Stein <martin.stein@genode-labs.com> Date: Mon, 18 Apr 2016 16:01:41 +0200 Subject: [PATCH] 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 --- repos/base/include/base/allocator.h | 2 +- repos/base/include/base/allocator_avl.h | 11 +++++++---- repos/base/src/core/include/core_mem_alloc.h | 8 ++++---- repos/base/src/core/include/synced_range_allocator.h | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/repos/base/include/base/allocator.h b/repos/base/include/base/allocator.h index 17729af42f..8e30fae253 100644 --- a/repos/base/include/base/allocator.h +++ b/repos/base/include/base/allocator.h @@ -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 diff --git a/repos/base/include/base/allocator_avl.h b/repos/base/include/base/allocator_avl.h index 2b7fab37de..376b90f18f 100644 --- a/repos/base/include/base/allocator_avl.h +++ b/repos/base/include/base/allocator_avl.h @@ -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); } diff --git a/repos/base/src/core/include/core_mem_alloc.h b/repos/base/src/core/include/core_mem_alloc.h index ceedc335aa..25d5eda827 100644 --- a/repos/base/src/core/include/core_mem_alloc.h +++ b/repos/base/src/core/include/core_mem_alloc.h @@ -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 { diff --git a/repos/base/src/core/include/synced_range_allocator.h b/repos/base/src/core/include/synced_range_allocator.h index df84c3cd81..c3ec4b978c 100644 --- a/repos/base/src/core/include/synced_range_allocator.h +++ b/repos/base/src/core/include/synced_range_allocator.h @@ -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); }