]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
xen/blkback: don't use xen_blkif_get() in xen-blkback kthread
authorJuergen Gross <jgross@suse.com>
Thu, 18 May 2017 15:28:49 +0000 (17:28 +0200)
committerSeth Forshee <seth.forshee@canonical.com>
Wed, 5 Jul 2017 16:36:38 +0000 (11:36 -0500)
BugLink: http://bugs.launchpad.net/bugs/1702515
commit a24fa22ce22ae302b3bf8f7008896d52d5d57b8d upstream.

There is no need to use xen_blkif_get()/xen_blkif_put() in the kthread
of xen-blkback. Thread stopping is synchronous and using the blkif
reference counting in the kthread will avoid to ever let the reference
count drop to zero at the end of an I/O running concurrent to
disconnecting and multiple rings.

Setting ring->xenblkd to NULL after stopping the kthread isn't needed
as the kthread does this already.

Signed-off-by: Juergen Gross <jgross@suse.com>
Tested-by: Steven Haigh <netwiz@crc.id.au>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
drivers/block/xen-blkback/blkback.c
drivers/block/xen-blkback/xenbus.c

index fbe0dfdffc0d9b923f9abf08138eab2c621f1dce..0e824091a12fac8757c2ade5d4e5dae6a1470cbd 100644 (file)
@@ -609,8 +609,6 @@ int xen_blkif_schedule(void *arg)
        unsigned long timeout;
        int ret;
 
-       xen_blkif_get(blkif);
-
        set_freezable();
        while (!kthread_should_stop()) {
                if (try_to_freeze())
@@ -665,7 +663,6 @@ purge_gnt_list:
                print_stats(ring);
 
        ring->xenblkd = NULL;
-       xen_blkif_put(blkif);
 
        return 0;
 }
index dcabf52425ff031e52e460c82722475fb0af65a8..e1741544af1dfc6ac209ca548fd41194ded7e0d1 100644 (file)
@@ -255,7 +255,6 @@ static int xen_blkif_disconnect(struct xen_blkif *blkif)
                if (ring->xenblkd) {
                        kthread_stop(ring->xenblkd);
                        wake_up(&ring->shutdown_wq);
-                       ring->xenblkd = NULL;
                }
 
                /* The above kthread_stop() guarantees that at this point we