svn commit: r245722 - projects/virtio/sys/dev/virtio/scsi
Bryan Venteicher
bryanv at FreeBSD.org
Mon Jan 21 07:00:44 UTC 2013
Author: bryanv
Date: Mon Jan 21 07:00:43 2013
New Revision: 245722
URL: http://svnweb.freebsd.org/changeset/base/245722
Log:
virtio_scsi: Remove interrupt taskqueue
Interrupts are now serviced by an ithread.
Approved by: grehan (implicit)
Modified:
projects/virtio/sys/dev/virtio/scsi/virtio_scsi.c
projects/virtio/sys/dev/virtio/scsi/virtio_scsivar.h
Modified: projects/virtio/sys/dev/virtio/scsi/virtio_scsi.c
==============================================================================
--- projects/virtio/sys/dev/virtio/scsi/virtio_scsi.c Mon Jan 21 06:59:01 2013 (r245721)
+++ projects/virtio/sys/dev/virtio/scsi/virtio_scsi.c Mon Jan 21 07:00:43 2013 (r245722)
@@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/callout.h>
-#include <sys/taskqueue.h>
#include <sys/queue.h>
#include <sys/sbuf.h>
@@ -172,9 +171,6 @@ static struct vtscsi_request * vtscsi_de
static void vtscsi_complete_request(struct vtscsi_request *);
static void vtscsi_complete_vq(struct vtscsi_softc *, struct virtqueue *);
-static void vtscsi_control_vq_task(void *, int);
-static void vtscsi_event_vq_task(void *, int);
-static void vtscsi_request_vq_task(void *, int);
static void vtscsi_control_vq_intr(void *);
static void vtscsi_event_vq_intr(void *);
@@ -333,30 +329,12 @@ vtscsi_attach(device_t dev)
goto fail;
}
- TASK_INIT(&sc->vtscsi_control_intr_task, 0,
- vtscsi_control_vq_task, sc);
- TASK_INIT(&sc->vtscsi_event_intr_task, 0,
- vtscsi_event_vq_task, sc);
- TASK_INIT(&sc->vtscsi_request_intr_task, 0,
- vtscsi_request_vq_task, sc);
-
- sc->vtscsi_tq = taskqueue_create_fast("vtscsi_taskq", M_NOWAIT,
- taskqueue_thread_enqueue, &sc->vtscsi_tq);
- if (sc->vtscsi_tq == NULL) {
- error = ENOMEM;
- device_printf(dev, "cannot allocate taskqueue\n");
- goto fail;
- }
-
error = virtio_setup_intr(dev, INTR_TYPE_CAM);
if (error) {
device_printf(dev, "cannot setup virtqueue interrupts\n");
goto fail;
}
- taskqueue_start_threads(&sc->vtscsi_tq, 1, PI_DISK, "%s taskq",
- device_get_nameunit(dev));
-
vtscsi_enable_vqs_intr(sc);
/*
@@ -389,14 +367,6 @@ vtscsi_detach(device_t dev)
vtscsi_stop(sc);
VTSCSI_UNLOCK(sc);
- if (sc->vtscsi_tq != NULL) {
- taskqueue_drain(sc->vtscsi_tq, &sc->vtscsi_control_intr_task);
- taskqueue_drain(sc->vtscsi_tq, &sc->vtscsi_event_intr_task);
- taskqueue_drain(sc->vtscsi_tq, &sc->vtscsi_request_intr_task);
- taskqueue_free(sc->vtscsi_tq);
- sc->vtscsi_tq = NULL;
- }
-
vtscsi_complete_vqs(sc);
vtscsi_drain_vqs(sc);
@@ -2149,14 +2119,15 @@ vtscsi_complete_vq(struct vtscsi_softc *
}
static void
-vtscsi_control_vq_task(void *arg, int pending)
+vtscsi_control_vq_intr(void *xsc)
{
struct vtscsi_softc *sc;
struct virtqueue *vq;
- sc = arg;
+ sc = xsc;
vq = sc->vtscsi_control_vq;
+again:
VTSCSI_LOCK(sc);
vtscsi_complete_vq(sc, sc->vtscsi_control_vq);
@@ -2164,24 +2135,23 @@ vtscsi_control_vq_task(void *arg, int pe
if (virtqueue_enable_intr(vq) != 0) {
virtqueue_disable_intr(vq);
VTSCSI_UNLOCK(sc);
- taskqueue_enqueue_fast(sc->vtscsi_tq,
- &sc->vtscsi_control_intr_task);
- return;
+ goto again;
}
VTSCSI_UNLOCK(sc);
}
static void
-vtscsi_event_vq_task(void *arg, int pending)
+vtscsi_event_vq_intr(void *xsc)
{
struct vtscsi_softc *sc;
struct virtqueue *vq;
struct virtio_scsi_event *event;
- sc = arg;
+ sc = xsc;
vq = sc->vtscsi_event_vq;
+again:
VTSCSI_LOCK(sc);
while ((event = virtqueue_dequeue(vq, NULL)) != NULL)
@@ -2190,23 +2160,22 @@ vtscsi_event_vq_task(void *arg, int pend
if (virtqueue_enable_intr(vq) != 0) {
virtqueue_disable_intr(vq);
VTSCSI_UNLOCK(sc);
- taskqueue_enqueue_fast(sc->vtscsi_tq,
- &sc->vtscsi_control_intr_task);
- return;
+ goto again;
}
VTSCSI_UNLOCK(sc);
}
static void
-vtscsi_request_vq_task(void *arg, int pending)
+vtscsi_request_vq_intr(void *xsc)
{
struct vtscsi_softc *sc;
struct virtqueue *vq;
- sc = arg;
+ sc = xsc;
vq = sc->vtscsi_request_vq;
+again:
VTSCSI_LOCK(sc);
vtscsi_complete_vq(sc, sc->vtscsi_request_vq);
@@ -2214,51 +2183,13 @@ vtscsi_request_vq_task(void *arg, int pe
if (virtqueue_enable_intr(vq) != 0) {
virtqueue_disable_intr(vq);
VTSCSI_UNLOCK(sc);
- taskqueue_enqueue_fast(sc->vtscsi_tq,
- &sc->vtscsi_request_intr_task);
- return;
+ goto again;
}
VTSCSI_UNLOCK(sc);
}
static void
-vtscsi_control_vq_intr(void *xsc)
-{
- struct vtscsi_softc *sc;
-
- sc = xsc;
-
- virtqueue_disable_intr(sc->vtscsi_control_vq);
- taskqueue_enqueue_fast(sc->vtscsi_tq,
- &sc->vtscsi_control_intr_task);
-}
-
-static void
-vtscsi_event_vq_intr(void *xsc)
-{
- struct vtscsi_softc *sc;
-
- sc = xsc;
-
- virtqueue_disable_intr(sc->vtscsi_event_vq);
- taskqueue_enqueue_fast(sc->vtscsi_tq,
- &sc->vtscsi_event_intr_task);
-}
-
-static void
-vtscsi_request_vq_intr(void *xsc)
-{
- struct vtscsi_softc *sc;
-
- sc = xsc;
-
- virtqueue_disable_intr(sc->vtscsi_request_vq);
- taskqueue_enqueue_fast(sc->vtscsi_tq,
- &sc->vtscsi_request_intr_task);
-}
-
-static void
vtscsi_disable_vqs_intr(struct vtscsi_softc *sc)
{
Modified: projects/virtio/sys/dev/virtio/scsi/virtio_scsivar.h
==============================================================================
--- projects/virtio/sys/dev/virtio/scsi/virtio_scsivar.h Mon Jan 21 06:59:01 2013 (r245721)
+++ projects/virtio/sys/dev/virtio/scsi/virtio_scsivar.h Mon Jan 21 07:00:43 2013 (r245722)
@@ -62,11 +62,6 @@ struct vtscsi_softc {
struct virtqueue *vtscsi_event_vq;
struct virtqueue *vtscsi_request_vq;
- struct taskqueue *vtscsi_tq;
- struct task vtscsi_control_intr_task;
- struct task vtscsi_event_intr_task;
- struct task vtscsi_request_intr_task;
-
struct cam_sim *vtscsi_sim;
struct cam_path *vtscsi_path;
More information about the svn-src-projects
mailing list