pvcalls-front: wait for other operations to return when release passive sockets
authorStefano Stabellini <sstabellini@kernel.org>
Wed, 14 Feb 2018 18:28:24 +0000 (10:28 -0800)
committerJuergen Gross <jgross@suse.com>
Sat, 17 Feb 2018 08:41:06 +0000 (09:41 +0100)
Passive sockets can have ongoing operations on them, specifically, we
have two wait_event_interruptable calls in pvcalls_front_accept.

Add two wake_up calls in pvcalls_front_release, then wait for the
potential waiters to return and release the sock_mapping refcount.

Signed-off-by: Stefano Stabellini <stefano@aporeto.com>
Acked-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
drivers/xen/pvcalls-front.c

index 11ce470..aedbee3 100644 (file)
@@ -1018,6 +1018,12 @@ int pvcalls_front_release(struct socket *sock)
 
                pvcalls_front_free_map(bedata, map);
        } else {
+               wake_up(&bedata->inflight_req);
+               wake_up(&map->passive.inflight_accept_req);
+
+               while (atomic_read(&map->refcount) > 1)
+                       cpu_relax();
+
                spin_lock(&bedata->socket_lock);
                list_del(&map->list);
                spin_unlock(&bedata->socket_lock);