svn commit: r244200 - in head/sys/dev/virtio: block network scsi
Bryan Venteicher
bryanv at FreeBSD.org
Fri Dec 14 05:27:58 UTC 2012
Author: bryanv
Date: Fri Dec 14 05:27:56 2012
New Revision: 244200
URL: http://svnweb.freebsd.org/changeset/base/244200
Log:
virtio: Start taskqueues threads after attach cannot fail
If virtio_setup_intr() failed during boot, we would hang in
taskqueue_free() -> taskqueue_terminate() for all the taskq
threads to terminate. This will never happen since the
scheduler is not running by this point.
Reported by: neel, grehan
Approved by: grehan (mentor)
Modified:
head/sys/dev/virtio/block/virtio_blk.c
head/sys/dev/virtio/network/if_vtnet.c
head/sys/dev/virtio/scsi/virtio_scsi.c
Modified: head/sys/dev/virtio/block/virtio_blk.c
==============================================================================
--- head/sys/dev/virtio/block/virtio_blk.c Fri Dec 14 00:13:29 2012 (r244199)
+++ head/sys/dev/virtio/block/virtio_blk.c Fri Dec 14 05:27:56 2012 (r244200)
@@ -338,8 +338,6 @@ vtblk_attach(device_t dev)
device_printf(dev, "cannot allocate taskqueue\n");
goto fail;
}
- taskqueue_start_threads(&sc->vtblk_tq, 1, PI_DISK, "%s taskq",
- device_get_nameunit(dev));
error = virtio_setup_intr(dev, INTR_TYPE_BIO | INTR_ENTROPY);
if (error) {
@@ -347,6 +345,9 @@ vtblk_attach(device_t dev)
goto fail;
}
+ taskqueue_start_threads(&sc->vtblk_tq, 1, PI_DISK, "%s taskq",
+ device_get_nameunit(dev));
+
vtblk_create_disk(sc);
virtqueue_enable_intr(sc->vtblk_vq);
Modified: head/sys/dev/virtio/network/if_vtnet.c
==============================================================================
--- head/sys/dev/virtio/network/if_vtnet.c Fri Dec 14 00:13:29 2012 (r244199)
+++ head/sys/dev/virtio/network/if_vtnet.c Fri Dec 14 05:27:56 2012 (r244200)
@@ -439,18 +439,17 @@ vtnet_attach(device_t dev)
ether_ifdetach(ifp);
goto fail;
}
- taskqueue_start_threads(&sc->vtnet_tq, 1, PI_NET, "%s taskq",
- device_get_nameunit(dev));
error = virtio_setup_intr(dev, INTR_TYPE_NET);
if (error) {
device_printf(dev, "cannot setup virtqueue interrupts\n");
- taskqueue_free(sc->vtnet_tq);
- sc->vtnet_tq = NULL;
ether_ifdetach(ifp);
goto fail;
}
+ taskqueue_start_threads(&sc->vtnet_tq, 1, PI_NET, "%s taskq",
+ device_get_nameunit(dev));
+
/*
* Device defaults to promiscuous mode for backwards
* compatibility. Turn it off if possible.
Modified: head/sys/dev/virtio/scsi/virtio_scsi.c
==============================================================================
--- head/sys/dev/virtio/scsi/virtio_scsi.c Fri Dec 14 00:13:29 2012 (r244199)
+++ head/sys/dev/virtio/scsi/virtio_scsi.c Fri Dec 14 05:27:56 2012 (r244200)
@@ -347,12 +347,6 @@ vtscsi_attach(device_t dev)
device_printf(dev, "cannot allocate taskqueue\n");
goto fail;
}
- error = taskqueue_start_threads(&sc->vtscsi_tq, 1, PI_DISK, "%s taskq",
- device_get_nameunit(dev));
- if (error) {
- device_printf(dev, "cannot start taskqueue threads\n");
- goto fail;
- }
error = virtio_setup_intr(dev, INTR_TYPE_CAM);
if (error) {
@@ -360,6 +354,9 @@ vtscsi_attach(device_t dev)
goto fail;
}
+ taskqueue_start_threads(&sc->vtscsi_tq, 1, PI_DISK, "%s taskq",
+ device_get_nameunit(dev));
+
vtscsi_enable_vqs_intr(sc);
/*
More information about the svn-src-all
mailing list