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

tunnels: add __rcu annotations

Add __rcu annotations to :
        (struct ip_tunnel)->prl
        (struct ip_tunnel_prl_entry)->next
        (struct xfrm_tunnel)->next
	struct xfrm_tunnel *tunnel4_handlers
	struct xfrm_tunnel *tunnel64_handlers

And use appropriate rcu primitives to reduce sparse warnings if
CONFIG_SPARSE_RCU_POINTER=y
Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e0ad61ec
...@@ -34,12 +34,12 @@ struct ip_tunnel { ...@@ -34,12 +34,12 @@ struct ip_tunnel {
#ifdef CONFIG_IPV6_SIT_6RD #ifdef CONFIG_IPV6_SIT_6RD
struct ip_tunnel_6rd_parm ip6rd; struct ip_tunnel_6rd_parm ip6rd;
#endif #endif
struct ip_tunnel_prl_entry *prl; /* potential router list */ struct ip_tunnel_prl_entry __rcu *prl; /* potential router list */
unsigned int prl_count; /* # of entries in PRL */ unsigned int prl_count; /* # of entries in PRL */
}; };
struct ip_tunnel_prl_entry { struct ip_tunnel_prl_entry {
struct ip_tunnel_prl_entry *next; struct ip_tunnel_prl_entry __rcu *next;
__be32 addr; __be32 addr;
u16 flags; u16 flags;
struct rcu_head rcu_head; struct rcu_head rcu_head;
......
...@@ -1264,7 +1264,7 @@ struct xfrm_tunnel { ...@@ -1264,7 +1264,7 @@ struct xfrm_tunnel {
int (*handler)(struct sk_buff *skb); int (*handler)(struct sk_buff *skb);
int (*err_handler)(struct sk_buff *skb, u32 info); int (*err_handler)(struct sk_buff *skb, u32 info);
struct xfrm_tunnel *next; struct xfrm_tunnel __rcu *next;
int priority; int priority;
}; };
......
...@@ -14,27 +14,32 @@ ...@@ -14,27 +14,32 @@
#include <net/protocol.h> #include <net/protocol.h>
#include <net/xfrm.h> #include <net/xfrm.h>
static struct xfrm_tunnel *tunnel4_handlers __read_mostly; static struct xfrm_tunnel __rcu *tunnel4_handlers __read_mostly;
static struct xfrm_tunnel *tunnel64_handlers __read_mostly; static struct xfrm_tunnel __rcu *tunnel64_handlers __read_mostly;
static DEFINE_MUTEX(tunnel4_mutex); static DEFINE_MUTEX(tunnel4_mutex);
static inline struct xfrm_tunnel **fam_handlers(unsigned short family) static inline struct xfrm_tunnel __rcu **fam_handlers(unsigned short family)
{ {
return (family == AF_INET) ? &tunnel4_handlers : &tunnel64_handlers; return (family == AF_INET) ? &tunnel4_handlers : &tunnel64_handlers;
} }
int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family) int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family)
{ {
struct xfrm_tunnel **pprev; struct xfrm_tunnel __rcu **pprev;
struct xfrm_tunnel *t;
int ret = -EEXIST; int ret = -EEXIST;
int priority = handler->priority; int priority = handler->priority;
mutex_lock(&tunnel4_mutex); mutex_lock(&tunnel4_mutex);
for (pprev = fam_handlers(family); *pprev; pprev = &(*pprev)->next) { for (pprev = fam_handlers(family);
if ((*pprev)->priority > priority) (t = rcu_dereference_protected(*pprev,
lockdep_is_held(&tunnel4_mutex))) != NULL;
pprev = &t->next) {
if (t->priority > priority)
break; break;
if ((*pprev)->priority == priority) if (t->priority == priority)
goto err; goto err;
} }
...@@ -52,13 +57,17 @@ EXPORT_SYMBOL(xfrm4_tunnel_register); ...@@ -52,13 +57,17 @@ EXPORT_SYMBOL(xfrm4_tunnel_register);
int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family) int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family)
{ {
struct xfrm_tunnel **pprev; struct xfrm_tunnel __rcu **pprev;
struct xfrm_tunnel *t;
int ret = -ENOENT; int ret = -ENOENT;
mutex_lock(&tunnel4_mutex); mutex_lock(&tunnel4_mutex);
for (pprev = fam_handlers(family); *pprev; pprev = &(*pprev)->next) { for (pprev = fam_handlers(family);
if (*pprev == handler) { (t = rcu_dereference_protected(*pprev,
lockdep_is_held(&tunnel4_mutex))) != NULL;
pprev = &t->next) {
if (t == handler) {
*pprev = handler->next; *pprev = handler->next;
ret = 0; ret = 0;
break; break;
......
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