diff options
author | Pravin B Shelar <pshelar@nicira.com> | 2013-09-03 12:44:44 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-09-04 14:41:55 -0400 |
commit | 430eda6d6d568eded71dfd1be5a16c0c1379e201 (patch) | |
tree | 70d298414943feba8822064ef91638d4f397a742 /drivers/net | |
parent | f8de31040d50b7e4c26a5ca4c02b2929dde34a58 (diff) |
vxlan: Optimize vxlan rcv
vxlan-udp-recv function lookup vxlan_sock struct on every packet
recv by using udp-port number. we can use sk->sk_user_data to
store vxlan_sock and avoid lookup.
I have open coded rcu-api to store and read vxlan_sock from
sk_user_data to avoid sparse warning as sk_user_data is not
__rcu pointer.
Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/vxlan.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index ebda3a1c2f31..bd35d2dfc50a 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -916,6 +916,8 @@ void vxlan_sock_release(struct vxlan_sock *vs) | |||
916 | 916 | ||
917 | spin_lock(&vn->sock_lock); | 917 | spin_lock(&vn->sock_lock); |
918 | hlist_del_rcu(&vs->hlist); | 918 | hlist_del_rcu(&vs->hlist); |
919 | smp_wmb(); | ||
920 | vs->sock->sk->sk_user_data = NULL; | ||
919 | spin_unlock(&vn->sock_lock); | 921 | spin_unlock(&vn->sock_lock); |
920 | 922 | ||
921 | queue_work(vxlan_wq, &vs->del_work); | 923 | queue_work(vxlan_wq, &vs->del_work); |
@@ -1009,7 +1011,8 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb) | |||
1009 | 1011 | ||
1010 | port = inet_sk(sk)->inet_sport; | 1012 | port = inet_sk(sk)->inet_sport; |
1011 | 1013 | ||
1012 | vs = vxlan_find_sock(sock_net(sk), port); | 1014 | smp_read_barrier_depends(); |
1015 | vs = (struct vxlan_sock *)sk->sk_user_data; | ||
1013 | if (!vs) | 1016 | if (!vs) |
1014 | goto drop; | 1017 | goto drop; |
1015 | 1018 | ||
@@ -2236,6 +2239,8 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, __be16 port, | |||
2236 | atomic_set(&vs->refcnt, 1); | 2239 | atomic_set(&vs->refcnt, 1); |
2237 | vs->rcv = rcv; | 2240 | vs->rcv = rcv; |
2238 | vs->data = data; | 2241 | vs->data = data; |
2242 | smp_wmb(); | ||
2243 | vs->sock->sk->sk_user_data = vs; | ||
2239 | 2244 | ||
2240 | spin_lock(&vn->sock_lock); | 2245 | spin_lock(&vn->sock_lock); |
2241 | hlist_add_head_rcu(&vs->hlist, vs_head(net, port)); | 2246 | hlist_add_head_rcu(&vs->hlist, vs_head(net, port)); |