diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 31 |
1 files changed, 12 insertions, 19 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 25b82be438d7..fd42321c02f0 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -1631,11 +1631,9 @@ static unsigned long __init deferred_init_pages(struct zone *zone, | |||
1631 | static int __init deferred_init_memmap(void *data) | 1631 | static int __init deferred_init_memmap(void *data) |
1632 | { | 1632 | { |
1633 | pg_data_t *pgdat = data; | 1633 | pg_data_t *pgdat = data; |
1634 | int nid = pgdat->node_id; | ||
1635 | unsigned long start = jiffies; | 1634 | unsigned long start = jiffies; |
1636 | unsigned long nr_pages = 0; | 1635 | unsigned long nr_pages = 0; |
1637 | unsigned long spfn, epfn, first_init_pfn, flags; | 1636 | unsigned long spfn, epfn, first_init_pfn, flags; |
1638 | phys_addr_t spa, epa; | ||
1639 | int zid; | 1637 | int zid; |
1640 | struct zone *zone; | 1638 | struct zone *zone; |
1641 | const struct cpumask *cpumask = cpumask_of_node(pgdat->node_id); | 1639 | const struct cpumask *cpumask = cpumask_of_node(pgdat->node_id); |
@@ -1672,14 +1670,12 @@ static int __init deferred_init_memmap(void *data) | |||
1672 | * freeing pages we can access pages that are ahead (computing buddy | 1670 | * freeing pages we can access pages that are ahead (computing buddy |
1673 | * page in __free_one_page()). | 1671 | * page in __free_one_page()). |
1674 | */ | 1672 | */ |
1675 | for_each_free_mem_range(i, nid, MEMBLOCK_NONE, &spa, &epa, NULL) { | 1673 | for_each_free_mem_pfn_range_in_zone(i, zone, &spfn, &epfn) { |
1676 | spfn = max_t(unsigned long, first_init_pfn, PFN_UP(spa)); | 1674 | spfn = max_t(unsigned long, first_init_pfn, spfn); |
1677 | epfn = min_t(unsigned long, zone_end_pfn(zone), PFN_DOWN(epa)); | ||
1678 | nr_pages += deferred_init_pages(zone, spfn, epfn); | 1675 | nr_pages += deferred_init_pages(zone, spfn, epfn); |
1679 | } | 1676 | } |
1680 | for_each_free_mem_range(i, nid, MEMBLOCK_NONE, &spa, &epa, NULL) { | 1677 | for_each_free_mem_pfn_range_in_zone(i, zone, &spfn, &epfn) { |
1681 | spfn = max_t(unsigned long, first_init_pfn, PFN_UP(spa)); | 1678 | spfn = max_t(unsigned long, first_init_pfn, spfn); |
1682 | epfn = min_t(unsigned long, zone_end_pfn(zone), PFN_DOWN(epa)); | ||
1683 | deferred_free_pages(spfn, epfn); | 1679 | deferred_free_pages(spfn, epfn); |
1684 | } | 1680 | } |
1685 | pgdat_resize_unlock(pgdat, &flags); | 1681 | pgdat_resize_unlock(pgdat, &flags); |
@@ -1687,8 +1683,8 @@ static int __init deferred_init_memmap(void *data) | |||
1687 | /* Sanity check that the next zone really is unpopulated */ | 1683 | /* Sanity check that the next zone really is unpopulated */ |
1688 | WARN_ON(++zid < MAX_NR_ZONES && populated_zone(++zone)); | 1684 | WARN_ON(++zid < MAX_NR_ZONES && populated_zone(++zone)); |
1689 | 1685 | ||
1690 | pr_info("node %d initialised, %lu pages in %ums\n", nid, nr_pages, | 1686 | pr_info("node %d initialised, %lu pages in %ums\n", |
1691 | jiffies_to_msecs(jiffies - start)); | 1687 | pgdat->node_id, nr_pages, jiffies_to_msecs(jiffies - start)); |
1692 | 1688 | ||
1693 | pgdat_init_report_one_done(); | 1689 | pgdat_init_report_one_done(); |
1694 | return 0; | 1690 | return 0; |
@@ -1712,13 +1708,11 @@ static int __init deferred_init_memmap(void *data) | |||
1712 | static noinline bool __init | 1708 | static noinline bool __init |
1713 | deferred_grow_zone(struct zone *zone, unsigned int order) | 1709 | deferred_grow_zone(struct zone *zone, unsigned int order) |
1714 | { | 1710 | { |
1715 | int nid = zone_to_nid(zone); | ||
1716 | pg_data_t *pgdat = NODE_DATA(nid); | ||
1717 | unsigned long nr_pages_needed = ALIGN(1 << order, PAGES_PER_SECTION); | 1711 | unsigned long nr_pages_needed = ALIGN(1 << order, PAGES_PER_SECTION); |
1712 | pg_data_t *pgdat = zone->zone_pgdat; | ||
1718 | unsigned long nr_pages = 0; | 1713 | unsigned long nr_pages = 0; |
1719 | unsigned long first_init_pfn, spfn, epfn, t, flags; | 1714 | unsigned long first_init_pfn, spfn, epfn, t, flags; |
1720 | unsigned long first_deferred_pfn = pgdat->first_deferred_pfn; | 1715 | unsigned long first_deferred_pfn = pgdat->first_deferred_pfn; |
1721 | phys_addr_t spa, epa; | ||
1722 | u64 i; | 1716 | u64 i; |
1723 | 1717 | ||
1724 | /* Only the last zone may have deferred pages */ | 1718 | /* Only the last zone may have deferred pages */ |
@@ -1754,9 +1748,8 @@ deferred_grow_zone(struct zone *zone, unsigned int order) | |||
1754 | return false; | 1748 | return false; |
1755 | } | 1749 | } |
1756 | 1750 | ||
1757 | for_each_free_mem_range(i, nid, MEMBLOCK_NONE, &spa, &epa, NULL) { | 1751 | for_each_free_mem_pfn_range_in_zone(i, zone, &spfn, &epfn) { |
1758 | spfn = max_t(unsigned long, first_init_pfn, PFN_UP(spa)); | 1752 | spfn = max_t(unsigned long, first_init_pfn, spfn); |
1759 | epfn = min_t(unsigned long, zone_end_pfn(zone), PFN_DOWN(epa)); | ||
1760 | 1753 | ||
1761 | while (spfn < epfn && nr_pages < nr_pages_needed) { | 1754 | while (spfn < epfn && nr_pages < nr_pages_needed) { |
1762 | t = ALIGN(spfn + PAGES_PER_SECTION, PAGES_PER_SECTION); | 1755 | t = ALIGN(spfn + PAGES_PER_SECTION, PAGES_PER_SECTION); |
@@ -1770,9 +1763,9 @@ deferred_grow_zone(struct zone *zone, unsigned int order) | |||
1770 | break; | 1763 | break; |
1771 | } | 1764 | } |
1772 | 1765 | ||
1773 | for_each_free_mem_range(i, nid, MEMBLOCK_NONE, &spa, &epa, NULL) { | 1766 | for_each_free_mem_pfn_range_in_zone(i, zone, &spfn, &epfn) { |
1774 | spfn = max_t(unsigned long, first_init_pfn, PFN_UP(spa)); | 1767 | spfn = max_t(unsigned long, first_init_pfn, spfn); |
1775 | epfn = min_t(unsigned long, first_deferred_pfn, PFN_DOWN(epa)); | 1768 | epfn = min_t(unsigned long, first_deferred_pfn, epfn); |
1776 | deferred_free_pages(spfn, epfn); | 1769 | deferred_free_pages(spfn, epfn); |
1777 | 1770 | ||
1778 | if (first_deferred_pfn == epfn) | 1771 | if (first_deferred_pfn == epfn) |