提交 43a951e9 编写于 作者: E Eric Dumazet 提交者: 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: NEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册