Commit f75fb889 authored by Mel Gorman's avatar Mel Gorman Committed by Linus Torvalds

mm, page_alloc: avoid unnecessary zone lookups during pageblock operations

Pageblocks have an associated bitmap to store migrate types and whether
the pageblock should be skipped during compaction.  The bitmap may be
associated with a memory section or a zone but the zone is looked up
unconditionally.  The compiler should optimise this away automatically
so this is a cosmetic patch only in many cases.
Signed-off-by: default avatarMel Gorman <mgorman@techsingularity.net>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
Cc: Jesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 754078eb
...@@ -6767,23 +6767,23 @@ void *__init alloc_large_system_hash(const char *tablename, ...@@ -6767,23 +6767,23 @@ void *__init alloc_large_system_hash(const char *tablename,
} }
/* Return a pointer to the bitmap storing bits affecting a block of pages */ /* Return a pointer to the bitmap storing bits affecting a block of pages */
static inline unsigned long *get_pageblock_bitmap(struct zone *zone, static inline unsigned long *get_pageblock_bitmap(struct page *page,
unsigned long pfn) unsigned long pfn)
{ {
#ifdef CONFIG_SPARSEMEM #ifdef CONFIG_SPARSEMEM
return __pfn_to_section(pfn)->pageblock_flags; return __pfn_to_section(pfn)->pageblock_flags;
#else #else
return zone->pageblock_flags; return page_zone(page)->pageblock_flags;
#endif /* CONFIG_SPARSEMEM */ #endif /* CONFIG_SPARSEMEM */
} }
static inline int pfn_to_bitidx(struct zone *zone, unsigned long pfn) static inline int pfn_to_bitidx(struct page *page, unsigned long pfn)
{ {
#ifdef CONFIG_SPARSEMEM #ifdef CONFIG_SPARSEMEM
pfn &= (PAGES_PER_SECTION-1); pfn &= (PAGES_PER_SECTION-1);
return (pfn >> pageblock_order) * NR_PAGEBLOCK_BITS; return (pfn >> pageblock_order) * NR_PAGEBLOCK_BITS;
#else #else
pfn = pfn - round_down(zone->zone_start_pfn, pageblock_nr_pages); pfn = pfn - round_down(page_zone(page)->zone_start_pfn, pageblock_nr_pages);
return (pfn >> pageblock_order) * NR_PAGEBLOCK_BITS; return (pfn >> pageblock_order) * NR_PAGEBLOCK_BITS;
#endif /* CONFIG_SPARSEMEM */ #endif /* CONFIG_SPARSEMEM */
} }
...@@ -6801,14 +6801,12 @@ unsigned long get_pfnblock_flags_mask(struct page *page, unsigned long pfn, ...@@ -6801,14 +6801,12 @@ unsigned long get_pfnblock_flags_mask(struct page *page, unsigned long pfn,
unsigned long end_bitidx, unsigned long end_bitidx,
unsigned long mask) unsigned long mask)
{ {
struct zone *zone;
unsigned long *bitmap; unsigned long *bitmap;
unsigned long bitidx, word_bitidx; unsigned long bitidx, word_bitidx;
unsigned long word; unsigned long word;
zone = page_zone(page); bitmap = get_pageblock_bitmap(page, pfn);
bitmap = get_pageblock_bitmap(zone, pfn); bitidx = pfn_to_bitidx(page, pfn);
bitidx = pfn_to_bitidx(zone, pfn);
word_bitidx = bitidx / BITS_PER_LONG; word_bitidx = bitidx / BITS_PER_LONG;
bitidx &= (BITS_PER_LONG-1); bitidx &= (BITS_PER_LONG-1);
...@@ -6830,20 +6828,18 @@ void set_pfnblock_flags_mask(struct page *page, unsigned long flags, ...@@ -6830,20 +6828,18 @@ void set_pfnblock_flags_mask(struct page *page, unsigned long flags,
unsigned long end_bitidx, unsigned long end_bitidx,
unsigned long mask) unsigned long mask)
{ {
struct zone *zone;
unsigned long *bitmap; unsigned long *bitmap;
unsigned long bitidx, word_bitidx; unsigned long bitidx, word_bitidx;
unsigned long old_word, word; unsigned long old_word, word;
BUILD_BUG_ON(NR_PAGEBLOCK_BITS != 4); BUILD_BUG_ON(NR_PAGEBLOCK_BITS != 4);
zone = page_zone(page); bitmap = get_pageblock_bitmap(page, pfn);
bitmap = get_pageblock_bitmap(zone, pfn); bitidx = pfn_to_bitidx(page, pfn);
bitidx = pfn_to_bitidx(zone, pfn);
word_bitidx = bitidx / BITS_PER_LONG; word_bitidx = bitidx / BITS_PER_LONG;
bitidx &= (BITS_PER_LONG-1); bitidx &= (BITS_PER_LONG-1);
VM_BUG_ON_PAGE(!zone_spans_pfn(zone, pfn), page); VM_BUG_ON_PAGE(!zone_spans_pfn(page_zone(page), pfn), page);
bitidx += end_bitidx; bitidx += end_bitidx;
mask <<= (BITS_PER_LONG - bitidx - 1); mask <<= (BITS_PER_LONG - bitidx - 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment