geneve: Remove workqueue.
authorJesse Gross <jesse@nicira.com>
Sat, 3 Jan 2015 02:26:02 +0000 (18:26 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 5 Jan 2015 03:21:33 +0000 (22:21 -0500)
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>
include/net/geneve.h
net/ipv4/geneve.c

index 112132cf8e2e878c0e4629c88e2065eadfda0f4f..56c7e1ac216ad79f903254af12fa31a41918a4da 100644 (file)
@@ -71,7 +71,6 @@ struct geneve_sock {
        struct hlist_node       hlist;
        geneve_rcv_t            *rcv;
        void                    *rcv_data;
-       struct work_struct      del_work;
        struct socket           *sock;
        struct rcu_head         rcu;
        atomic_t                refcnt;
index 19e256e1dd92f374266d52612d483667de684cf7..136a829e8746e321d5bb2bfe1c2e05fe06373d48 100644 (file)
@@ -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);