ipv4: add __rcu annotations to ip_ra_chain

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 <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Eric Dumazet
2010-10-25 03:32:44 +00:00
committed by David S. Miller
parent 0d7da9ddd9
commit 43a951e999
2 changed files with 9 additions and 5 deletions

View File

@@ -59,7 +59,7 @@ struct ipcm_cookie {
#define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb)) #define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb))
struct ip_ra_chain { struct ip_ra_chain {
struct ip_ra_chain *next; struct ip_ra_chain __rcu *next;
struct sock *sk; struct sock *sk;
union { union {
void (*destructor)(struct sock *); void (*destructor)(struct sock *);
@@ -68,7 +68,7 @@ struct ip_ra_chain {
struct rcu_head rcu; struct rcu_head rcu;
}; };
extern struct ip_ra_chain *ip_ra_chain; extern struct ip_ra_chain __rcu *ip_ra_chain;
/* IP flags. */ /* IP flags. */
#define IP_CE 0x8000 /* Flag: "Congestion" */ #define IP_CE 0x8000 /* Flag: "Congestion" */

View File

@@ -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, but receiver should be enough clever f.e. to forward mtrace requests,
sent to multicast group to reach destination designated router. 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); 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, int ip_ra_control(struct sock *sk, unsigned char on,
void (*destructor)(struct sock *)) 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) if (sk->sk_type != SOCK_RAW || inet_sk(sk)->inet_num == IPPROTO_RAW)
return -EINVAL; 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; new_ra = on ? kmalloc(sizeof(*new_ra), GFP_KERNEL) : NULL;
spin_lock_bh(&ip_ra_lock); 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 (ra->sk == sk) {
if (on) { if (on) {
spin_unlock_bh(&ip_ra_lock); spin_unlock_bh(&ip_ra_lock);