All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Monam Agarwal <monamagarwal123@gmail.com>,
	davem@davemloft.net, jasowang@redhat.com, xemul@parallels.com,
	wuzhy@linux.vnet.ibm.com, therbert@google.com, yamato@redhat.com,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	paulmck@linux.vnet.ibm.com
Subject: Re: [PATCH] drivers/net: Use RCU_INIT_POINTER(x, NULL) in tun.c
Date: Sun, 23 Mar 2014 23:33:49 +0200	[thread overview]
Message-ID: <20140323213349.GA8832@redhat.com> (raw)
In-Reply-To: <1395604457.9117.21.camel@edumazet-glaptop2.roam.corp.google.com>

On Sun, Mar 23, 2014 at 12:54:17PM -0700, Eric Dumazet wrote:
> On Sun, 2014-03-23 at 21:41 +0200, Michael S. Tsirkin wrote:
> 
> > The rcu_assign_pointer() ensures that the initialization of a structure       
> > is carried out before storing a pointer to that structure. 
> > In the case of the NULL pointer, there is no structure to initialize,
> > so we can safely drop smp_wmb in this case.
> > 
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > 
> > --
> > 
> > Lightly tested.
> > v is evaluated twice here but that should be ok since this
> > only happens when v is a constant, so evaluating it should
> > have no side effects.
> > Paul, what do you think?
> > 
> > diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
> > index 72bf3a0..d33c9ec 100644
> > --- a/include/linux/rcupdate.h
> > +++ b/include/linux/rcupdate.h
> > @@ -587,7 +587,8 @@ static inline void rcu_preempt_sleep_check(void)
> >   */
> >  #define rcu_assign_pointer(p, v) \
> >  	do { \
> > -		smp_wmb(); \
> > +		if (!__builtin_constant_p(v) || (v)) \
> > +			smp_wmb(); \
> >  		ACCESS_ONCE(p) = RCU_INITIALIZER(v); \
> >  	} while (0)
> >  
> 
> Yeah, I suggest you read d322f45ceed525daa changelog ;)
> 

Oh I see. It does not seem hard to silence that warning though.
See below.
Alternatively apply these patches everywhere though it does
look like too much work for too little gain to me.

-->

rcu: optimize rcu_assign_pointer with NULL

The rcu_assign_pointer() dropped __builtin_constant_p check to
avoid a compiler warning, but we can actually work around it without
adding code.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>

---

Untested, too late here, sorry.

 
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
index 72bf3a0..9111d40 100644
--- a/include/linux/rcupdate.h
+++ b/include/linux/rcupdate.h
@@ -585,9 +585,14 @@ static inline void rcu_preempt_sleep_check(void)
  * please be careful when making changes to rcu_assign_pointer() and the
  * other macros that it invokes.
  */
+/* The convoluted __builtin_constant_p logic is here to prevent
+ * gcc from emitting a warning when passed a pointer to a variable.
+ */
 #define rcu_assign_pointer(p, v) \
 	do { \
-		smp_wmb(); \
+		if (!__builtin_constant_p(v) || \
+		    (__builtin_constant_p(v) ? (v) : NULL)) \
+			smp_wmb(); \
 		ACCESS_ONCE(p) = RCU_INITIALIZER(v); \
 	} while (0)
 


  reply	other threads:[~2014-03-23 21:34 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-23 18:32 [PATCH] drivers/net: Use RCU_INIT_POINTER(x, NULL) in tun.c Monam Agarwal
2014-03-23 19:41 ` Michael S. Tsirkin
2014-03-23 19:54   ` Eric Dumazet
2014-03-23 21:33     ` Michael S. Tsirkin [this message]
2014-03-23 22:12       ` Paul E. McKenney
2014-03-24  5:09         ` Michael S. Tsirkin
2014-03-24  5:25           ` Eric Dumazet
2014-03-24  6:22             ` Michael S. Tsirkin
2014-03-24  8:57               ` Michael S. Tsirkin
2014-03-24 12:53               ` Eric Dumazet
2014-03-24  8:47             ` Lai Jiangshan
2014-03-24 13:38               ` Paul E. McKenney
2014-03-26  1:19 ` David Miller

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=20140323213349.GA8832@redhat.com \
    --to=mst@redhat.com \
    --cc=davem@davemloft.net \
    --cc=eric.dumazet@gmail.com \
    --cc=jasowang@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=monamagarwal123@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=therbert@google.com \
    --cc=wuzhy@linux.vnet.ibm.com \
    --cc=xemul@parallels.com \
    --cc=yamato@redhat.com \
    /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.