linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mel Gorman <mgorman@suse.de>
To: Minchan Kim <minchan@kernel.org>
Cc: Xishi Qiu <qiuxishi@huawei.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	riel@redhat.com, aquini@redhat.com, linux-mm@kvack.org,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] mm: skip the page buddy block instead of one page
Date: Wed, 14 Aug 2013 19:00:12 +0100	[thread overview]
Message-ID: <20130814180012.GO2296@suse.de> (raw)
In-Reply-To: <20130814163921.GC2706@gmail.com>

On Thu, Aug 15, 2013 at 01:39:21AM +0900, Minchan Kim wrote:
> On Wed, Aug 14, 2013 at 05:16:42PM +0100, Mel Gorman wrote:
> > On Thu, Aug 15, 2013 at 12:52:29AM +0900, Minchan Kim wrote:
> > > Hi Mel,
> > > 
> > > On Wed, Aug 14, 2013 at 09:57:11AM +0100, Mel Gorman wrote:
> > > > On Wed, Aug 14, 2013 at 12:45:41PM +0800, Xishi Qiu wrote:
> > > > > A large free page buddy block will continue many times, so if the page 
> > > > > is free, skip the whole page buddy block instead of one page.
> > > > > 
> > > > > Signed-off-by: Xishi Qiu <qiuxishi@huawei.com>
> > > > 
> > > > page_order cannot be used unless zone->lock is held which is not held in
> > > > this path. Acquiring the lock would prevent parallel allocations from the
> > > 
> > > Argh, I missed that. And it seems you already pointed it out long time ago
> > > someone try to do same things if I remember correctly. :(
> > 
> > It feels familiar but I do not remember why.
> > 
> > > But let's think about it more.
> > > 
> > > It's always not right because CMA and memory-hotplug already isolated
> > > free pages in the range to MIGRATE_ISOLATE right before starting migration
> > > so we could use page_order safely in those contexts even if we don't hold
> > > zone->lock.
> > >  
> > 
> > Both of those are teh corner cases. Neither operation happen frequently
> > in comparison to something like THP allocations for example. I think an
> > optimisation along those lines is marginal at best.
> 
> In embedded side, we don't use THP yet but uses CMA and memory-hotplug so
> your claim isn't the case for the embedded world.

I thought CMA was only used when certain devices require large
contiguous ranges of memory. The expectation was that such allocations
are relatively rare and the cost savings from this patch would not be
measurable. Considering how heavy the memory hotplug operation is I also
severely doubt that not being able to skip over PageBuddy pages in
compaction is noticable.

> > >  		/* Skip if free */
> > > -		if (PageBuddy(page))
> > > +		if (PageBuddy(page)) {
> > > +			/*
> > > +			 * page_order is racy without zone->lock but worst case
> > > +			 * by the racing is just skipping pageblock_nr_pages.
> > > +			 * but even the race is really unlikely by double
> > > +			 * check of PageBuddy.
> > > +			 */
> > > +			unsigned long order = page_order(page);
> > > +			if (PageBuddy(page))
> > > +				low_pfn += (1 << order) - 1;
> > >  			continue;
> > > +		}
> > >  
> > 
> > Even if the page is still page buddy, there is no guarantee that it's
> > the same page order as the first read. It could have be currently
> > merging with adjacent buddies for example. There is also a really
> > small race that a page was freed, allocated with some number stuffed
> > into page->private and freed again before the second PageBuddy check.
> > It's a bit of a hand grenade. How much of a performance benefit is there
> 
> 1. Just worst case is skipping pageblock_nr_pages

No, the worst case is that page_order returns a number that is
completely garbage and low_pfn goes off the end of the zone

> 2. Race is really small
> 3. Higher order page allocation customer always have graceful fallback.
> 
> If you really have a concern about that, we can add following.
> 
> -		if (PageBuddy(page))
> +		if (PageBuddy(page)) {
> +#ifdef CONFIG_MEMORY_ISOLATION
> +			/*
> +			 * memory-hotplug and CMA already move free pages to
> +			 * MIGRATE_ISOLATE so we can use page_order safely
> +			 * without zone->lock.
> +			 */
> +			if (PageBuddy(page))
> +				low_pfn += (1 << page_order(page)) - 1;
> +#endif
>  			continue;
> +		}

How does that help anything? MEMORY_ISOLATION is set in distribution
configs and there is no guarantee at all and the same race exists. If it
was going to be anything it would be something like this untested hack

/*
 * It is not safe to call page_order(page) for a PageBuddy page without
 * holding the zone lock as the order can change or the page allocated.
 * Check PageBuddy after reading page_order to minimise the race. As
 * the value could still be stale, make sure that we do not accidentally
 * skip past the end of the largest page the buddy allocator handles.
 */
if (PageBuddy(page)) {
	int nr_pages = (1 << page_order(page)) - 1;
	if (PageBuddy(page)) {
		nr_pages = min(nr_pages, MAX_ORDER_NR_PAGES - 1);
		low_pfn += nr_pages;
		continue;
	}
}

It's still race-prone meaning that it really should be backed by some
performance data justifying it.

-- 
Mel Gorman
SUSE Labs

  reply	other threads:[~2013-08-14 18:00 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-14  4:45 [PATCH] mm: skip the page buddy block instead of one page Xishi Qiu
2013-08-14  7:07 ` Minchan Kim
2013-08-14  8:57 ` Mel Gorman
2013-08-14  9:14   ` Xishi Qiu
2013-08-14 15:52   ` Minchan Kim
2013-08-14 16:16     ` Mel Gorman
2013-08-14 16:39       ` Minchan Kim
2013-08-14 18:00         ` Mel Gorman [this message]
2013-08-14 19:11           ` Minchan Kim
2013-08-15  2:32           ` Xishi Qiu
2013-08-15  2:44             ` Minchan Kim
2013-08-15  3:46               ` Xishi Qiu
2013-08-15  4:17                 ` Minchan Kim
2013-08-15  4:24                   ` Minchan Kim
2013-08-15  7:45                     ` Xishi Qiu
     [not found]                       ` <20130815095102.GA4449@hacker.(null)>
2013-08-15 11:15                         ` Xishi Qiu
2013-08-15 11:17                         ` Xishi Qiu
2013-08-15  6:38                   ` Xishi Qiu
2013-08-15 11:30                   ` Mel Gorman
2013-08-15 13:19                     ` Minchan Kim
2013-08-15 13:42                       ` Mel Gorman
2013-08-15 14:16                         ` Minchan Kim
2013-08-14 20:26     ` Andrew Morton
2013-08-14 22:22       ` Mel Gorman
2014-01-17 14:32         ` [PATCH] mm: Improve documentation of page_order Mel Gorman
2014-01-17 18:40           ` Rafael Aquini
2014-01-17 18:53           ` Laura Abbott
2014-01-17 19:59             ` Mel Gorman
2014-01-21 11:05               ` [PATCH] mm: Improve documentation of page_order v2 Mel Gorman
2014-01-20  6:12           ` [PATCH] mm: Improve documentation of page_order Minchan Kim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130814180012.GO2296@suse.de \
    --to=mgorman@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=aquini@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=minchan@kernel.org \
    --cc=qiuxishi@huawei.com \
    --cc=riel@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).