All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Patrick McHardy <kaber@trash.net>
Cc: David Miller <davem@davemloft.net>,
	eric.dumazet@gmail.com, Valdis.Kletnieks@vt.edu,
	akpm@linux-foundation.org, peterz@infradead.org,
	linux-kernel@vger.kernel.org, netfilter-devel@vger.kernel.org,
	netdev@vger.kernel.org
Subject: Re: mmotm 2010-04-28 - RCU whinges
Date: Mon, 10 May 2010 08:57:54 -0700	[thread overview]
Message-ID: <20100510155754.GB2374@linux.vnet.ibm.com> (raw)
In-Reply-To: <4BE8290A.2080707@trash.net>

On Mon, May 10, 2010 at 05:40:58PM +0200, Patrick McHardy wrote:
> David Miller wrote:
> > From: Eric Dumazet <eric.dumazet@gmail.com>
> > Date: Mon, 03 May 2010 07:43:56 +0200
> > 
> >> Le lundi 03 mai 2010 à 07:41 +0200, Eric Dumazet a écrit :
> >>
> >>> Oops scratch that, I'll resend a correct version.
> >>>
> >>>
> >> Sorry, patch _is_ fine, I had one brain collapse when re-reading it, I
> >> thought a different mutex was in use in one of the functions.
> > 
> > Ok, Patrick please review, thanks.
> 
> Actually we don't need the rcu_dereference() calls at all since
> registration and unregistration are protected by the mutexes.

The best approach in that case is rcu_dereference_protected() listing
the lock that must be held.  Of course, your code, so your choice.

						Thanx, Paul

> I queued this patch in nf-next, the only reason why I haven't
> submitted it yet is that I was unable to get git to cleanly export
> only the proper set of patches meant for -next due to a few merges,
> it insists on including 5 patches already merged upstream. If you
> don't mind ignoring the first 5 patches in the series, I'll send a
> pull request tonight.
> 
> 

> commit ed86308f6179d8fa6151c2d0f652aad0091548e2
> Author: Patrick McHardy <kaber@trash.net>
> Date:   Fri Apr 9 16:42:15 2010 +0200
> 
>     netfilter: remove invalid rcu_dereference() calls
>     
>     The CONFIG_PROVE_RCU option discovered a few invalid uses of
>     rcu_dereference() in netfilter. In all these cases, the code code
>     intends to check whether a pointer is already assigned when
>     performing registration or whether the assigned pointer matches
>     when performing unregistration. The entire registration/
>     unregistration is protected by a mutex, so we don't need the
>     rcu_dereference() calls.
>     
>     Reported-by: Valdis Kletnieks <Valdis.Kletnieks@vt.edu>
>     Tested-by: Valdis Kletnieks <Valdis.Kletnieks@vt.edu>
>     Signed-off-by: Patrick McHardy <kaber@trash.net>
> 
> diff --git a/net/netfilter/nf_conntrack_ecache.c b/net/netfilter/nf_conntrack_ecache.c
> index d5a9bcd..849614a 100644
> --- a/net/netfilter/nf_conntrack_ecache.c
> +++ b/net/netfilter/nf_conntrack_ecache.c
> @@ -81,11 +81,9 @@ EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);
>  int nf_conntrack_register_notifier(struct nf_ct_event_notifier *new)
>  {
>  	int ret = 0;
> -	struct nf_ct_event_notifier *notify;
> 
>  	mutex_lock(&nf_ct_ecache_mutex);
> -	notify = rcu_dereference(nf_conntrack_event_cb);
> -	if (notify != NULL) {
> +	if (nf_conntrack_event_cb != NULL) {
>  		ret = -EBUSY;
>  		goto out_unlock;
>  	}
> @@ -101,11 +99,8 @@ EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);
> 
>  void nf_conntrack_unregister_notifier(struct nf_ct_event_notifier *new)
>  {
> -	struct nf_ct_event_notifier *notify;
> -
>  	mutex_lock(&nf_ct_ecache_mutex);
> -	notify = rcu_dereference(nf_conntrack_event_cb);
> -	BUG_ON(notify != new);
> +	BUG_ON(nf_conntrack_event_cb != new);
>  	rcu_assign_pointer(nf_conntrack_event_cb, NULL);
>  	mutex_unlock(&nf_ct_ecache_mutex);
>  }
> @@ -114,11 +109,9 @@ EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);
>  int nf_ct_expect_register_notifier(struct nf_exp_event_notifier *new)
>  {
>  	int ret = 0;
> -	struct nf_exp_event_notifier *notify;
> 
>  	mutex_lock(&nf_ct_ecache_mutex);
> -	notify = rcu_dereference(nf_expect_event_cb);
> -	if (notify != NULL) {
> +	if (nf_expect_event_cb != NULL) {
>  		ret = -EBUSY;
>  		goto out_unlock;
>  	}
> @@ -134,11 +127,8 @@ EXPORT_SYMBOL_GPL(nf_ct_expect_register_notifier);
> 
>  void nf_ct_expect_unregister_notifier(struct nf_exp_event_notifier *new)
>  {
> -	struct nf_exp_event_notifier *notify;
> -
>  	mutex_lock(&nf_ct_ecache_mutex);
> -	notify = rcu_dereference(nf_expect_event_cb);
> -	BUG_ON(notify != new);
> +	BUG_ON(nf_expect_event_cb != new);
>  	rcu_assign_pointer(nf_expect_event_cb, NULL);
>  	mutex_unlock(&nf_ct_ecache_mutex);
>  }
> diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c
> index 015725a..908f599 100644
> --- a/net/netfilter/nf_log.c
> +++ b/net/netfilter/nf_log.c
> @@ -35,7 +35,6 @@ static struct nf_logger *__find_logger(int pf, const char *str_logger)
>  /* return EEXIST if the same logger is registred, 0 on success. */
>  int nf_log_register(u_int8_t pf, struct nf_logger *logger)
>  {
> -	const struct nf_logger *llog;
>  	int i;
> 
>  	if (pf >= ARRAY_SIZE(nf_loggers))
> @@ -52,8 +51,7 @@ int nf_log_register(u_int8_t pf, struct nf_logger *logger)
>  	} else {
>  		/* register at end of list to honor first register win */
>  		list_add_tail(&logger->list[pf], &nf_loggers_l[pf]);
> -		llog = rcu_dereference(nf_loggers[pf]);
> -		if (llog == NULL)
> +		if (nf_loggers[pf] == NULL)
>  			rcu_assign_pointer(nf_loggers[pf], logger);
>  	}
> 
> @@ -65,13 +63,11 @@ EXPORT_SYMBOL(nf_log_register);
> 
>  void nf_log_unregister(struct nf_logger *logger)
>  {
> -	const struct nf_logger *c_logger;
>  	int i;
> 
>  	mutex_lock(&nf_log_mutex);
>  	for (i = 0; i < ARRAY_SIZE(nf_loggers); i++) {
> -		c_logger = rcu_dereference(nf_loggers[i]);
> -		if (c_logger == logger)
> +		if (nf_loggers[i] == logger)
>  			rcu_assign_pointer(nf_loggers[i], NULL);
>  		list_del(&logger->list[i]);
>  	}


  parent reply	other threads:[~2010-05-10 15:57 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-28 23:53 mmotm 2010-04-28-16-53 uploaded akpm
2010-04-29 21:32 ` Valdis.Kletnieks
2010-04-29 21:53   ` Andrew Morton
2010-04-29 22:00     ` Andrew Morton
2010-04-30 12:11       ` Lee Schermerhorn
2010-04-30 18:02   ` Lee Schermerhorn
2010-04-30 18:47     ` Valdis.Kletnieks
2010-04-30 19:05       ` Lee Schermerhorn
2010-05-02 17:38 ` mmotm 2010-04-28 - nouveau driver issues Valdis.Kletnieks
2010-05-02 17:38 ` Valdis.Kletnieks
2010-05-02 17:46 ` mmotm 2010-04-28 - RCU whinges Valdis.Kletnieks
2010-05-03  5:38   ` Eric Dumazet
2010-05-03  5:41     ` Eric Dumazet
2010-05-03  5:41       ` Eric Dumazet
2010-05-03  5:43       ` Eric Dumazet
2010-05-03  5:43         ` Eric Dumazet
2010-05-03  5:55         ` David Miller
2010-05-10 15:40           ` Patrick McHardy
2010-05-10 15:56             ` Eric Dumazet
2010-05-10 15:57               ` Eric Dumazet
2010-05-10 16:03               ` Patrick McHardy
2010-05-10 16:03                 ` Patrick McHardy
2010-05-10 16:04                 ` Patrick McHardy
2010-05-10 16:04                   ` Patrick McHardy
2010-05-10 15:57             ` Paul E. McKenney [this message]
2010-05-10 16:12             ` David Miller
2010-05-10 16:27               ` Patrick McHardy
2010-05-03 14:30     ` Valdis.Kletnieks
2010-05-03 14:48       ` Eric Dumazet
2010-05-03 14:48         ` Eric Dumazet
2010-05-03 14:58       ` Eric Dumazet
2010-05-03 15:29         ` Valdis.Kletnieks
2010-05-03 15:43           ` Paul E. McKenney
2010-05-03 15:43             ` Paul E. McKenney
2010-05-03 16:14             ` Eric Dumazet
2010-05-03 18:16               ` Paul E. McKenney
2010-05-03 18:16                 ` Paul E. McKenney
2010-05-03 19:46                 ` [PATCH net-next-2.6] net: if6_get_next() fix Eric Dumazet
2010-05-03 20:09                   ` David Miller
2010-05-03 20:13                     ` Eric Dumazet
2010-05-03 20:13                       ` Eric Dumazet
2010-05-03 20:24                       ` David Miller
2010-05-03 20:50                         ` Eric Dumazet
2010-05-03 22:17                           ` David Miller
2010-05-03 22:48                             ` Paul E. McKenney
2010-05-03 22:52                           ` Paul E. McKenney
2010-05-03 22:54                             ` David Miller
2010-05-10 16:53     ` mmotm 2010-04-28 - RCU whinges Patrick McHardy

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=20100510155754.GB2374@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=Valdis.Kletnieks@vt.edu \
    --cc=akpm@linux-foundation.org \
    --cc=davem@davemloft.net \
    --cc=eric.dumazet@gmail.com \
    --cc=kaber@trash.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=netfilter-devel@vger.kernel.org \
    --cc=peterz@infradead.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 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.