linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
To: Davidlohr Bueso <davidlohr@hp.com>
Cc: akpm@linux-foundation.org, iamjoonsoo.kim@lge.com,
	riel@redhat.com, mgorman@suse.de, mhocko@suse.cz,
	aneesh.kumar@linux.vnet.ibm.com, kamezawa.hiroyu@jp.fujitsu.com,
	hughd@google.com, david@gibson.dropbear.id.au, js1304@gmail.com,
	liwanp@linux.vnet.ibm.com, dhillf@gmail.com, rientjes@google.com,
	aswin@hp.com, scott.norton@hp.com, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 3/8] mm, hugetlb: fix race in region tracking
Date: Mon, 27 Jan 2014 20:53:41 -0500	[thread overview]
Message-ID: <1390874021-48f5mo0m-mutt-n-horiguchi@ah.jp.nec.com> (raw)
In-Reply-To: <1390859042.27421.4.camel@buesod1.americas.hpqcorp.net>

Hi Davidlohr,

On Mon, Jan 27, 2014 at 01:44:02PM -0800, Davidlohr Bueso wrote:
> On Mon, 2014-01-27 at 16:02 -0500, Naoya Horiguchi wrote:
> > On Sun, Jan 26, 2014 at 07:52:21PM -0800, Davidlohr Bueso wrote:
> > > From: Joonsoo Kim <iamjoonsoo.kim@lge.com>
> > > 
> > > There is a race condition if we map a same file on different processes.
> > > Region tracking is protected by mmap_sem and hugetlb_instantiation_mutex.
> > > When we do mmap, we don't grab a hugetlb_instantiation_mutex, but only the,
> > > mmap_sem (exclusively). This doesn't prevent other tasks from modifying the
> > > region structure, so it can be modified by two processes concurrently.
> > > 
> > > To solve this, introduce a spinlock to resv_map and make region manipulation
> > > function grab it before they do actual work.
> > > 
> > > Acked-by: David Gibson <david@gibson.dropbear.id.au>
> > > Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com>
> > > [Updated changelog]
> > > Signed-off-by: Davidlohr Bueso <davidlohr@hp.com>
> > > ---
> > ...
> > > @@ -203,15 +200,23 @@ static long region_chg(struct resv_map *resv, long f, long t)
> > >  	 * Subtle, allocate a new region at the position but make it zero
> > >  	 * size such that we can guarantee to record the reservation. */
> > >  	if (&rg->link == head || t < rg->from) {
> > > -		nrg = kmalloc(sizeof(*nrg), GFP_KERNEL);
> > > -		if (!nrg)
> > > -			return -ENOMEM;
> > > +		if (!nrg) {
> > > +			spin_unlock(&resv->lock);
> > 
> > I think that doing kmalloc() inside the lock is simpler.
> > Why do you unlock and retry here?
> 
> This is a spinlock, no can do -- we've previously debated this and since
> the critical region is quite small, a non blocking lock is better suited
> here. We do the retry so we don't race once the new region is allocated
> after the lock is dropped.

Using spinlock instead of rw_sem makes sense.
But I'm not sure how the retry is essential to fix the race.
(Sorry I can't find the discussion log about this.)
As you did in your ver.1 (https://lkml.org/lkml/2013/7/26/296),
simply doing like below seems to be fine to me, is it right?

        if (&rg->link == head || t < rg->from) {
		nrg = kmalloc(sizeof(*nrg), GFP_KERNEL);
		if (!nrg) {
			chg = -ENOMEM;
			goto out_locked;
		}
		nrg->from = f;
		...
	}

In the current version nrg is initialized to NULL, so we always do retry
once when adding new file_region. That's not optimal to me.

If this retry is really essential for the fix, please comment the reason
both in patch description and inline comment. It's very important for
future code maintenance.

And I noticed another point. I don't think the name of new goto label
'out_locked' is a good one. 'out_unlock' or 'unlock' is better.

Thanks,
Naoya Horiguchi

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2014-01-28  1:54 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-27  3:52 [PATCH 0/8] mm, hugetlb: fixes and fault scalability Davidlohr Bueso
2014-01-27  3:52 ` [PATCH 1/8] mm, hugetlb: unify region structure handling Davidlohr Bueso
2014-01-27 21:02   ` Naoya Horiguchi
2014-01-27  3:52 ` [PATCH 2/8] mm, hugetlb: region manipulation functions take resv_map rather list_head Davidlohr Bueso
2014-01-27 21:02   ` Naoya Horiguchi
2014-01-27  3:52 ` [PATCH 3/8] mm, hugetlb: fix race in region tracking Davidlohr Bueso
2014-01-27 21:02   ` Naoya Horiguchi
2014-01-27 21:44     ` Davidlohr Bueso
2014-01-28  1:53       ` Naoya Horiguchi [this message]
2014-01-28  2:34         ` Davidlohr Bueso
2014-01-29  0:36           ` Naoya Horiguchi
2014-01-29  1:19             ` Davidlohr Bueso
2014-02-04  0:18               ` Andrew Morton
2014-01-27  3:52 ` [PATCH 4/8] mm, hugetlb: remove resv_map_put Davidlohr Bueso
2014-01-27 21:03   ` Naoya Horiguchi
2014-01-27  3:52 ` [PATCH 5/8] mm, hugetlb: use vma_resv_map() map types Davidlohr Bueso
2014-01-27 21:03   ` Naoya Horiguchi
2014-01-28  2:36     ` Davidlohr Bueso
2014-01-27  3:52 ` [PATCH 6/8] mm, hugetlb: remove vma_has_reserves Davidlohr Bueso
2014-01-27 21:04   ` Naoya Horiguchi
2014-01-29 19:24     ` Davidlohr Bueso
2014-01-27  3:52 ` [PATCH 7/8] mm, hugetlb: mm, hugetlb: unify chg and avoid_reserve to use_reserve Davidlohr Bueso
2014-01-27 21:04   ` Naoya Horiguchi
2014-01-27  3:52 ` [PATCH 8/8] mm, hugetlb: improve page-fault scalability Davidlohr Bueso
2014-01-27  4:15   ` Davidlohr Bueso
2014-01-27  4:17   ` [PATCH v2 " Davidlohr Bueso

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=1390874021-48f5mo0m-mutt-n-horiguchi@ah.jp.nec.com \
    --to=n-horiguchi@ah.jp.nec.com \
    --cc=akpm@linux-foundation.org \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=aswin@hp.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=davidlohr@hp.com \
    --cc=dhillf@gmail.com \
    --cc=hughd@google.com \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=js1304@gmail.com \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=liwanp@linux.vnet.ibm.com \
    --cc=mgorman@suse.de \
    --cc=mhocko@suse.cz \
    --cc=riel@redhat.com \
    --cc=rientjes@google.com \
    --cc=scott.norton@hp.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