mirror of
https://github.com/S3NEO/android_kernel_samsung_msm8226.git
synced 2024-09-22 12:31:33 +00:00
memblock: Implement memblock_is_memory and memblock_is_region_memory
To make it fast, we steal ARM's binary search for memblock_is_memory() and we use that to also the replace existing implementation of memblock_is_reserved(). Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
411a25a80d
commit
72d4b0b4e0
2 changed files with 36 additions and 8 deletions
|
@ -56,6 +56,8 @@ extern u64 __init __memblock_alloc_base(u64 size,
|
||||||
extern u64 __init memblock_phys_mem_size(void);
|
extern u64 __init memblock_phys_mem_size(void);
|
||||||
extern u64 memblock_end_of_DRAM(void);
|
extern u64 memblock_end_of_DRAM(void);
|
||||||
extern void __init memblock_enforce_memory_limit(u64 memory_limit);
|
extern void __init memblock_enforce_memory_limit(u64 memory_limit);
|
||||||
|
extern int memblock_is_memory(u64 addr);
|
||||||
|
extern int memblock_is_region_memory(u64 base, u64 size);
|
||||||
extern int __init memblock_is_reserved(u64 addr);
|
extern int __init memblock_is_reserved(u64 addr);
|
||||||
extern int memblock_is_region_reserved(u64 base, u64 size);
|
extern int memblock_is_region_reserved(u64 base, u64 size);
|
||||||
extern int memblock_find(struct memblock_region *res);
|
extern int memblock_find(struct memblock_region *res);
|
||||||
|
|
|
@ -487,17 +487,43 @@ void __init memblock_enforce_memory_limit(u64 memory_limit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int memblock_search(struct memblock_type *type, u64 addr)
|
||||||
|
{
|
||||||
|
unsigned int left = 0, right = type->cnt;
|
||||||
|
|
||||||
|
do {
|
||||||
|
unsigned int mid = (right + left) / 2;
|
||||||
|
|
||||||
|
if (addr < type->regions[mid].base)
|
||||||
|
right = mid;
|
||||||
|
else if (addr >= (type->regions[mid].base +
|
||||||
|
type->regions[mid].size))
|
||||||
|
left = mid + 1;
|
||||||
|
else
|
||||||
|
return mid;
|
||||||
|
} while (left < right);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
int __init memblock_is_reserved(u64 addr)
|
int __init memblock_is_reserved(u64 addr)
|
||||||
{
|
{
|
||||||
int i;
|
return memblock_search(&memblock.reserved, addr) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < memblock.reserved.cnt; i++) {
|
int memblock_is_memory(u64 addr)
|
||||||
u64 upper = memblock.reserved.regions[i].base +
|
{
|
||||||
memblock.reserved.regions[i].size - 1;
|
return memblock_search(&memblock.memory, addr) != -1;
|
||||||
if ((addr >= memblock.reserved.regions[i].base) && (addr <= upper))
|
}
|
||||||
return 1;
|
|
||||||
}
|
int memblock_is_region_memory(u64 base, u64 size)
|
||||||
return 0;
|
{
|
||||||
|
int idx = memblock_search(&memblock.reserved, base);
|
||||||
|
|
||||||
|
if (idx == -1)
|
||||||
|
return 0;
|
||||||
|
return memblock.reserved.regions[idx].base <= base &&
|
||||||
|
(memblock.reserved.regions[idx].base +
|
||||||
|
memblock.reserved.regions[idx].size) >= (base + size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int memblock_is_region_reserved(u64 base, u64 size)
|
int memblock_is_region_reserved(u64 base, u64 size)
|
||||||
|
|
Loading…
Reference in a new issue