• Will Deacon's avatar
    vhost: Remove redundant use of read_barrier_depends() barrier · 71c0b9a6
    Will Deacon authored
    Since commit 76ebbe78 ("locking/barriers: Add implicit
    smp_read_barrier_depends() to READ_ONCE()"), there is no need to use
    smp_read_barrier_depends() outside of the Alpha architecture code.
    
    Unfortunately, there is precisely _one_ user in the vhost code, and
    there isn't an obvious READ_ONCE() access making the barrier
    redundant. However, on closer inspection (thanks, Jason), it appears
    that vring synchronisation between the producer and consumer occurs via
    the 'avail_idx' field, which is followed up by an rmb() in
    vhost_get_vq_desc(), making the read_barrier_depends() redundant on
    Alpha.
    
    Jason says:
    
      | I'm also confused about the barrier here, basically in driver side
      | we did:
      |
      | 1) allocate pages
      | 2) store pages in indirect->addr
      | 3) smp_wmb()
      | 4) increase the avail idx (somehow a tail pointer of vring)
      |
      | in vhost we did:
      |
      | 1) read avail idx
      | 2) smp_rmb()
      | 3) read indirect->addr
      | 4) read from indirect->addr
      |
      | It looks to me even the data dependency barrier is not necessary
      | since we have rmb() which is sufficient for us to the correct
      | indirect->addr and driver are not expected to do any writing to
      | indirect->addr after avail idx is increased
    
    Remove the redundant barrier invocation.
    Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Suggested-by: default avatarJason Wang <jasowang@redhat.com>
    Acked-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    71c0b9a6
vhost.c 61.6 KB