On Wed, Mar 11, 2020 at 06:58:00PM +0100, Vlastimil Babka wrote: > On 3/8/20 2:23 PM, Rik van Riel wrote: > > On Sat, 2020-03-07 at 14:38 -0800, Andrew Morton wrote: > >> On Fri, 6 Mar 2020 15:01:02 -0500 Rik van Riel <riel@xxxxxxxxxxx> > >> wrote: > > > >> > --- a/mm/page_alloc.c > >> > +++ b/mm/page_alloc.c > >> > @@ -2711,6 +2711,18 @@ __rmqueue(struct zone *zone, unsigned int > >> > order, int migratetype, > >> > { > >> > struct page *page; > >> > > >> > + /* > >> > + * Balance movable allocations between regular and CMA areas by > >> > + * allocating from CMA when over half of the zone's free memory > >> > + * is in the CMA area. > >> > + */ > >> > + if (migratetype == MIGRATE_MOVABLE && > >> > + zone_page_state(zone, NR_FREE_CMA_PAGES) > > >> > + zone_page_state(zone, NR_FREE_PAGES) / 2) { > >> > + page = __rmqueue_cma_fallback(zone, order); > >> > + if (page) > >> > + return page; > >> > + } > >> > retry: > >> > page = __rmqueue_smallest(zone, order, migratetype); > >> > if (unlikely(!page)) { > >> > >> __rmqueue() is a hot path (as much as any per-page operation can be a > >> hot path). What is the impact here? > > > > That is a good question. For MIGRATE_MOVABLE allocations, > > most allocations seem to be order 0, which go through the > > per cpu pages array, and rmqueue_pcplist, or be order 9. > > > > For order 9 allocations, other things seem likely to dominate > > the allocation anyway, while for order 0 allocations the > > pcp list should take away the sting? > > I agree it should be in the noise. But please do put it behind CONFIG_CMA > #ifdef. My x86_64 desktop distro kernel doesn't have CONFIG_CMA. Even if this is > effectively no-op with __rmqueue_cma_fallback() returning NULL immediately, I > think the compiler cannot eliminate the two zone_page_state()'s which are > atomic_long_read(), even if it's just ultimately READ_ONCE() here, that's a > volatile cast which means elimination not possible AFAIK? Other architectures > might be even more involved. I agree. Andrew, can you, please, squash the following diff into the patch? Thank you! -- diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 7d9067b75dcb..bc65931b3901 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2767,6 +2767,7 @@ __rmqueue(struct zone *zone, unsigned int order, int migratetype, { struct page *page; +#ifdef CONFIG_CMA /* * Balance movable allocations between regular and CMA areas by * allocating from CMA when over half of the zone's free memory @@ -2779,6 +2780,7 @@ __rmqueue(struct zone *zone, unsigned int order, int migratetype, if (page) return page; } +#endif retry: page = __rmqueue_smallest(zone, order, migratetype); if (unlikely(!page)) {