More minor virtio tweaks
authorsf <sf@openbsd.org>
Tue, 30 May 2017 19:28:09 +0000 (19:28 +0000)
committersf <sf@openbsd.org>
Tue, 30 May 2017 19:28:09 +0000 (19:28 +0000)
* add some comments about virtio_enqueue_trim
* include mutex.h explicitly
* make VIRTIO_DEBUG == 1 less verbose in vioblk

ok krw@

sys/dev/pv/vioblk.c
sys/dev/pv/vioscsi.c
sys/dev/pv/virtio.c

index 82f63ce..64552e3 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: vioblk.c,v 1.6 2017/05/30 17:47:11 krw Exp $  */
+/*     $OpenBSD: vioblk.c,v 1.7 2017/05/30 19:28:09 sf Exp $   */
 
 /*
  * Copyright (c) 2012 Stefan Fritsch.
@@ -54,6 +54,7 @@
 #include <sys/device.h>
 #include <sys/stat.h>
 #include <sys/buf.h>
+#include <sys/mutex.h>
 #include <dev/pv/virtioreg.h>
 #include <dev/pv/virtiovar.h>
 #include <dev/pv/vioblkreg.h>
@@ -155,11 +156,8 @@ int vioblk_match(struct device *parent, void *match, void *aux)
        return 0;
 }
 
-#if VIRTIO_DEBUG > 0
-#define DPRINTF(x...) printf(x)
-#else
-#define DPRINTF(x...)          do {} while (0)
-#endif
+#define DNPRINTF(n,x...)                               \
+    do { if (VIRTIO_DEBUG >= n) printf(x); } while(0)
 
 void
 vioblk_attach(struct device *parent, struct device *self, void *aux)
@@ -247,7 +245,7 @@ vioblk_attach(struct device *parent, struct device *self, void *aux)
        sc->sc_link.adapter_buswidth = 2;
        sc->sc_link.luns = 1;
        sc->sc_link.adapter_target = 2;
-       DPRINTF("%s: qsize: %d\n", __func__, qsize);
+       DNPRINTF(1, "%s: qsize: %d\n", __func__, qsize);
        if (features & VIRTIO_BLK_F_RO)
                sc->sc_link.flags |= SDEV_READONLY;
 
@@ -285,7 +283,7 @@ vioblk_req_get(void *cookie)
                SLIST_REMOVE_HEAD(&sc->sc_freelist, vr_list);
        mtx_leave(&sc->sc_vr_mtx);
 
-       DPRINTF("%s: %p\n", __func__, vr);
+       DNPRINTF(2, "%s: %p\n", __func__, vr);
 
        return vr;
 }
@@ -296,7 +294,7 @@ vioblk_req_put(void *cookie, void *io)
        struct vioblk_softc *sc = cookie;
        struct virtio_blk_req *vr = io;
 
-       DPRINTF("%s: %p\n", __func__, vr);
+       DNPRINTF(2, "%s: %p\n", __func__, vr);
 
        mtx_enter(&sc->sc_vr_mtx);
        /*
@@ -356,7 +354,7 @@ vioblk_vq_done1(struct vioblk_softc *sc, struct virtio_softc *vsc,
 
 
        if (vr->vr_status != VIRTIO_BLK_S_OK) {
-               DPRINTF("%s: EIO\n", __func__);
+               DNPRINTF(1, "%s: EIO\n", __func__);
                xs->error = XS_DRIVER_STUFFUP;
                xs->resid = xs->datalen;
        } else {
@@ -695,15 +693,16 @@ vioblk_alloc_reqs(struct vioblk_softc *sc, int qsize)
                         */
                        vd = &vq->vq_desc[slot];
                        for (r = 0; r < ALLOC_SEGS - 1; r++) {
-                               DPRINTF("%s: vd[%d].next = %d should be %d\n",
-                                   __func__, r, vd[r].next, (slot + r + 1));
+                               DNPRINTF(2, "%s: vd[%d].next = %d should be "
+                                   "%d\n", __func__, r, vd[r].next,
+                                   (slot + r + 1));
                                if (vd[r].next != (slot + r + 1))
                                        return i;
                        }
                        if (r == (ALLOC_SEGS -1) && vd[r].next != 0)
                                return i;
-                       DPRINTF("%s: reserved slots are contiguous (good!)\n",
-                           __func__);
+                       DNPRINTF(2, "%s: reserved slots are contiguous "
+                           "(good!)\n", __func__);
                }
 
                vr->vr_qe_index = slot;
index 8e90a73..cdd2a5e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: vioscsi.c,v 1.10 2017/05/30 12:47:47 krw Exp $        */
+/*     $OpenBSD: vioscsi.c,v 1.11 2017/05/30 19:28:09 sf Exp $ */
 /*
  * Copyright (c) 2013 Google Inc.
  *
@@ -19,6 +19,7 @@
 #include <sys/types.h>
 #include <sys/systm.h>
 #include <sys/device.h>
+#include <sys/mutex.h>
 
 #include <machine/bus.h>
 #include <machine/intr.h>
index 6dbfb35..116e100 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: virtio.c,v 1.8 2017/05/30 12:47:47 krw Exp $  */
+/*     $OpenBSD: virtio.c,v 1.9 2017/05/30 19:28:09 sf Exp $   */
 /*     $NetBSD: virtio.c,v 1.3 2011/11/02 23:05:52 njoly Exp $ */
 
 /*
@@ -462,7 +462,7 @@ vq_free_entry(struct virtqueue *vq, struct vq_entry *qe)
  *  - command blocks (in dmamem) should be pre-allocated and mapped
  *  - dmamaps for command blocks should be pre-allocated and loaded
  *  - dmamaps for payload should be pre-allocated
- *      r = virtio_enqueue_prep(sc, vq, &slot);                // allocate a slot
+ *     r = virtio_enqueue_prep(sc, vq, &slot);         // allocate a slot
  *     if (r)          // currently 0 or EAGAIN
  *       return r;
  *     r = bus_dmamap_load(dmat, dmamap_payload[slot], data, count, ..);
@@ -484,6 +484,26 @@ vq_free_entry(struct virtqueue *vq, struct vq_entry *qe)
  *     virtio_enqueue(sc, vq, slot, dmamap_cmd[slot], 0);
  *     virtio_enqueue(sc, vq, slot, dmamap_payload[slot], iswrite);
  *     virtio_enqueue_commit(sc, vq, slot, 1);
+ *
+ * Alternative usage with statically allocated slots:
+ *     <during initialization>
+ *     // while not out of slots, do
+ *     virtio_enqueue_prep(sc, vq, &slot);             // allocate a slot
+ *     virtio_enqueue_reserve(sc, vq, slot, max_segs); // reserve all slots
+ *                                             that may ever be needed
+ *
+ *     <when enqueing a request>
+ *     // Don't call virtio_enqueue_prep()
+ *     bus_dmamap_load(dmat, dmamap_payload[slot], data, count, ..);
+ *     bus_dmamap_sync(dmat, dmamap_cmd[slot],... BUS_DMASYNC_PREWRITE);
+ *     bus_dmamap_sync(dmat, dmamap_payload[slot],...);
+ *     virtio_enqueue_trim(sc, vq, slot, num_segs_needed);
+ *     virtio_enqueue(sc, vq, slot, dmamap_cmd[slot], 0);
+ *     virtio_enqueue(sc, vq, slot, dmamap_payload[slot], iswrite);
+ *     virtio_enqueue_commit(sc, vq, slot, 1);
+ *
+ *     <when dequeuing>
+ *     // don't call virtio_dequeue_commit()
  */
 
 /*
@@ -785,6 +805,9 @@ virtio_dequeue(struct virtio_softc *sc, struct virtqueue *vq,
 /*
  * dequeue_commit: complete dequeue; the slot is recycled for future use.
  *                 if you forget to call this the slot will be leaked.
+ *
+ *                 Don't call this if you use statically allocated slots
+ *                 and virtio_dequeue_trim().
  */
 int
 virtio_dequeue_commit(struct virtqueue *vq, int slot)