lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 30 Jan 2014 12:51:58 +0200 From: Or Gerlitz <ogerlitz@...lanox.com> To: davem@...emloft.net Cc: netdev@...r.kernel.org, edumazet@...gle.com, Shlomo Pongratz <shlomop@...lanox.com>, Or Gerlitz <ogerlitz@...lanox.com> Subject: [PATCH net] net/ipv4: Use proper RCU APIs for writer-side in udp_offload.c From: Shlomo Pongratz <shlomop@...lanox.com> RCU writer side should use rcu_dereference_protected() and not rcu_dereference(), fix that. This also removes the "suspicious RCU usage" warning seen when running with CONFIG_PROVE_RCU. Fixes: b582ef0 ('net: Add GRO support for UDP encapsulating protocols') Reported-by: Eric Dumazet <edumazet@...gle.com> Signed-off-by: Or Gerlitz <ogerlitz@...lanox.com> Signed-off-by: Shlomo Pongratz <shlomop@...lanox.com> --- net/ipv4/udp_offload.c | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c index 2ffea6f..1bf21d4 100644 --- a/net/ipv4/udp_offload.c +++ b/net/ipv4/udp_offload.c @@ -109,7 +109,8 @@ int udp_add_offload(struct udp_offload *uo) new_offload->offload = uo; spin_lock(&udp_offload_lock); - rcu_assign_pointer(new_offload->next, rcu_dereference(*head)); + rcu_assign_pointer(new_offload->next, + rcu_dereference_protected(*head, lockdep_is_held(&udp_offload_lock))); rcu_assign_pointer(*head, new_offload); spin_unlock(&udp_offload_lock); @@ -130,12 +131,15 @@ void udp_del_offload(struct udp_offload *uo) spin_lock(&udp_offload_lock); - uo_priv = rcu_dereference(*head); + uo_priv = rcu_dereference_protected(*head, + lockdep_is_held(&udp_offload_lock)); for (; uo_priv != NULL; - uo_priv = rcu_dereference(*head)) { - + uo_priv = rcu_dereference_protected(*head, + lockdep_is_held(&udp_offload_lock))) { if (uo_priv->offload == uo) { - rcu_assign_pointer(*head, rcu_dereference(uo_priv->next)); + rcu_assign_pointer(*head, + rcu_dereference_protected(uo_priv->next, + lockdep_is_held(&udp_offload_lock))); goto unlock; } head = &uo_priv->next; -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists