svn commit: r245711 - projects/virtio/sys/dev/virtio/block
Bryan Venteicher
bryanv at FreeBSD.org
Mon Jan 21 06:46:18 UTC 2013
Author: bryanv
Date: Mon Jan 21 06:46:17 2013
New Revision: 245711
URL: http://svnweb.freebsd.org/changeset/base/245711
Log:
virtio_blk: Remove interrupt taskqueue
Interrupts are now serviced in an ithread.
Approved by: grehan (implicit)
Modified:
projects/virtio/sys/dev/virtio/block/virtio_blk.c
Modified: projects/virtio/sys/dev/virtio/block/virtio_blk.c
==============================================================================
--- projects/virtio/sys/dev/virtio/block/virtio_blk.c Mon Jan 21 06:45:01 2013 (r245710)
+++ projects/virtio/sys/dev/virtio/block/virtio_blk.c Mon Jan 21 06:46:17 2013 (r245711)
@@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/queue.h>
-#include <sys/taskqueue.h>
#include <geom/geom_disk.h>
@@ -83,9 +82,6 @@ struct vtblk_softc {
TAILQ_HEAD(, vtblk_request)
vtblk_req_ready;
- struct taskqueue *vtblk_tq;
- struct task vtblk_intr_task;
-
int vtblk_max_nsegs;
int vtblk_request_count;
@@ -137,7 +133,6 @@ static int vtblk_execute_request(struct
struct vtblk_request *);
static void vtblk_vq_intr(void *);
-static void vtblk_intr_task(void *, int);
static void vtblk_stop(struct vtblk_softc *);
@@ -330,24 +325,12 @@ vtblk_attach(device_t dev)
vtblk_alloc_disk(sc, &blkcfg);
- TASK_INIT(&sc->vtblk_intr_task, 0, vtblk_intr_task, sc);
- sc->vtblk_tq = taskqueue_create_fast("vtblk_taskq", M_NOWAIT,
- taskqueue_thread_enqueue, &sc->vtblk_tq);
- if (sc->vtblk_tq == NULL) {
- error = ENOMEM;
- device_printf(dev, "cannot allocate taskqueue\n");
- goto fail;
- }
-
error = virtio_setup_intr(dev, INTR_TYPE_BIO | INTR_ENTROPY);
if (error) {
device_printf(dev, "cannot setup virtqueue interrupt\n");
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);
@@ -372,12 +355,6 @@ vtblk_detach(device_t dev)
vtblk_stop(sc);
VTBLK_UNLOCK(sc);
- if (sc->vtblk_tq != NULL) {
- taskqueue_drain(sc->vtblk_tq, &sc->vtblk_intr_task);
- taskqueue_free(sc->vtblk_tq);
- sc->vtblk_tq = NULL;
- }
-
vtblk_drain(sc);
if (sc->vtblk_disk != NULL) {
@@ -812,22 +789,12 @@ static void
vtblk_vq_intr(void *xsc)
{
struct vtblk_softc *sc;
-
- sc = xsc;
-
- virtqueue_disable_intr(sc->vtblk_vq);
- taskqueue_enqueue_fast(sc->vtblk_tq, &sc->vtblk_intr_task);
-}
-
-static void
-vtblk_intr_task(void *arg, int pending)
-{
- struct vtblk_softc *sc;
struct virtqueue *vq;
- sc = arg;
+ sc = xsc;
vq = sc->vtblk_vq;
+again:
VTBLK_LOCK(sc);
if (sc->vtblk_flags & VTBLK_FLAG_DETACH) {
VTBLK_UNLOCK(sc);
@@ -844,9 +811,7 @@ vtblk_intr_task(void *arg, int pending)
if (virtqueue_enable_intr(vq) != 0) {
virtqueue_disable_intr(vq);
VTBLK_UNLOCK(sc);
- taskqueue_enqueue_fast(sc->vtblk_tq,
- &sc->vtblk_intr_task);
- return;
+ goto again;
}
VTBLK_UNLOCK(sc);
More information about the svn-src-projects
mailing list