diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2010-08-03 23:40:38 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2010-08-04 00:38:57 -0400 |
commit | 5b385f259fa4d356452e3b4729cbaf5213f4f55b (patch) | |
tree | 17bfa3a22d367eb80b4720275579407917a70f4b /include/linux/memblock.h | |
parent | dbe3039e64b1dd4cf26f782d45b524f85b444ad4 (diff) |
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>
Diffstat (limited to 'include/linux/memblock.h')
-rw-r--r-- | include/linux/memblock.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/include/linux/memblock.h b/include/linux/memblock.h index 47bceb187058..c914112cd24f 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h | |||
@@ -64,6 +64,7 @@ extern int memblock_find(struct memblock_region *res); | |||
64 | 64 | ||
65 | extern void memblock_dump_all(void); | 65 | extern void memblock_dump_all(void); |
66 | 66 | ||
67 | /* Obsolete accessors */ | ||
67 | static inline u64 | 68 | static inline u64 |
68 | memblock_size_bytes(struct memblock_type *type, unsigned long region_nr) | 69 | memblock_size_bytes(struct memblock_type *type, unsigned long region_nr) |
69 | { | 70 | { |
@@ -86,6 +87,57 @@ memblock_end_pfn(struct memblock_type *type, unsigned long region_nr) | |||
86 | memblock_size_pages(type, region_nr); | 87 | memblock_size_pages(type, region_nr); |
87 | } | 88 | } |
88 | 89 | ||
90 | /* | ||
91 | * pfn conversion functions | ||
92 | * | ||
93 | * While the memory MEMBLOCKs should always be page aligned, the reserved | ||
94 | * MEMBLOCKs may not be. This accessor attempt to provide a very clear | ||
95 | * idea of what they return for such non aligned MEMBLOCKs. | ||
96 | */ | ||
97 | |||
98 | /** | ||
99 | * memblock_region_base_pfn - Return the lowest pfn intersecting with the region | ||
100 | * @reg: memblock_region structure | ||
101 | */ | ||
102 | static inline unsigned long memblock_region_base_pfn(const struct memblock_region *reg) | ||
103 | { | ||
104 | return reg->base >> PAGE_SHIFT; | ||
105 | } | ||
106 | |||
107 | /** | ||
108 | * memblock_region_last_pfn - Return the highest pfn intersecting with the region | ||
109 | * @reg: memblock_region structure | ||
110 | */ | ||
111 | static inline unsigned long memblock_region_last_pfn(const struct memblock_region *reg) | ||
112 | { | ||
113 | return (reg->base + reg->size - 1) >> PAGE_SHIFT; | ||
114 | } | ||
115 | |||
116 | /** | ||
117 | * memblock_region_end_pfn - Return the pfn of the first page following the region | ||
118 | * but not intersecting it | ||
119 | * @reg: memblock_region structure | ||
120 | */ | ||
121 | static inline unsigned long memblock_region_end_pfn(const struct memblock_region *reg) | ||
122 | { | ||
123 | return memblock_region_last_pfn(reg) + 1; | ||
124 | } | ||
125 | |||
126 | /** | ||
127 | * memblock_region_pages - Return the number of pages covering a region | ||
128 | * @reg: memblock_region structure | ||
129 | */ | ||
130 | static inline unsigned long memblock_region_pages(const struct memblock_region *reg) | ||
131 | { | ||
132 | return memblock_region_end_pfn(reg) - memblock_region_end_pfn(reg); | ||
133 | } | ||
134 | |||
135 | #define for_each_memblock(memblock_type, region) \ | ||
136 | for (region = memblock.memblock_type.regions; \ | ||
137 | region < (memblock.memblock_type.regions + memblock.memblock_type.cnt); \ | ||
138 | region++) | ||
139 | |||
140 | |||
89 | #endif /* __KERNEL__ */ | 141 | #endif /* __KERNEL__ */ |
90 | 142 | ||
91 | #endif /* _LINUX_MEMBLOCK_H */ | 143 | #endif /* _LINUX_MEMBLOCK_H */ |