Module Name: src Committed By: yamaguchi Date: Thu Mar 23 03:44:28 UTC 2023
Modified Files: src/sys/dev/virtio: viocon.c Log Message: viocon(4): fix not to allocate unused virtqueue viocon(4) allocates 4 virtqueues but it only uses 2 (0 and 1) queues. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/dev/virtio/viocon.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/virtio/viocon.c diff -u src/sys/dev/virtio/viocon.c:1.6 src/sys/dev/virtio/viocon.c:1.7 --- src/sys/dev/virtio/viocon.c:1.6 Thu Mar 23 03:27:48 2023 +++ src/sys/dev/virtio/viocon.c Thu Mar 23 03:44:28 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: viocon.c,v 1.6 2023/03/23 03:27:48 yamaguchi Exp $ */ +/* $NetBSD: viocon.c,v 1.7 2023/03/23 03:44:28 yamaguchi Exp $ */ /* $OpenBSD: viocon.c,v 1.8 2021/11/05 11:38:29 mpi Exp $ */ /* @@ -18,7 +18,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: viocon.c,v 1.6 2023/03/23 03:27:48 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: viocon.c,v 1.7 2023/03/23 03:44:28 yamaguchi Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -123,6 +123,9 @@ struct viocon_softc { struct device *sc_dev; struct virtio_softc *sc_virtio; struct virtqueue *sc_vqs; +#define VIOCON_PORT_RX 0 +#define VIOCON_PORT_TX 1 +#define VIOCON_PORT_NQS 2 struct virtqueue *sc_c_vq_rx; struct virtqueue *sc_c_vq_tx; @@ -194,6 +197,7 @@ viocon_attach(struct device *parent, str struct viocon_softc *sc = device_private(self); struct virtio_softc *vsc = device_private(parent); int maxports = 1; + size_t nvqs; sc->sc_dev = self; if (virtio_child(vsc) != NULL) { @@ -203,8 +207,9 @@ viocon_attach(struct device *parent, str } sc->sc_virtio = vsc; sc->sc_max_ports = maxports; + nvqs = VIOCON_PORT_NQS * maxports; - sc->sc_vqs = kmem_zalloc(2 * (maxports + 1) * sizeof(sc->sc_vqs[0]), + sc->sc_vqs = kmem_zalloc(nvqs * sizeof(sc->sc_vqs[0]), KM_SLEEP); sc->sc_ports = kmem_zalloc(maxports * sizeof(sc->sc_ports[0]), KM_SLEEP); @@ -219,13 +224,13 @@ viocon_attach(struct device *parent, str } viocon_rx_fill(sc->sc_ports[0]); - if (virtio_child_attach_finish(vsc, sc->sc_vqs, sc->sc_max_ports * 2, + if (virtio_child_attach_finish(vsc, sc->sc_vqs, nvqs, /*config_change*/NULL, virtio_vq_intr, /*req_flags*/0) != 0) goto err; return; err: - kmem_free(sc->sc_vqs, 2 * (maxports + 1) * sizeof(sc->sc_vqs[0])); + kmem_free(sc->sc_vqs, nvqs * sizeof(sc->sc_vqs[0])); kmem_free(sc->sc_ports, maxports * sizeof(sc->sc_ports[0])); virtio_child_attach_failed(vsc); } @@ -247,11 +252,8 @@ viocon_port_create(struct viocon_softc * vp->vp_sc = sc; DPRINTF("%s: vp: %p\n", __func__, vp); - if (portidx == 0) - rxidx = 0; - else - rxidx = 2 * (portidx + 1); - txidx = rxidx + 1; + rxidx = (portidx * VIOCON_PORT_NQS) + VIOCON_PORT_RX; + txidx = (portidx * VIOCON_PORT_NQS) + VIOCON_PORT_TX; snprintf(name, sizeof(name), "p%drx", portidx); if (virtio_alloc_vq(vsc, &sc->sc_vqs[rxidx], rxidx, BUFSIZE, 1,