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:
Родитель
dbe3039e64
Коммит
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 */
|
||||
|
|
Загрузка…
Ссылка в новой задаче