All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jerome Glisse <j.glisse@gmail.com>
To: Haggai Eran <haggaie@mellanox.com>
Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org,
	linux-mm@kvack.org,
	"Linus Torvalds" <torvalds@linux-foundation.org>,
	joro@8bytes.org, "Mel Gorman" <mgorman@suse.de>,
	"H. Peter Anvin" <hpa@zytor.com>,
	"Peter Zijlstra" <peterz@infradead.org>,
	"Andrea Arcangeli" <aarcange@redhat.com>,
	"Johannes Weiner" <jweiner@redhat.com>,
	"Larry Woodman" <lwoodman@redhat.com>,
	"Rik van Riel" <riel@redhat.com>,
	"Dave Airlie" <airlied@redhat.com>,
	"Brendan Conoboy" <blc@redhat.com>,
	"Joe Donohue" <jdonohue@redhat.com>,
	"Duncan Poole" <dpoole@nvidia.com>,
	"Sherry Cheung" <SCheung@nvidia.com>,
	"Subhash Gutti" <sgutti@nvidia.com>,
	"John Hubbard" <jhubbard@nvidia.com>,
	"Mark Hairgrove" <mhairgrove@nvidia.com>,
	"Lucien Dunning" <ldunning@nvidia.com>,
	"Cameron Buschardt" <cabuschardt@nvidia.com>,
	"Arvind Gopalakrishnan" <arvindg@nvidia.com>,
	"Shachar Raindel" <raindel@mellanox.com>,
	"Liran Liss" <liranl@mellanox.com>,
	"Roland Dreier" <roland@purestorage.com>,
	"Ben Sander" <ben.sander@amd.com>,
	"Greg Stoner" <Greg.Stoner@amd.com>,
	"John Bridgman" <John.Bridgman@amd.com>,
	"Michael Mantor" <Michael.Mantor@amd.com>,
	"Paul Blinzer" <Paul.Blinzer@amd.com>,
	"Laurent Morichetti" <Laurent.Morichetti@amd.com>,
	"Alexander Deucher" <Alexander.Deucher@amd.com>,
	"Oded Gabbay" <Oded.Gabbay@amd.com>,
	"Jérôme Glisse" <jglisse@redhat.com>
Subject: Re: [PATCH 2/7] mmu_notifier: keep track of active invalidation ranges v2
Date: Fri, 26 Dec 2014 02:20:32 -0500	[thread overview]
Message-ID: <20141226071112.GA4408@gmail.com> (raw)
In-Reply-To: <549BCAF8.1070500@mellanox.com>

On Thu, Dec 25, 2014 at 10:29:44AM +0200, Haggai Eran wrote:
> On 22/12/2014 18:48, j.glisse@gmail.com wrote:
> >  static inline void mmu_notifier_invalidate_range_start(struct mm_struct *mm,
> > -						       unsigned long start,
> > -						       unsigned long end,
> > -						       enum mmu_event event)
> > +						       struct mmu_notifier_range *range)
> >  {
> > +	/*
> > +	 * Initialize list no matter what in case a mmu_notifier register after
> > +	 * a range_start but before matching range_end.
> > +	 */
> > +	INIT_LIST_HEAD(&range->list);
> 
> I don't see how can an mmu_notifier register after a range_start but
> before a matching range_end. The mmu_notifier registration locks all mm
> locks, and that should prevent any invalidation from running, right?

File invalidation (like truncation) can lead to this case.

> 
> >  	if (mm_has_notifiers(mm))
> > -		__mmu_notifier_invalidate_range_start(mm, start, end, event);
> > +		__mmu_notifier_invalidate_range_start(mm, range);
> >  }
> 
> ...
> 
> >  void __mmu_notifier_invalidate_range_start(struct mm_struct *mm,
> > -					   unsigned long start,
> > -					   unsigned long end,
> > -					   enum mmu_event event)
> > +					   struct mmu_notifier_range *range)
> >  
> >  {
> >  	struct mmu_notifier *mn;
> > @@ -185,21 +183,36 @@ void __mmu_notifier_invalidate_range_start(struct mm_struct *mm,
> >  	id = srcu_read_lock(&srcu);
> >  	hlist_for_each_entry_rcu(mn, &mm->mmu_notifier_mm->list, hlist) {
> >  		if (mn->ops->invalidate_range_start)
> > -			mn->ops->invalidate_range_start(mn, mm, start,
> > -							end, event);
> > +			mn->ops->invalidate_range_start(mn, mm, range);
> >  	}
> >  	srcu_read_unlock(&srcu, id);
> > +
> > +	/*
> > +	 * This must happen after the callback so that subsystem can block on
> > +	 * new invalidation range to synchronize itself.
> > +	 */
> > +	spin_lock(&mm->mmu_notifier_mm->lock);
> > +	list_add_tail(&range->list, &mm->mmu_notifier_mm->ranges);
> > +	mm->mmu_notifier_mm->nranges++;
> > +	spin_unlock(&mm->mmu_notifier_mm->lock);
> >  }
> >  EXPORT_SYMBOL_GPL(__mmu_notifier_invalidate_range_start);
> 
> Don't you have a race here because you add the range struct after the
> callback?
> 
> -------------------------------------------------------------------------
> Thread A                    | Thread B
> -------------------------------------------------------------------------
> call mmu notifier callback  |
>   clear SPTE                |
>                             | device page fault
>                             |   mmu_notifier_range_is_valid returns true
>                             |   install new SPTE
> add event struct to list    |
> mm clears/modifies the PTE  |
> -------------------------------------------------------------------------
> 
> So we are left with different entries in the host page table and the
> secondary page table.
> 
> I would think you'd want the event struct to be added to the list before
> the callback is run.
> 

Yes you right, but the comment i left trigger memory that i did that on
purpose a one point probably with a different synch mecanism inside hmm.
I will try to medidate a bit see if i can bring back memory why i did it
that way in respect to previous design.

In all case i will respin with that order modified. Can i add you review
by after doing so ?

Cheers,
Jerome

--
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>

WARNING: multiple messages have this Message-ID (diff)
From: Jerome Glisse <j.glisse@gmail.com>
To: Haggai Eran <haggaie@mellanox.com>
Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org,
	linux-mm@kvack.org,
	"Linus Torvalds" <torvalds@linux-foundation.org>,
	joro@8bytes.org, "Mel Gorman" <mgorman@suse.de>,
	"H. Peter Anvin" <hpa@zytor.com>,
	"Peter Zijlstra" <peterz@infradead.org>,
	"Andrea Arcangeli" <aarcange@redhat.com>,
	"Johannes Weiner" <jweiner@redhat.com>,
	"Larry Woodman" <lwoodman@redhat.com>,
	"Rik van Riel" <riel@redhat.com>,
	"Dave Airlie" <airlied@redhat.com>,
	"Brendan Conoboy" <blc@redhat.com>,
	"Joe Donohue" <jdonohue@redhat.com>,
	"Duncan Poole" <dpoole@nvidia.com>,
	"Sherry Cheung" <SCheung@nvidia.com>,
	"Subhash Gutti" <sgutti@nvidia.com>,
	"John Hubbard" <jhubbard@nvidia.com>,
	"Mark Hairgrove" <mhairgrove@nvidia.com>,
	"Lucien Dunning" <ldunning@nvidia.com>,
	"Cameron Buschardt" <cabuschardt@nvidia.com>,
	"Arvind Gopalakrishnan" <arvindg@nvidia.com>,
	"Shachar Raindel" <raindel@mellanox.com>,
	"Liran Liss" <liranl@mellanox.com>,
	"Roland Dreier" <roland@purestorage.com>,
	"Ben Sander" <ben.sander@amd.com>,
	"Greg Stoner" <Greg.Stoner@amd.com>,
	"John Bridgman" <John.Bridgman@amd.com>,
	"Michael Mantor" <Michael.Mantor@amd.com>,
	"Paul Blinzer" <Paul.Blinzer@amd.com>,
	"Laurent Morichetti" <Laurent.Morichetti@amd.com>,
	"Alexander Deucher" <Alexander.Deucher@amd.com>,
	"Oded Gabbay" <Oded.Gabbay@amd.com>,
	"Jérôme Glisse" <jglisse@redhat.com>
Subject: Re: [PATCH 2/7] mmu_notifier: keep track of active invalidation ranges v2
Date: Fri, 26 Dec 2014 02:20:32 -0500	[thread overview]
Message-ID: <20141226071112.GA4408@gmail.com> (raw)
In-Reply-To: <549BCAF8.1070500@mellanox.com>

On Thu, Dec 25, 2014 at 10:29:44AM +0200, Haggai Eran wrote:
> On 22/12/2014 18:48, j.glisse@gmail.com wrote:
> >  static inline void mmu_notifier_invalidate_range_start(struct mm_struct *mm,
> > -						       unsigned long start,
> > -						       unsigned long end,
> > -						       enum mmu_event event)
> > +						       struct mmu_notifier_range *range)
> >  {
> > +	/*
> > +	 * Initialize list no matter what in case a mmu_notifier register after
> > +	 * a range_start but before matching range_end.
> > +	 */
> > +	INIT_LIST_HEAD(&range->list);
> 
> I don't see how can an mmu_notifier register after a range_start but
> before a matching range_end. The mmu_notifier registration locks all mm
> locks, and that should prevent any invalidation from running, right?

File invalidation (like truncation) can lead to this case.

> 
> >  	if (mm_has_notifiers(mm))
> > -		__mmu_notifier_invalidate_range_start(mm, start, end, event);
> > +		__mmu_notifier_invalidate_range_start(mm, range);
> >  }
> 
> ...
> 
> >  void __mmu_notifier_invalidate_range_start(struct mm_struct *mm,
> > -					   unsigned long start,
> > -					   unsigned long end,
> > -					   enum mmu_event event)
> > +					   struct mmu_notifier_range *range)
> >  
> >  {
> >  	struct mmu_notifier *mn;
> > @@ -185,21 +183,36 @@ void __mmu_notifier_invalidate_range_start(struct mm_struct *mm,
> >  	id = srcu_read_lock(&srcu);
> >  	hlist_for_each_entry_rcu(mn, &mm->mmu_notifier_mm->list, hlist) {
> >  		if (mn->ops->invalidate_range_start)
> > -			mn->ops->invalidate_range_start(mn, mm, start,
> > -							end, event);
> > +			mn->ops->invalidate_range_start(mn, mm, range);
> >  	}
> >  	srcu_read_unlock(&srcu, id);
> > +
> > +	/*
> > +	 * This must happen after the callback so that subsystem can block on
> > +	 * new invalidation range to synchronize itself.
> > +	 */
> > +	spin_lock(&mm->mmu_notifier_mm->lock);
> > +	list_add_tail(&range->list, &mm->mmu_notifier_mm->ranges);
> > +	mm->mmu_notifier_mm->nranges++;
> > +	spin_unlock(&mm->mmu_notifier_mm->lock);
> >  }
> >  EXPORT_SYMBOL_GPL(__mmu_notifier_invalidate_range_start);
> 
> Don't you have a race here because you add the range struct after the
> callback?
> 
> -------------------------------------------------------------------------
> Thread A                    | Thread B
> -------------------------------------------------------------------------
> call mmu notifier callback  |
>   clear SPTE                |
>                             | device page fault
>                             |   mmu_notifier_range_is_valid returns true
>                             |   install new SPTE
> add event struct to list    |
> mm clears/modifies the PTE  |
> -------------------------------------------------------------------------
> 
> So we are left with different entries in the host page table and the
> secondary page table.
> 
> I would think you'd want the event struct to be added to the list before
> the callback is run.
> 

Yes you right, but the comment i left trigger memory that i did that on
purpose a one point probably with a different synch mecanism inside hmm.
I will try to medidate a bit see if i can bring back memory why i did it
that way in respect to previous design.

In all case i will respin with that order modified. Can i add you review
by after doing so ?

Cheers,
Jérôme

  reply	other threads:[~2014-12-26  7:20 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-22 16:48 HMM (Heterogeneous Memory Management) v7 j.glisse
2014-12-22 16:48 ` j.glisse
2014-12-22 16:48 ` j.glisse
2014-12-22 16:48 ` [PATCH 1/7] mmu_notifier: add event information to address invalidation v6 j.glisse
2014-12-22 16:48   ` j.glisse
2014-12-22 16:48 ` [PATCH 2/7] mmu_notifier: keep track of active invalidation ranges v2 j.glisse
2014-12-22 16:48   ` j.glisse
2014-12-25  8:29   ` Haggai Eran
2014-12-25  8:29     ` Haggai Eran
2014-12-26  7:20     ` Jerome Glisse [this message]
2014-12-26  7:20       ` Jerome Glisse
2014-12-22 16:48 ` [PATCH 3/7] HMM: introduce heterogeneous memory management j.glisse
2014-12-22 16:48   ` j.glisse
2014-12-31 15:46   ` Haggai Eran
2014-12-31 15:46     ` Haggai Eran
2014-12-22 16:48 ` [PATCH 4/7] HMM: add HMM page table j.glisse
2014-12-22 16:48   ` j.glisse
2014-12-22 16:48 ` [PATCH 5/7] HMM: add per mirror " j.glisse
2014-12-22 16:48   ` j.glisse
2014-12-22 16:49 ` [PATCH 6/7] HMM: add device page fault support j.glisse
2014-12-22 16:49   ` j.glisse
  -- strict thread matches above, loose matches on Subject: below --
2014-12-28  8:46 [PATCH 2/7] mmu_notifier: keep track of active invalidation ranges v2 Haggai Eran
2015-01-05 18:49 ` Jerome Glisse
2015-01-05 18:49   ` Jerome Glisse

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=20141226071112.GA4408@gmail.com \
    --to=j.glisse@gmail.com \
    --cc=Alexander.Deucher@amd.com \
    --cc=Greg.Stoner@amd.com \
    --cc=John.Bridgman@amd.com \
    --cc=Laurent.Morichetti@amd.com \
    --cc=Michael.Mantor@amd.com \
    --cc=Oded.Gabbay@amd.com \
    --cc=Paul.Blinzer@amd.com \
    --cc=SCheung@nvidia.com \
    --cc=aarcange@redhat.com \
    --cc=airlied@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=arvindg@nvidia.com \
    --cc=ben.sander@amd.com \
    --cc=blc@redhat.com \
    --cc=cabuschardt@nvidia.com \
    --cc=dpoole@nvidia.com \
    --cc=haggaie@mellanox.com \
    --cc=hpa@zytor.com \
    --cc=jdonohue@redhat.com \
    --cc=jglisse@redhat.com \
    --cc=jhubbard@nvidia.com \
    --cc=joro@8bytes.org \
    --cc=jweiner@redhat.com \
    --cc=ldunning@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=liranl@mellanox.com \
    --cc=lwoodman@redhat.com \
    --cc=mgorman@suse.de \
    --cc=mhairgrove@nvidia.com \
    --cc=peterz@infradead.org \
    --cc=raindel@mellanox.com \
    --cc=riel@redhat.com \
    --cc=roland@purestorage.com \
    --cc=sgutti@nvidia.com \
    --cc=torvalds@linux-foundation.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.