|
@@ -528,21 +528,18 @@ read_page_owner(struct file *file, char __user *buf, size_t count, loff_t *ppos)
|
|
|
|
|
|
static void init_pages_in_zone(pg_data_t *pgdat, struct zone *zone)
|
|
|
{
|
|
|
- struct page *page;
|
|
|
- struct page_ext *page_ext;
|
|
|
- unsigned long pfn = zone->zone_start_pfn, block_end_pfn;
|
|
|
- unsigned long end_pfn = pfn + zone->spanned_pages;
|
|
|
+ unsigned long pfn = zone->zone_start_pfn;
|
|
|
+ unsigned long end_pfn = zone_end_pfn(zone);
|
|
|
unsigned long count = 0;
|
|
|
|
|
|
- /* Scan block by block. First and last block may be incomplete */
|
|
|
- pfn = zone->zone_start_pfn;
|
|
|
-
|
|
|
/*
|
|
|
* Walk the zone in pageblock_nr_pages steps. If a page block spans
|
|
|
* a zone boundary, it will be double counted between zones. This does
|
|
|
* not matter as the mixed block count will still be correct
|
|
|
*/
|
|
|
for (; pfn < end_pfn; ) {
|
|
|
+ unsigned long block_end_pfn;
|
|
|
+
|
|
|
if (!pfn_valid(pfn)) {
|
|
|
pfn = ALIGN(pfn + 1, MAX_ORDER_NR_PAGES);
|
|
|
continue;
|
|
@@ -551,9 +548,10 @@ static void init_pages_in_zone(pg_data_t *pgdat, struct zone *zone)
|
|
|
block_end_pfn = ALIGN(pfn + 1, pageblock_nr_pages);
|
|
|
block_end_pfn = min(block_end_pfn, end_pfn);
|
|
|
|
|
|
- page = pfn_to_page(pfn);
|
|
|
-
|
|
|
for (; pfn < block_end_pfn; pfn++) {
|
|
|
+ struct page *page;
|
|
|
+ struct page_ext *page_ext;
|
|
|
+
|
|
|
if (!pfn_valid_within(pfn))
|
|
|
continue;
|
|
|
|