Commit 61f3cade authored by Jesse Gross's avatar Jesse Gross Committed by David S. Miller

geneve: Remove workqueue.

The work queue is used only to free the UDP socket upon destruction.
This is not necessary with Geneve and generally makes the code more
difficult to reason about. It also introduces nondeterministic
behavior such as when a socket is rapidly deleted and recreated, which
could fail as the the deletion happens asynchronously.
Signed-off-by: default avatarJesse Gross <jesse@nicira.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7beceebf
...@@ -71,7 +71,6 @@ struct geneve_sock { ...@@ -71,7 +71,6 @@ struct geneve_sock {
struct hlist_node hlist; struct hlist_node hlist;
geneve_rcv_t *rcv; geneve_rcv_t *rcv;
void *rcv_data; void *rcv_data;
struct work_struct del_work;
struct socket *sock; struct socket *sock;
struct rcu_head rcu; struct rcu_head rcu;
atomic_t refcnt; atomic_t refcnt;
......
...@@ -61,8 +61,6 @@ struct geneve_net { ...@@ -61,8 +61,6 @@ struct geneve_net {
static int geneve_net_id; static int geneve_net_id;
static struct workqueue_struct *geneve_wq;
static inline struct genevehdr *geneve_hdr(const struct sk_buff *skb) static inline struct genevehdr *geneve_hdr(const struct sk_buff *skb)
{ {
return (struct genevehdr *)(udp_hdr(skb) + 1); return (struct genevehdr *)(udp_hdr(skb) + 1);
...@@ -307,15 +305,6 @@ static int geneve_udp_encap_recv(struct sock *sk, struct sk_buff *skb) ...@@ -307,15 +305,6 @@ static int geneve_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
return 1; return 1;
} }
static void geneve_del_work(struct work_struct *work)
{
struct geneve_sock *gs = container_of(work, struct geneve_sock,
del_work);
udp_tunnel_sock_release(gs->sock);
kfree_rcu(gs, rcu);
}
static struct socket *geneve_create_sock(struct net *net, bool ipv6, static struct socket *geneve_create_sock(struct net *net, bool ipv6,
__be16 port) __be16 port)
{ {
...@@ -356,8 +345,6 @@ static struct geneve_sock *geneve_socket_create(struct net *net, __be16 port, ...@@ -356,8 +345,6 @@ static struct geneve_sock *geneve_socket_create(struct net *net, __be16 port,
if (!gs) if (!gs)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
INIT_WORK(&gs->del_work, geneve_del_work);
sock = geneve_create_sock(net, ipv6, port); sock = geneve_create_sock(net, ipv6, port);
if (IS_ERR(sock)) { if (IS_ERR(sock)) {
kfree(gs); kfree(gs);
...@@ -430,7 +417,8 @@ void geneve_sock_release(struct geneve_sock *gs) ...@@ -430,7 +417,8 @@ void geneve_sock_release(struct geneve_sock *gs)
geneve_notify_del_rx_port(gs); geneve_notify_del_rx_port(gs);
spin_unlock(&gn->sock_lock); spin_unlock(&gn->sock_lock);
queue_work(geneve_wq, &gs->del_work); udp_tunnel_sock_release(gs->sock);
kfree_rcu(gs, rcu);
} }
EXPORT_SYMBOL_GPL(geneve_sock_release); EXPORT_SYMBOL_GPL(geneve_sock_release);
...@@ -458,10 +446,6 @@ static int __init geneve_init_module(void) ...@@ -458,10 +446,6 @@ static int __init geneve_init_module(void)
{ {
int rc; int rc;
geneve_wq = alloc_workqueue("geneve", 0, 0);
if (!geneve_wq)
return -ENOMEM;
rc = register_pernet_subsys(&geneve_net_ops); rc = register_pernet_subsys(&geneve_net_ops);
if (rc) if (rc)
return rc; return rc;
...@@ -474,7 +458,6 @@ late_initcall(geneve_init_module); ...@@ -474,7 +458,6 @@ late_initcall(geneve_init_module);
static void __exit geneve_cleanup_module(void) static void __exit geneve_cleanup_module(void)
{ {
destroy_workqueue(geneve_wq);
unregister_pernet_subsys(&geneve_net_ops); unregister_pernet_subsys(&geneve_net_ops);
} }
module_exit(geneve_cleanup_module); module_exit(geneve_cleanup_module);
......
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