base: Refine Range_allocator::alloc_aligned

This patch changes the 'alloc_aligned' interface as follows:

- The former 'from' and 'to' arguments are replaced by a single
  'range' argument.

- The distinction of the use cases of regular allocations vs.
  address-constrained allocations is now overed by a dedicated
  overload instead of relying on a default argument.

- The 'align' argument has been changed from 'int' to 'unsigned'
  to be better compatible with 'addr_t' and 'size_t'.

Fixes #4067
This commit is contained in:
Norman Feske
2021-04-06 16:20:01 +02:00
parent 97d44c5a79
commit f925fef17b
14 changed files with 68 additions and 49 deletions

View File

@ -34,7 +34,8 @@ void * Mapped_avl_allocator::map_addr(void * addr)
Range_allocator::Alloc_return
Mapped_mem_allocator::alloc_aligned(size_t size, void **out_addr, int align, addr_t from, addr_t to)
Mapped_mem_allocator::alloc_aligned(size_t size, void **out_addr,
unsigned align, Range range)
{
size_t page_rounded_size = align_addr(size, get_page_size_log2());
void *phys_addr = 0;
@ -42,7 +43,7 @@ Mapped_mem_allocator::alloc_aligned(size_t size, void **out_addr, int align, add
/* allocate physical pages */
Alloc_return ret1 = _phys_alloc->alloc_aligned(page_rounded_size,
&phys_addr, align, from, to);
&phys_addr, align, range);
if (!ret1.ok()) {
error("Could not allocate physical memory region of size ",
page_rounded_size);

View File

@ -165,15 +165,16 @@ class Genode::Mapped_mem_allocator : public Genode::Core_mem_translator
int add_range(addr_t, size_t) override { return -1; }
int remove_range(addr_t, size_t) override { return -1; }
Alloc_return alloc_aligned(size_t, void **, int, addr_t from = 0,
addr_t to = ~0UL) override;
Alloc_return alloc_aligned(size_t, void **, unsigned, Range) override;
Alloc_return alloc_addr(size_t, addr_t) override {
return Alloc_return::RANGE_CONFLICT; }
void free(void *) override;
size_t avail() const override { return _phys_alloc->avail(); }
bool valid_addr(addr_t addr) const override {
void free(void *) override;
size_t avail() const override { return _phys_alloc->avail(); }
bool valid_addr(addr_t addr) const override {
return _virt_alloc->valid_addr(addr); }
using Range_allocator::alloc_aligned; /* import overloads */
/*************************
** Allocator interface **
@ -280,11 +281,11 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
Alloc_return alloc_addr(size_t, addr_t) override {
return Alloc_return::RANGE_CONFLICT; }
Alloc_return alloc_aligned(size_t size, void **out_addr, int align,
addr_t from = 0, addr_t to = ~0UL) override
Alloc_return alloc_aligned(size_t size, void **out_addr,
unsigned align, Range range) override
{
Mutex::Guard lock_guard(_mutex);
return _mem_alloc.alloc_aligned(size, out_addr, align, from, to);
return _mem_alloc.alloc_aligned(size, out_addr, align, range);
}
void free(void *addr) override
@ -297,6 +298,8 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator
bool valid_addr(addr_t addr) const override { return _virt_alloc.valid_addr(addr); }
using Range_allocator::alloc_aligned; /* import overloads */
/*************************
** Allocator interface **

View File

@ -32,7 +32,8 @@ class Genode::Ram_dataspace_factory : public Ram_allocator,
{
public:
struct Phys_range { addr_t start, end; };
typedef Range_allocator::Range Phys_range;
static Phys_range any_phys_range() { return { 0UL, ~0UL }; }
struct Virt_range { addr_t start, size; };

View File

@ -93,9 +93,9 @@ 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,
addr_t from = 0, addr_t to = ~0UL) override {
return _synced_object()->alloc_aligned(size, out_addr, align, from, to); }
Alloc_return alloc_aligned(size_t size, void **out_addr,
unsigned align, Range range) override {
return _synced_object()->alloc_aligned(size, out_addr, align, range); }
Alloc_return alloc_addr(size_t size, addr_t addr) override {
return _synced_object()->alloc_addr(size, addr); }
@ -108,6 +108,8 @@ class Genode::Synced_range_allocator : public Range_allocator
bool valid_addr(addr_t addr) const override {
return _synced_object()->valid_addr(addr); }
using Range_allocator::alloc_aligned; /* import overloads */
};
#endif /* _CORE__INCLUDE__SYNCED_RANGE_ALLOCATOR_H_ */

View File

@ -47,10 +47,12 @@ Ram_dataspace_factory::alloc(size_t ds_size, Cache_attribute cached)
* constraints.
*/
if (_phys_range.start == 0 && _phys_range.end == ~0UL) {
addr_t const high_start = (sizeof(void *) == 4 ? 3UL : 4UL) << 30;
addr_t const high_start = (sizeof(void *) == 4 ? 3UL : 4UL) << 30;
Phys_range const range { .start = high_start, .end = _phys_range.end };
for (size_t align_log2 = log2(ds_size); align_log2 >= 12; align_log2--) {
if (_phys_alloc.alloc_aligned(ds_size, &ds_addr, align_log2,
high_start, _phys_range.end).ok()) {
if (_phys_alloc.alloc_aligned(ds_size, &ds_addr, align_log2, range).ok()) {
alloc_succeeded = true;
break;
}
@ -61,7 +63,7 @@ Ram_dataspace_factory::alloc(size_t ds_size, Cache_attribute cached)
if (!alloc_succeeded) {
for (size_t align_log2 = log2(ds_size); align_log2 >= 12; align_log2--) {
if (_phys_alloc.alloc_aligned(ds_size, &ds_addr, align_log2,
_phys_range.start, _phys_range.end).ok()) {
_phys_range).ok()) {
alloc_succeeded = true;
break;
}