mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-23 09:56:00 +00:00
memblock: Introduce for_each_memblock() and new accessors
Walk memblock's using for_each_memblock() and use memblock_region_base/end_pfn() for getting to PFNs. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
dbe3039e64
commit
5b385f259f
@ -64,6 +64,7 @@ extern int memblock_find(struct memblock_region *res);
|
||||
|
||||
extern void memblock_dump_all(void);
|
||||
|
||||
/* Obsolete accessors */
|
||||
static inline u64
|
||||
memblock_size_bytes(struct memblock_type *type, unsigned long region_nr)
|
||||
{
|
||||
@ -86,6 +87,57 @@ memblock_end_pfn(struct memblock_type *type, unsigned long region_nr)
|
||||
memblock_size_pages(type, region_nr);
|
||||
}
|
||||
|
||||
/*
|
||||
* pfn conversion functions
|
||||
*
|
||||
* While the memory MEMBLOCKs should always be page aligned, the reserved
|
||||
* MEMBLOCKs may not be. This accessor attempt to provide a very clear
|
||||
* idea of what they return for such non aligned MEMBLOCKs.
|
||||
*/
|
||||
|
||||
/**
|
||||
* memblock_region_base_pfn - Return the lowest pfn intersecting with the region
|
||||
* @reg: memblock_region structure
|
||||
*/
|
||||
static inline unsigned long memblock_region_base_pfn(const struct memblock_region *reg)
|
||||
{
|
||||
return reg->base >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
/**
|
||||
* memblock_region_last_pfn - Return the highest pfn intersecting with the region
|
||||
* @reg: memblock_region structure
|
||||
*/
|
||||
static inline unsigned long memblock_region_last_pfn(const struct memblock_region *reg)
|
||||
{
|
||||
return (reg->base + reg->size - 1) >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
/**
|
||||
* memblock_region_end_pfn - Return the pfn of the first page following the region
|
||||
* but not intersecting it
|
||||
* @reg: memblock_region structure
|
||||
*/
|
||||
static inline unsigned long memblock_region_end_pfn(const struct memblock_region *reg)
|
||||
{
|
||||
return memblock_region_last_pfn(reg) + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* memblock_region_pages - Return the number of pages covering a region
|
||||
* @reg: memblock_region structure
|
||||
*/
|
||||
static inline unsigned long memblock_region_pages(const struct memblock_region *reg)
|
||||
{
|
||||
return memblock_region_end_pfn(reg) - memblock_region_end_pfn(reg);
|
||||
}
|
||||
|
||||
#define for_each_memblock(memblock_type, region) \
|
||||
for (region = memblock.memblock_type.regions; \
|
||||
region < (memblock.memblock_type.regions + memblock.memblock_type.cnt); \
|
||||
region++)
|
||||
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _LINUX_MEMBLOCK_H */
|
||||
|
Loading…
Reference in New Issue
Block a user