Re: [PATCH v2] net/sock: Update sk rcu iterator macro.
Mon, Oct 23, 2017 at 06:42:50PM +, Levin, Alexander (Sasha Levin) wrote: > On Mon, Oct 23, 2017 at 11:39:22AM -0400, Tim Hansen wrote: > >Mark hlist nodes in sk rcu iterator as protected by the rcu. > >hlist_next_rcu accomplishes this and silences the warnings > >sparse throws for net/ipv4/udp.c and net/ipv6/udp.c. > > > >Found with make C=1 net/ipv4/udp.o on linux-next tag > >next-20171009. > > > >Signed-off-by: Tim Hansen > >--- > > include/net/sock.h | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > >diff --git a/include/net/sock.h b/include/net/sock.h > >index 64e5ac41b9cf..96cb7b7e4924 100644 > >--- a/include/net/sock.h > >+++ b/include/net/sock.h > >@@ -737,10 +737,10 @@ static inline void sk_add_bind_node(struct sock *sk, > > * > > */ > > #define sk_for_each_entry_offset_rcu(tpos, pos, head, offset) > >\ > >-for (pos = rcu_dereference((head)->first); \ > >+for (pos = rcu_dereference(hlist_next_rcu((head)->first)); \ > > See below. > > > pos != NULL &&\ > > ({ tpos = (typeof(*tpos) *)((void *)pos - offset); 1;}); \ > >- pos = rcu_dereference(pos->next)) > >+ pos = rcu_dereference(hlist_next_rcu(pos->next))) > > This will return the next-next node instead of just the next one. You > probably want just hlist_next_rcu(pos) here. > > -- > > Thanks, > Sasha Thanks Sasha, dumb oversight on my part. Sent in v3 of this patch.
Re: [PATCH v2] net/sock: Update sk rcu iterator macro.
On Mon, Oct 23, 2017 at 11:39:22AM -0400, Tim Hansen wrote: >Mark hlist nodes in sk rcu iterator as protected by the rcu. >hlist_next_rcu accomplishes this and silences the warnings >sparse throws for net/ipv4/udp.c and net/ipv6/udp.c. > >Found with make C=1 net/ipv4/udp.o on linux-next tag >next-20171009. > >Signed-off-by: Tim Hansen >--- > include/net/sock.h | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > >diff --git a/include/net/sock.h b/include/net/sock.h >index 64e5ac41b9cf..96cb7b7e4924 100644 >--- a/include/net/sock.h >+++ b/include/net/sock.h >@@ -737,10 +737,10 @@ static inline void sk_add_bind_node(struct sock *sk, > * > */ > #define sk_for_each_entry_offset_rcu(tpos, pos, head, offset)\ >- for (pos = rcu_dereference((head)->first); \ >+ for (pos = rcu_dereference(hlist_next_rcu((head)->first)); \ See below. >pos != NULL &&\ > ({ tpos = (typeof(*tpos) *)((void *)pos - offset); 1;}); \ >- pos = rcu_dereference(pos->next)) >+ pos = rcu_dereference(hlist_next_rcu(pos->next))) This will return the next-next node instead of just the next one. You probably want just hlist_next_rcu(pos) here. -- Thanks, Sasha
[PATCH v2] net/sock: Update sk rcu iterator macro.
Mark hlist nodes in sk rcu iterator as protected by the rcu. hlist_next_rcu accomplishes this and silences the warnings sparse throws for net/ipv4/udp.c and net/ipv6/udp.c. Found with make C=1 net/ipv4/udp.o on linux-next tag next-20171009. Signed-off-by: Tim Hansen --- include/net/sock.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/net/sock.h b/include/net/sock.h index 64e5ac41b9cf..96cb7b7e4924 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -737,10 +737,10 @@ static inline void sk_add_bind_node(struct sock *sk, * */ #define sk_for_each_entry_offset_rcu(tpos, pos, head, offset) \ - for (pos = rcu_dereference((head)->first); \ + for (pos = rcu_dereference(hlist_next_rcu((head)->first)); \ pos != NULL &&\ ({ tpos = (typeof(*tpos) *)((void *)pos - offset); 1;}); \ -pos = rcu_dereference(pos->next)) +pos = rcu_dereference(hlist_next_rcu(pos->next))) static inline struct user_namespace *sk_user_ns(struct sock *sk) { -- 2.15.0.rc0