Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Dec 2012 05:27:57 +0000 (UTC)
From:      Bryan Venteicher <bryanv@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r244200 - in head/sys/dev/virtio: block network scsi
Message-ID:  <201212140527.qBE5Rvue097151@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 
 	/*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212140527.qBE5Rvue097151>