/* salt for hash table */
 static u32 vxlan_salt __read_mostly;
-static struct workqueue_struct *vxlan_wq;
 
 static inline bool vxlan_collect_metadata(struct vxlan_sock *vs)
 {
        vxlan_notify_del_rx_port(vs);
        spin_unlock(&vn->sock_lock);
 
-       queue_work(vxlan_wq, &vs->del_work);
+       synchronize_net();
+       udp_tunnel_sock_release(vs->sock);
+       kfree(vs);
 }
 
 static void vxlan_sock_release(struct vxlan_dev *vxlan)
        .get_link       = ethtool_op_get_link,
 };
 
-static void vxlan_del_work(struct work_struct *work)
-{
-       struct vxlan_sock *vs = container_of(work, struct vxlan_sock, del_work);
-       udp_tunnel_sock_release(vs->sock);
-       kfree_rcu(vs, rcu);
-}
-
 static struct socket *vxlan_create_sock(struct net *net, bool ipv6,
                                        __be16 port, u32 flags)
 {
        for (h = 0; h < VNI_HASH_SIZE; ++h)
                INIT_HLIST_HEAD(&vs->vni_list[h]);
 
-       INIT_WORK(&vs->del_work, vxlan_del_work);
-
        sock = vxlan_create_sock(net, ipv6, port, flags);
        if (IS_ERR(sock)) {
                pr_info("Cannot bind port %d, err=%ld\n", ntohs(port),
 {
        int rc;
 
-       vxlan_wq = alloc_workqueue("vxlan", 0, 0);
-       if (!vxlan_wq)
-               return -ENOMEM;
-
        get_random_bytes(&vxlan_salt, sizeof(vxlan_salt));
 
        rc = register_pernet_subsys(&vxlan_net_ops);
 out2:
        unregister_pernet_subsys(&vxlan_net_ops);
 out1:
-       destroy_workqueue(vxlan_wq);
        return rc;
 }
 late_initcall(vxlan_init_module);
 {
        rtnl_link_unregister(&vxlan_link_ops);
        unregister_netdevice_notifier(&vxlan_notifier_block);
-       destroy_workqueue(vxlan_wq);
        unregister_pernet_subsys(&vxlan_net_ops);
        /* rcu_barrier() is called by netns */
 }