linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Jason Gunthorpe <jgg@ziepe.ca>
To: Jason Wang <jasowang@redhat.com>
Cc: mst@redhat.com, kvm@vger.kernel.org,
	virtualization@lists.linux-foundation.org,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-mm@kvack.org
Subject: Re: [PATCH V2 7/9] vhost: do not use RCU to synchronize MMU notifier with worker
Date: Thu, 1 Aug 2019 11:15:12 -0300	[thread overview]
Message-ID: <20190801141512.GB23899@ziepe.ca> (raw)
In-Reply-To: <a3bde826-6329-68e4-2826-8a9de4c5bd1e@redhat.com>

On Thu, Aug 01, 2019 at 01:02:18PM +0800, Jason Wang wrote:
> 
> On 2019/8/1 上午3:30, Jason Gunthorpe wrote:
> > On Wed, Jul 31, 2019 at 09:28:20PM +0800, Jason Wang wrote:
> > > On 2019/7/31 下午8:39, Jason Gunthorpe wrote:
> > > > On Wed, Jul 31, 2019 at 04:46:53AM -0400, Jason Wang wrote:
> > > > > We used to use RCU to synchronize MMU notifier with worker. This leads
> > > > > calling synchronize_rcu() in invalidate_range_start(). But on a busy
> > > > > system, there would be many factors that may slow down the
> > > > > synchronize_rcu() which makes it unsuitable to be called in MMU
> > > > > notifier.
> > > > > 
> > > > > A solution is SRCU but its overhead is obvious with the expensive full
> > > > > memory barrier. Another choice is to use seqlock, but it doesn't
> > > > > provide a synchronization method between readers and writers. The last
> > > > > choice is to use vq mutex, but it need to deal with the worst case
> > > > > that MMU notifier must be blocked and wait for the finish of swap in.
> > > > > 
> > > > > So this patch switches use a counter to track whether or not the map
> > > > > was used. The counter was increased when vq try to start or finish
> > > > > uses the map. This means, when it was even, we're sure there's no
> > > > > readers and MMU notifier is synchronized. When it was odd, it means
> > > > > there's a reader we need to wait it to be even again then we are
> > > > > synchronized.
> > > > You just described a seqlock.
> > > 
> > > Kind of, see my explanation below.
> > > 
> > > 
> > > > We've been talking about providing this as some core service from mmu
> > > > notifiers because nearly every use of this API needs it.
> > > 
> > > That would be very helpful.
> > > 
> > > 
> > > > IMHO this gets the whole thing backwards, the common pattern is to
> > > > protect the 'shadow pte' data with a seqlock (usually open coded),
> > > > such that the mmu notififer side has the write side of that lock and
> > > > the read side is consumed by the thread accessing or updating the SPTE.
> > > 
> > > Yes, I've considered something like that. But the problem is, mmu notifier
> > > (writer) need to wait for the vhost worker to finish the read before it can
> > > do things like setting dirty pages and unmapping page.  It looks to me
> > > seqlock doesn't provide things like this.
> > The seqlock is usually used to prevent a 2nd thread from accessing the
> > VA while it is being changed by the mm. ie you use something seqlocky
> > instead of the ugly mmu_notifier_unregister/register cycle.
> 
> 
> Yes, so we have two mappings:
> 
> [1] vring address to VA
> [2] VA to PA
> 
> And have several readers and writers
> 
> 1) set_vring_num_addr(): writer of both [1] and [2]
> 2) MMU notifier: reader of [1] writer of [2]
> 3) GUP: reader of [1] writer of [2]
> 4) memory accessors: reader of [1] and [2]
> 
> Fortunately, 1) 3) and 4) have already synchronized through vq->mutex. We
> only need to deal with synchronization between 2) and each of the reset:
> Sync between 1) and 2): For mapping [1], I do
> mmu_notifier_unregister/register. This help to avoid holding any lock to do
> overlap check.

I suspect you could have done this with a RCU technique instead of
register/unregister.

> Sync between 2) and 4): For mapping [1], both are readers, no need any
> synchronization. For mapping [2], synchronize through RCU (or something
> simliar to seqlock).

You can't really use a seqlock, seqlocks are collision-retry locks,
and the semantic here is that invalidate_range_start *MUST* not
continue until thread doing #4 above is guarenteed no longer touching
the memory.

This must be a proper barrier, like a spinlock, mutex, or
synchronize_rcu.

And, again, you can't re-invent a spinlock with open coding and get
something better.

Jason


  reply	other threads:[~2019-08-01 14:15 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-31  8:46 [PATCH V2 0/9] Fixes for metadata accelreation Jason Wang
2019-07-31  8:46 ` [PATCH V2 1/9] vhost: don't set uaddr for invalid address Jason Wang
2019-07-31  8:46 ` [PATCH V2 2/9] vhost: validate MMU notifier registration Jason Wang
2019-07-31  8:46 ` [PATCH V2 3/9] vhost: fix vhost map leak Jason Wang
2019-07-31  8:46 ` [PATCH V2 4/9] vhost: reset invalidate_count in vhost_set_vring_num_addr() Jason Wang
2019-07-31 12:41   ` Jason Gunthorpe
2019-07-31 13:29     ` Jason Wang
2019-07-31 19:32       ` Jason Gunthorpe
2019-07-31 19:37         ` Michael S. Tsirkin
2019-08-01  5:03         ` Jason Wang
2019-07-31  8:46 ` [PATCH V2 5/9] vhost: mark dirty pages during map uninit Jason Wang
2019-07-31  8:46 ` [PATCH V2 6/9] vhost: don't do synchronize_rcu() in vhost_uninit_vq_maps() Jason Wang
2019-07-31  8:46 ` [PATCH V2 7/9] vhost: do not use RCU to synchronize MMU notifier with worker Jason Wang
2019-07-31  8:50   ` Jason Wang
2019-07-31 12:39   ` Jason Gunthorpe
2019-07-31 13:28     ` Jason Wang
2019-07-31 19:30       ` Jason Gunthorpe
2019-08-01  5:02         ` Jason Wang
2019-08-01 14:15           ` Jason Gunthorpe [this message]
2019-08-02  9:40             ` Jason Wang
2019-08-02 12:46               ` Jason Gunthorpe
2019-08-02 14:27                 ` Michael S. Tsirkin
2019-08-02 17:24                   ` Jason Gunthorpe
2019-08-03 21:36                     ` Michael S. Tsirkin
2019-08-04  0:14                       ` Jason Gunthorpe
2019-08-04  8:07                         ` Michael S. Tsirkin
2019-08-05  4:39                           ` Jason Wang
2019-08-06 11:53                           ` Jason Gunthorpe
2019-08-06 13:36                             ` Michael S. Tsirkin
2019-08-06 13:40                               ` Jason Gunthorpe
2019-08-05  4:36                   ` Jason Wang
2019-08-05  4:41                     ` Jason Wang
2019-08-05  6:40                       ` Michael S. Tsirkin
2019-08-05  8:24                         ` Jason Wang
2019-08-05  6:30                     ` Michael S. Tsirkin
2019-08-05  8:22                       ` Jason Wang
2019-08-05  4:20                 ` Jason Wang
2019-08-06 12:04                   ` Jason Gunthorpe
2019-08-07  6:49                     ` Jason Wang
2019-08-02 14:03               ` Michael S. Tsirkin
2019-08-05  4:33                 ` Jason Wang
2019-08-05  6:28                   ` Michael S. Tsirkin
2019-08-05  8:21                     ` Jason Wang
2019-07-31 18:29   ` Michael S. Tsirkin
2019-08-01  8:06     ` Jason Wang
2019-08-03 21:54       ` Michael S. Tsirkin
2019-08-05  8:18         ` Jason Wang
2019-07-31  8:46 ` [PATCH V2 8/9] vhost: correctly set dirty pages in MMU notifiers callback Jason Wang
2019-07-31  8:46 ` [PATCH V2 9/9] vhost: do not return -EAGIAN for non blocking invalidation too early Jason Wang
2019-07-31  9:59   ` Stefano Garzarella
2019-07-31 10:05     ` Jason Wang

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=20190801141512.GB23899@ziepe.ca \
    --to=jgg@ziepe.ca \
    --cc=jasowang@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mst@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=virtualization@lists.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 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).