* [PATCH] list_for_each_rcu must die: networking [not found] <20080424033849.GA4401@linux.vnet.ibm.com> @ 2008-05-15 0:16 ` Paul E. McKenney 2008-05-15 5:26 ` Kamalesh Babulal 0 siblings, 1 reply; 3+ messages in thread From: Paul E. McKenney @ 2008-05-15 0:16 UTC (permalink / raw) To: linux-kernel Cc: shemminger, kamalesh, linuxppc-dev, adobriyan, akpm, balbir, davem, sri 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... 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(); /* ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] list_for_each_rcu must die: networking 2008-05-15 0:16 ` [PATCH] list_for_each_rcu must die: networking Paul E. McKenney @ 2008-05-15 5:26 ` Kamalesh Babulal 2008-05-15 6:20 ` David Miller 0 siblings, 1 reply; 3+ messages in thread From: Kamalesh Babulal @ 2008-05-15 5:26 UTC (permalink / raw) To: paulmck Cc: shemminger, linux-kernel, linuxppc-dev, adobriyan, akpm, balbir, davem, sri 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. ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] list_for_each_rcu must die: networking 2008-05-15 5:26 ` Kamalesh Babulal @ 2008-05-15 6:20 ` David Miller 0 siblings, 0 replies; 3+ messages in thread From: David Miller @ 2008-05-15 6:20 UTC (permalink / raw) To: kamalesh Cc: balbir, linux-kernel, linuxppc-dev, adobriyan, akpm, paulmck, shemminger, sri From: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com> Date: Thu, 15 May 2008 10:56:07 +0530 > 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> I'm fine with these changes, and I acked them already. They belong as a set with the other list_for_each_rcu killing patches, so I'm fine with them going all together in Andrew's tree. Thanks! ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-05-15 6:20 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <20080424033849.GA4401@linux.vnet.ibm.com> 2008-05-15 0:16 ` [PATCH] list_for_each_rcu must die: networking Paul E. McKenney 2008-05-15 5:26 ` Kamalesh Babulal 2008-05-15 6:20 ` David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).