All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
To: paulmck@linux.vnet.ibm.com
Cc: shemminger@vyatta.com, linux-kernel@vger.kernel.org,
	linuxppc-dev@ozlabs.org, adobriyan@gmail.com,
	akpm@linux-foundation.org, balbir@linux.vnet.ibm.com,
	davem@davemloft.net, sri@us.ibm.com
Subject: Re: [PATCH] list_for_each_rcu must die: networking
Date: Thu, 15 May 2008 10:56:07 +0530	[thread overview]
Message-ID: <482BC96F.1030008@linux.vnet.ibm.com> (raw)
In-Reply-To: <20080515001607.GB20811@linux.vnet.ibm.com>

Paul E. McKenney wrote:
> All uses of list_for_each_rcu() can be profitably replaced by the
> easier-to-use list_for_each_entry_rcu().  This patch makes this change
> for networking, in preparation for removing the list_for_each_rcu()
> API entirely.
> 
> Updated to remove the two now-unused variables as noted by Dave Miller,
> and also to fix my bonehead error detected by Kamalesh Babulal and
> Alexey Dobriyan.  It now passes LTP on POWER.  And also has valid SOB.
> Some days it just doesn't pay to get out of bed...

Hi Paul,

Thanks, the patch fixes the oops.

Tested-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
> Acked-by: David S. Miller <davem@davemloft.net> (lkml.org/lkml/2008/4/23/448)
> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> ---
> 
>  802/psnap.c     |    4 +---
>  ipv4/af_inet.c  |    9 +++------
>  ipv6/af_inet6.c |    9 +++------
>  3 files changed, 7 insertions(+), 15 deletions(-)
> 
> diff -urpNa -X dontdiff linux-2.6.26-rc2/net/802/psnap.c linux-2.6.26-rc2-lfer-net/net/802/psnap.c
> --- linux-2.6.26-rc2/net/802/psnap.c	2008-04-16 19:49:44.000000000 -0700
> +++ linux-2.6.26-rc2-lfer-net/net/802/psnap.c	2008-05-14 13:38:13.000000000 -0700
> @@ -30,11 +30,9 @@ static struct llc_sap *snap_sap;
>   */
>  static struct datalink_proto *find_snap_client(unsigned char *desc)
>  {
> -	struct list_head *entry;
>  	struct datalink_proto *proto = NULL, *p;
> 
> -	list_for_each_rcu(entry, &snap_list) {
> -		p = list_entry(entry, struct datalink_proto, node);
> +	list_for_each_entry_rcu(p, &snap_list, node) {
>  		if (!memcmp(p->type, desc, 5)) {
>  			proto = p;
>  			break;
> diff -urpNa -X dontdiff linux-2.6.26-rc2/net/ipv4/af_inet.c linux-2.6.26-rc2-lfer-net/net/ipv4/af_inet.c
> --- linux-2.6.26-rc2/net/ipv4/af_inet.c	2008-05-14 13:35:32.000000000 -0700
> +++ linux-2.6.26-rc2-lfer-net/net/ipv4/af_inet.c	2008-05-14 13:46:26.000000000 -0700
> @@ -267,7 +267,6 @@ static inline int inet_netns_ok(struct n
>  static int inet_create(struct net *net, struct socket *sock, int protocol)
>  {
>  	struct sock *sk;
> -	struct list_head *p;
>  	struct inet_protosw *answer;
>  	struct inet_sock *inet;
>  	struct proto *answer_prot;
> @@ -284,13 +283,12 @@ static int inet_create(struct net *net, 
>  	sock->state = SS_UNCONNECTED;
> 
>  	/* Look for the requested type/protocol pair. */
> -	answer = NULL;
>  lookup_protocol:
>  	err = -ESOCKTNOSUPPORT;
>  	rcu_read_lock();
> -	list_for_each_rcu(p, &inetsw[sock->type]) {
> -		answer = list_entry(p, struct inet_protosw, list);
> +	list_for_each_entry_rcu(answer, &inetsw[sock->type], list) {
> 
> +		err = 0;
>  		/* Check the non-wild match. */
>  		if (protocol == answer->protocol) {
>  			if (protocol != IPPROTO_IP)
> @@ -305,10 +303,9 @@ lookup_protocol:
>  				break;
>  		}
>  		err = -EPROTONOSUPPORT;
> -		answer = NULL;
>  	}
> 
> -	if (unlikely(answer == NULL)) {
> +	if (unlikely(err)) {
>  		if (try_loading_module < 2) {
>  			rcu_read_unlock();
>  			/*
> diff -urpNa -X dontdiff linux-2.6.26-rc2/net/ipv6/af_inet6.c linux-2.6.26-rc2-lfer-net/net/ipv6/af_inet6.c
> --- linux-2.6.26-rc2/net/ipv6/af_inet6.c	2008-05-14 13:35:32.000000000 -0700
> +++ linux-2.6.26-rc2-lfer-net/net/ipv6/af_inet6.c	2008-05-14 13:45:08.000000000 -0700
> @@ -87,7 +87,6 @@ static int inet6_create(struct net *net,
>  	struct inet_sock *inet;
>  	struct ipv6_pinfo *np;
>  	struct sock *sk;
> -	struct list_head *p;
>  	struct inet_protosw *answer;
>  	struct proto *answer_prot;
>  	unsigned char answer_flags;
> @@ -101,13 +100,12 @@ static int inet6_create(struct net *net,
>  		build_ehash_secret();
> 
>  	/* Look for the requested type/protocol pair. */
> -	answer = NULL;
>  lookup_protocol:
>  	err = -ESOCKTNOSUPPORT;
>  	rcu_read_lock();
> -	list_for_each_rcu(p, &inetsw6[sock->type]) {
> -		answer = list_entry(p, struct inet_protosw, list);
> +	list_for_each_entry_rcu(answer, &inetsw6[sock->type], list) {
> 
> +		err = 0;
>  		/* Check the non-wild match. */
>  		if (protocol == answer->protocol) {
>  			if (protocol != IPPROTO_IP)
> @@ -122,10 +120,9 @@ lookup_protocol:
>  				break;
>  		}
>  		err = -EPROTONOSUPPORT;
> -		answer = NULL;
>  	}
> 
> -	if (!answer) {
> +	if (err) {
>  		if (try_loading_module < 2) {
>  			rcu_read_unlock();
>  			/*
> --

-- 
Thanks & Regards,
Kamalesh Babulal,
Linux Technology Center,
IBM, ISTL.

WARNING: multiple messages have this Message-ID (diff)
From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
To: paulmck@linux.vnet.ibm.com
Cc: linux-kernel@vger.kernel.org, akpm@linux-foundation.org,
	shemminger@vyatta.com, linville@tuxdriver.com, sri@us.ibm.com,
	davem@davemloft.net, adobriyan@gmail.com, apw@shadowen.org,
	balbir@linux.vnet.ibm.com, linuxppc-dev@ozlabs.org
Subject: Re: [PATCH] list_for_each_rcu must die: networking
Date: Thu, 15 May 2008 10:56:07 +0530	[thread overview]
Message-ID: <482BC96F.1030008@linux.vnet.ibm.com> (raw)
In-Reply-To: <20080515001607.GB20811@linux.vnet.ibm.com>

Paul E. McKenney wrote:
> All uses of list_for_each_rcu() can be profitably replaced by the
> easier-to-use list_for_each_entry_rcu().  This patch makes this change
> for networking, in preparation for removing the list_for_each_rcu()
> API entirely.
> 
> Updated to remove the two now-unused variables as noted by Dave Miller,
> and also to fix my bonehead error detected by Kamalesh Babulal and
> Alexey Dobriyan.  It now passes LTP on POWER.  And also has valid SOB.
> Some days it just doesn't pay to get out of bed...

Hi Paul,

Thanks, the patch fixes the oops.

Tested-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
> Acked-by: David S. Miller <davem@davemloft.net> (lkml.org/lkml/2008/4/23/448)
> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> ---
> 
>  802/psnap.c     |    4 +---
>  ipv4/af_inet.c  |    9 +++------
>  ipv6/af_inet6.c |    9 +++------
>  3 files changed, 7 insertions(+), 15 deletions(-)
> 
> diff -urpNa -X dontdiff linux-2.6.26-rc2/net/802/psnap.c linux-2.6.26-rc2-lfer-net/net/802/psnap.c
> --- linux-2.6.26-rc2/net/802/psnap.c	2008-04-16 19:49:44.000000000 -0700
> +++ linux-2.6.26-rc2-lfer-net/net/802/psnap.c	2008-05-14 13:38:13.000000000 -0700
> @@ -30,11 +30,9 @@ static struct llc_sap *snap_sap;
>   */
>  static struct datalink_proto *find_snap_client(unsigned char *desc)
>  {
> -	struct list_head *entry;
>  	struct datalink_proto *proto = NULL, *p;
> 
> -	list_for_each_rcu(entry, &snap_list) {
> -		p = list_entry(entry, struct datalink_proto, node);
> +	list_for_each_entry_rcu(p, &snap_list, node) {
>  		if (!memcmp(p->type, desc, 5)) {
>  			proto = p;
>  			break;
> diff -urpNa -X dontdiff linux-2.6.26-rc2/net/ipv4/af_inet.c linux-2.6.26-rc2-lfer-net/net/ipv4/af_inet.c
> --- linux-2.6.26-rc2/net/ipv4/af_inet.c	2008-05-14 13:35:32.000000000 -0700
> +++ linux-2.6.26-rc2-lfer-net/net/ipv4/af_inet.c	2008-05-14 13:46:26.000000000 -0700
> @@ -267,7 +267,6 @@ static inline int inet_netns_ok(struct n
>  static int inet_create(struct net *net, struct socket *sock, int protocol)
>  {
>  	struct sock *sk;
> -	struct list_head *p;
>  	struct inet_protosw *answer;
>  	struct inet_sock *inet;
>  	struct proto *answer_prot;
> @@ -284,13 +283,12 @@ static int inet_create(struct net *net, 
>  	sock->state = SS_UNCONNECTED;
> 
>  	/* Look for the requested type/protocol pair. */
> -	answer = NULL;
>  lookup_protocol:
>  	err = -ESOCKTNOSUPPORT;
>  	rcu_read_lock();
> -	list_for_each_rcu(p, &inetsw[sock->type]) {
> -		answer = list_entry(p, struct inet_protosw, list);
> +	list_for_each_entry_rcu(answer, &inetsw[sock->type], list) {
> 
> +		err = 0;
>  		/* Check the non-wild match. */
>  		if (protocol == answer->protocol) {
>  			if (protocol != IPPROTO_IP)
> @@ -305,10 +303,9 @@ lookup_protocol:
>  				break;
>  		}
>  		err = -EPROTONOSUPPORT;
> -		answer = NULL;
>  	}
> 
> -	if (unlikely(answer == NULL)) {
> +	if (unlikely(err)) {
>  		if (try_loading_module < 2) {
>  			rcu_read_unlock();
>  			/*
> diff -urpNa -X dontdiff linux-2.6.26-rc2/net/ipv6/af_inet6.c linux-2.6.26-rc2-lfer-net/net/ipv6/af_inet6.c
> --- linux-2.6.26-rc2/net/ipv6/af_inet6.c	2008-05-14 13:35:32.000000000 -0700
> +++ linux-2.6.26-rc2-lfer-net/net/ipv6/af_inet6.c	2008-05-14 13:45:08.000000000 -0700
> @@ -87,7 +87,6 @@ static int inet6_create(struct net *net,
>  	struct inet_sock *inet;
>  	struct ipv6_pinfo *np;
>  	struct sock *sk;
> -	struct list_head *p;
>  	struct inet_protosw *answer;
>  	struct proto *answer_prot;
>  	unsigned char answer_flags;
> @@ -101,13 +100,12 @@ static int inet6_create(struct net *net,
>  		build_ehash_secret();
> 
>  	/* Look for the requested type/protocol pair. */
> -	answer = NULL;
>  lookup_protocol:
>  	err = -ESOCKTNOSUPPORT;
>  	rcu_read_lock();
> -	list_for_each_rcu(p, &inetsw6[sock->type]) {
> -		answer = list_entry(p, struct inet_protosw, list);
> +	list_for_each_entry_rcu(answer, &inetsw6[sock->type], list) {
> 
> +		err = 0;
>  		/* Check the non-wild match. */
>  		if (protocol == answer->protocol) {
>  			if (protocol != IPPROTO_IP)
> @@ -122,10 +120,9 @@ lookup_protocol:
>  				break;
>  		}
>  		err = -EPROTONOSUPPORT;
> -		answer = NULL;
>  	}
> 
> -	if (!answer) {
> +	if (err) {
>  		if (try_loading_module < 2) {
>  			rcu_read_unlock();
>  			/*
> --

-- 
Thanks & Regards,
Kamalesh Babulal,
Linux Technology Center,
IBM, ISTL.

  reply	other threads:[~2008-05-15  5:26 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-24  3:38 [PATCH] list_for_each_rcu must die: networking Paul E. McKenney
2008-05-15  0:16 ` Paul E. McKenney
2008-05-15  0:16   ` Paul E. McKenney
2008-05-15  5:26   ` Kamalesh Babulal [this message]
2008-05-15  5:26     ` Kamalesh Babulal
2008-05-15  6:20     ` David Miller
2008-05-15  6:20       ` David Miller
  -- strict thread matches above, loose matches on Subject: below --
2008-04-24  1:32 Paul E. McKenney
2008-04-24  1:35 ` 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=482BC96F.1030008@linux.vnet.ibm.com \
    --to=kamalesh@linux.vnet.ibm.com \
    --cc=adobriyan@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=balbir@linux.vnet.ibm.com \
    --cc=davem@davemloft.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@ozlabs.org \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=shemminger@vyatta.com \
    --cc=sri@us.ibm.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.