Alexander Duyck
2015-Apr-08 00:47 UTC
[PATCH] virtio_ring: Update weak barriers to use dma_wmb/rmb
This change makes it so that instead of using smp_wmb/rmb which varies depending on the kernel configuration we can can use dma_wmb/rmb which for most architectures should be equal to or slightly more strict than smp_wmb/rmb. The advantage to this is that these barriers are available to uniprocessor builds as well so the performance should improve under such a configuration. Signed-off-by: Alexander Duyck <alexander.h.duyck at redhat.com> --- include/linux/virtio_ring.h | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/include/linux/virtio_ring.h b/include/linux/virtio_ring.h index 67e06fe18c03..8e50888a6d59 100644 --- a/include/linux/virtio_ring.h +++ b/include/linux/virtio_ring.h @@ -21,19 +21,20 @@ * actually quite cheap. */ -#ifdef CONFIG_SMP static inline void virtio_mb(bool weak_barriers) { +#ifdef CONFIG_SMP if (weak_barriers) smp_mb(); else +#endif mb(); } static inline void virtio_rmb(bool weak_barriers) { if (weak_barriers) - smp_rmb(); + dma_rmb(); else rmb(); } @@ -41,26 +42,10 @@ static inline void virtio_rmb(bool weak_barriers) static inline void virtio_wmb(bool weak_barriers) { if (weak_barriers) - smp_wmb(); + dma_wmb(); else wmb(); } -#else -static inline void virtio_mb(bool weak_barriers) -{ - mb(); -} - -static inline void virtio_rmb(bool weak_barriers) -{ - rmb(); -} - -static inline void virtio_wmb(bool weak_barriers) -{ - wmb(); -} -#endif struct virtio_device; struct virtqueue;
Michael S. Tsirkin
2015-Apr-08 08:42 UTC
[PATCH] virtio_ring: Update weak barriers to use dma_wmb/rmb
On Tue, Apr 07, 2015 at 05:47:42PM -0700, Alexander Duyck wrote:> This change makes it so that instead of using smp_wmb/rmb which varies > depending on the kernel configuration we can can use dma_wmb/rmb which for > most architectures should be equal to or slightly more strict than > smp_wmb/rmb. > > The advantage to this is that these barriers are available to uniprocessor > builds as well so the performance should improve under such a > configuration. > > Signed-off-by: Alexander Duyck <alexander.h.duyck at redhat.com>Well the generic implementation has: #ifndef dma_rmb #define dma_rmb() rmb() #endif #ifndef dma_wmb #define dma_wmb() wmb() #endif So for these arches you are slightly speeding up UP but slightly hurting SMP - I think we did benchmark the difference as measureable in the past. Additionally, isn't this relying on undocumented behaviour? The documentation says: "These are for use with consistent memory" and virtio does not bother to request consistent memory allocations. One wonders whether these will always be strong enough.> --- > include/linux/virtio_ring.h | 23 ++++------------------- > 1 file changed, 4 insertions(+), 19 deletions(-) > > diff --git a/include/linux/virtio_ring.h b/include/linux/virtio_ring.h > index 67e06fe18c03..8e50888a6d59 100644 > --- a/include/linux/virtio_ring.h > +++ b/include/linux/virtio_ring.h > @@ -21,19 +21,20 @@ > * actually quite cheap. > */ > > -#ifdef CONFIG_SMP > static inline void virtio_mb(bool weak_barriers) > { > +#ifdef CONFIG_SMP > if (weak_barriers) > smp_mb(); > else > +#endif > mb(); > } > > static inline void virtio_rmb(bool weak_barriers) > { > if (weak_barriers) > - smp_rmb(); > + dma_rmb(); > else > rmb(); > } > @@ -41,26 +42,10 @@ static inline void virtio_rmb(bool weak_barriers) > static inline void virtio_wmb(bool weak_barriers) > { > if (weak_barriers) > - smp_wmb(); > + dma_wmb(); > else > wmb(); > } > -#else > -static inline void virtio_mb(bool weak_barriers) > -{ > - mb(); > -} > - > -static inline void virtio_rmb(bool weak_barriers) > -{ > - rmb(); > -} > - > -static inline void virtio_wmb(bool weak_barriers) > -{ > - wmb(); > -} > -#endif > > struct virtio_device; > struct virtqueue;
Alexander Duyck
2015-Apr-08 14:41 UTC
[PATCH] virtio_ring: Update weak barriers to use dma_wmb/rmb
On 04/08/2015 01:42 AM, Michael S. Tsirkin wrote:> On Tue, Apr 07, 2015 at 05:47:42PM -0700, Alexander Duyck wrote: >> This change makes it so that instead of using smp_wmb/rmb which varies >> depending on the kernel configuration we can can use dma_wmb/rmb which for >> most architectures should be equal to or slightly more strict than >> smp_wmb/rmb. >> >> The advantage to this is that these barriers are available to uniprocessor >> builds as well so the performance should improve under such a >> configuration. >> >> Signed-off-by: Alexander Duyck <alexander.h.duyck at redhat.com> > Well the generic implementation has: > #ifndef dma_rmb > #define dma_rmb() rmb() > #endif > > #ifndef dma_wmb > #define dma_wmb() wmb() > #endif > > So for these arches you are slightly speeding up UP but slightly hurting SMP - > I think we did benchmark the difference as measureable in the past.The generic implementation for the smp_ barriers does the same thing when CONFIG_SMP is defined. The only spot where there should be an appreciable difference between the two is on ARM where we define the dma_ barriers as being in the outer shareable domain, and for the smp_ barriers they are inner shareable domain.> Additionally, isn't this relying on undocumented behaviour? > The documentation says: > "These are for use with consistent memory" > and virtio does not bother to request consistent memory > allocations.Consistent in this case represents memory that exists within one coherency domain. So in the case of x86 for instance this represents writes only to system memory. If you mix writes to system memory and device memory (PIO) then you should be using the full wmb/rmb to guarantee ordering between the two memories.> One wonders whether these will always be strong enough.For the purposes of weak barriers they should be, and they are only slightly stronger than SMP in one case so odds are strength will not be the issue. As far as speed I would suspect that the difference between inner and outer shareable domain should be negligible compared to the difference between a dsb() and a dmb(). - Alex
Rusty Russell
2015-Apr-10 03:17 UTC
[PATCH] virtio_ring: Update weak barriers to use dma_wmb/rmb
Alexander Duyck <alexander.h.duyck at redhat.com> writes:> This change makes it so that instead of using smp_wmb/rmb which varies > depending on the kernel configuration we can can use dma_wmb/rmb which for > most architectures should be equal to or slightly more strict than > smp_wmb/rmb. > > The advantage to this is that these barriers are available to uniprocessor > builds as well so the performance should improve under such a > configuration. > > Signed-off-by: Alexander Duyck <alexander.h.duyck at redhat.com>This seems OK to me, since it's really as much a cleanup as anything, but like you I do wonder if there benefit on ARM in practice. Applied, thanks. Cheers, Rusty.
Maybe Matching Threads
- [PATCH] virtio_ring: Update weak barriers to use dma_wmb/rmb
- [PATCH] virtio_ring: Update weak barriers to use dma_wmb/rmb
- [PATCH] virtio_ring: Update weak barriers to use dma_wmb/rmb
- [PATCH] virtio_ring: Update weak barriers to use dma_wmb/rmb
- [PATCH] virtio_ring: switch to dma_XX barriers for rpmsg