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);
|
extern void memblock_dump_all(void);
|
||||||
|
|
||||||
|
/* Obsolete accessors */
|
||||||
static inline u64
|
static inline u64
|
||||||
memblock_size_bytes(struct memblock_type *type, unsigned long region_nr)
|
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);
|
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 /* __KERNEL__ */
|
||||||
|
|
||||||
#endif /* _LINUX_MEMBLOCK_H */
|
#endif /* _LINUX_MEMBLOCK_H */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче