pvcalls-front: wait for other operations to return when release passive sockets

"Linux Kernel Mailing List" <[email protected]> Sat, 17 Feb 2018 17:49:14 +0000 (UTC)
Newsgroups gmane.linux.kernel.commits.head
Message-ID <[email protected]>
Web:        https://git.kernel.org/torvalds/c/d1a75e0896f5e9f5cb6a979caaea39f1f4b9feb1
Commit:     d1a75e0896f5e9f5cb6a979caaea39f1f4b9feb1
Parent:     64d6871827b1e2ac8c9daf49f2c883378c7d50cd
Refname:    refs/heads/master
Author:     Stefano Stabellini <[email protected]>
AuthorDate: Wed Feb 14 10:28:24 2018 -0800
Committer:  Juergen Gross <[email protected]>
CommitDate: Sat Feb 17 09:41:06 2018 +0100

    pvcalls-front: wait for other operations to return when release passive sockets
    
    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 <[email protected]>
    Acked-by: Juergen Gross <[email protected]>
    Signed-off-by: Juergen Gross <[email protected]>
---
 drivers/xen/pvcalls-front.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/xen/pvcalls-front.c b/drivers/xen/pvcalls-front.c
index 11ce470b41a5..aedbee3b2838 100644
--- a/drivers/xen/pvcalls-front.c
+++ b/drivers/xen/pvcalls-front.c
@@ -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);
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html