summaryrefslogtreecommitdiffstats
path: root/net/ipv4/geneve.c
diff options
context:
space:
mode:
authorJesse Gross <jesse@nicira.com>2015-01-03 03:26:02 +0100
committerDavid S. Miller <davem@davemloft.net>2015-01-05 04:21:33 +0100
commit61f3cade763dca46127146a52d829e30b8f48921 (patch)
treee0d771d77f6015aef6e4a716d8ec89eacdcdb4ee /net/ipv4/geneve.c
parentMerge branch 'rhashtable-next' (diff)
downloadlinux-61f3cade763dca46127146a52d829e30b8f48921.tar.xz
linux-61f3cade763dca46127146a52d829e30b8f48921.zip
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: Jesse Gross <jesse@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to '')
-rw-r--r--net/ipv4/geneve.c21
1 files changed, 2 insertions, 19 deletions
diff --git a/net/ipv4/geneve.c b/net/ipv4/geneve.c
index 19e256e1dd92..136a829e8746 100644
--- a/net/ipv4/geneve.c
+++ b/net/ipv4/geneve.c
@@ -61,8 +61,6 @@ struct geneve_net {
static int geneve_net_id;
-static struct workqueue_struct *geneve_wq;
-
static inline struct genevehdr *geneve_hdr(const struct sk_buff *skb)
{
return (struct genevehdr *)(udp_hdr(skb) + 1);
@@ -307,15 +305,6 @@ error:
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,
__be16 port)
{
@@ -356,8 +345,6 @@ static struct geneve_sock *geneve_socket_create(struct net *net, __be16 port,
if (!gs)
return ERR_PTR(-ENOMEM);
- INIT_WORK(&gs->del_work, geneve_del_work);
-
sock = geneve_create_sock(net, ipv6, port);
if (IS_ERR(sock)) {
kfree(gs);
@@ -430,7 +417,8 @@ void geneve_sock_release(struct geneve_sock *gs)
geneve_notify_del_rx_port(gs);
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);
@@ -458,10 +446,6 @@ static int __init geneve_init_module(void)
{
int rc;
- geneve_wq = alloc_workqueue("geneve", 0, 0);
- if (!geneve_wq)
- return -ENOMEM;
-
rc = register_pernet_subsys(&geneve_net_ops);
if (rc)
return rc;
@@ -474,7 +458,6 @@ late_initcall(geneve_init_module);
static void __exit geneve_cleanup_module(void)
{
- destroy_workqueue(geneve_wq);
unregister_pernet_subsys(&geneve_net_ops);
}
module_exit(geneve_cleanup_module);