Commit 43a951e9 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

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: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0d7da9dd
...@@ -59,7 +59,7 @@ struct ipcm_cookie { ...@@ -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 { ...@@ -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" */
......
...@@ -238,7 +238,7 @@ int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc) ...@@ -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) ...@@ -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, ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment