Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756053AbbLQN5c (ORCPT ); Thu, 17 Dec 2015 08:57:32 -0500 Received: from bombadil.infradead.org ([198.137.202.9]:40604 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754744AbbLQN5a (ORCPT ); Thu, 17 Dec 2015 08:57:30 -0500 Date: Thu, 17 Dec 2015 14:57:26 +0100 From: Peter Zijlstra To: "Michael S. Tsirkin" Cc: linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, Jason Wang , qemu-devel@nongnu.org Subject: Re: [PATCH] virtio_ring: use smp_store_mb Message-ID: <20151217135726.GA6344@twins.programming.kicks-ass.net> References: <1450347932-16325-1-git-send-email-mst@redhat.com> <20151217105238.GA6375@twins.programming.kicks-ass.net> <20151217131554-mutt-send-email-mst@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20151217131554-mutt-send-email-mst@redhat.com> User-Agent: Mutt/1.5.21 (2012-12-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2159 Lines: 63 On Thu, Dec 17, 2015 at 03:16:20PM +0200, Michael S. Tsirkin wrote: > On Thu, Dec 17, 2015 at 11:52:38AM +0100, Peter Zijlstra wrote: > > On Thu, Dec 17, 2015 at 12:32:53PM +0200, Michael S. Tsirkin wrote: > > > +static inline void virtio_store_mb(bool weak_barriers, > > > + __virtio16 *p, __virtio16 v) > > > +{ > > > +#ifdef CONFIG_SMP > > > + if (weak_barriers) > > > + smp_store_mb(*p, v); > > > + else > > > +#endif > > > + { > > > + WRITE_ONCE(*p, v); > > > + mb(); > > > + } > > > +} > > > > This is a different barrier depending on SMP, that seems wrong. > > Of course it's wrong in the sense that it's > suboptimal on UP. What we would really like is to > have, on UP, exactly the same barrier as on SMP. > This is because a UP guest can run on an SMP host. > > But Linux doesn't provide this ability: if CONFIG_SMP is > not defined is optimizes most barriers out to a > compiler barrier. > > Consider for example x86: what we want is xchg (NOT > mfence - see below for why) but if built without CONFIG_SMP > smp_store_mb does not include this. You could of course go fix that instead of mutilating things into sort-of functional state. > > > > smp_mb(), as (should be) used by smp_store_mb() does not provide a > > barrier against IO. mb() otoh does. > > > > Since this is virtIO I would expect you always want mb(). > > No because it's VIRTio not real io :) It just switches to the hyprevisor > mode - kind of like a function call really. > The weak_barriers flag is cleared for when it's used > with real devices with real IO. > > > All this is explained in some detail at the top of > include/linux/virtio.h I did read that, it didn't make any sense wrt the code below it. For instance it seems to imply weak_barriers is for smp like stuff while !weak_barriers is for actual devices. But then you go use dma_*mb() ops, which are specifially for devices only for weak_barrier. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/