From patchwork Mon Oct 25 13:32:44 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 69096 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id E54BEB70A9 for ; Tue, 26 Oct 2010 00:32:54 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755611Ab0JYNcu (ORCPT ); Mon, 25 Oct 2010 09:32:50 -0400 Received: from mail-wy0-f174.google.com ([74.125.82.174]:46653 "EHLO mail-wy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754997Ab0JYNct (ORCPT ); Mon, 25 Oct 2010 09:32:49 -0400 Received: by wyf28 with SMTP id 28so3402222wyf.19 for ; Mon, 25 Oct 2010 06:32:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:subject:from:to:cc :content-type:date:message-id:mime-version:x-mailer :content-transfer-encoding; bh=FyjWPHs2ZYB8he3Y7QUaNmUBVtrYwDZtli2Y+fOCUgY=; b=DRcAJkVsOysV/7fLMAeBI+yTxpl5h8Ummxzv4NuXTfVux2cSAdDHt4kcI6KjWheG86 hX5Xp/D66Eg91d9M5Ohg/EkKOPutb3tOKxeKh69CXsZQR2lygWH/1P7G5UJHVEMGoOWu +y9BclDEy27qnegTjDVbfcVypzcnzj9Z9mZbg= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:from:to:cc:content-type:date:message-id:mime-version :x-mailer:content-transfer-encoding; b=QUHm4KX95DkXG+4bOp71XzFkUfer1dwRmBDCEsKA9JPyTEV/L33ebG7gekRU0ttKmV 6dgIptmeQj9d1LSHEzjhurgsc2UybMiCJ93vEKkJWOvWh+/fypriXc/wlL9Y0kEsWsl0 dIox688Hp+UD4rgg1yAHmCpcCtP8dxvddZJKk= Received: by 10.227.142.17 with SMTP id o17mr4171578wbu.41.1288013568134; Mon, 25 Oct 2010 06:32:48 -0700 (PDT) Received: from [10.150.51.211] (gw0.net.jmsp.net [212.23.165.14]) by mx.google.com with ESMTPS id f14sm5675843wbe.2.2010.10.25.06.32.46 (version=SSLv3 cipher=RC4-MD5); Mon, 25 Oct 2010 06:32:47 -0700 (PDT) Subject: [PATCH] ipv4: add __rcu annotations to ip_ra_chain From: Eric Dumazet To: David Miller Cc: netdev Date: Mon, 25 Oct 2010 15:32:44 +0200 Message-ID: <1288013564.2826.123.camel@edumazet-laptop> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add __rcu annotations to : (struct ip_ra_chain)->next struct ip_ra_chain *ip_ra_chain; And use appropriate rcu primitives. Signed-off-by: Eric Dumazet --- include/net/ip.h | 4 ++-- net/ipv4/ip_sockglue.c | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/include/net/ip.h b/include/net/ip.h index dbee3fe..86e2b18 100644 --- a/include/net/ip.h +++ b/include/net/ip.h @@ -59,7 +59,7 @@ struct ipcm_cookie { #define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb)) struct ip_ra_chain { - struct ip_ra_chain *next; + struct ip_ra_chain __rcu *next; struct sock *sk; union { void (*destructor)(struct sock *); @@ -68,7 +68,7 @@ struct ip_ra_chain { struct rcu_head rcu; }; -extern struct ip_ra_chain *ip_ra_chain; +extern struct ip_ra_chain __rcu *ip_ra_chain; /* IP flags. */ #define IP_CE 0x8000 /* Flag: "Congestion" */ diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 64b70ad..3948c86 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -238,7 +238,7 @@ int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc) but receiver should be enough clever f.e. to forward mtrace requests, sent to multicast group to reach destination designated router. */ -struct ip_ra_chain *ip_ra_chain; +struct ip_ra_chain __rcu *ip_ra_chain; static DEFINE_SPINLOCK(ip_ra_lock); @@ -253,7 +253,8 @@ static void ip_ra_destroy_rcu(struct rcu_head *head) int ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(struct sock *)) { - struct ip_ra_chain *ra, *new_ra, **rap; + struct ip_ra_chain *ra, *new_ra; + struct ip_ra_chain __rcu **rap; if (sk->sk_type != SOCK_RAW || inet_sk(sk)->inet_num == IPPROTO_RAW) return -EINVAL; @@ -261,7 +262,10 @@ int ip_ra_control(struct sock *sk, unsigned char on, new_ra = on ? kmalloc(sizeof(*new_ra), GFP_KERNEL) : NULL; spin_lock_bh(&ip_ra_lock); - for (rap = &ip_ra_chain; (ra = *rap) != NULL; rap = &ra->next) { + for (rap = &ip_ra_chain; + (ra = rcu_dereference_protected(*rap, + lockdep_is_held(&ip_ra_lock))) != NULL; + rap = &ra->next) { if (ra->sk == sk) { if (on) { spin_unlock_bh(&ip_ra_lock);