diff options
| author | yamaguchi <yamaguchi@NetBSD.org> | 2023-03-23 03:27:48 +0000 |
|---|---|---|
| committer | yamaguchi <yamaguchi@NetBSD.org> | 2023-03-23 03:27:48 +0000 |
| commit | cd64efe29b3e5a2d52122476e460534dbf1f819f (patch) | |
| tree | 96c6c55cc7d192fae9f0a076483a12f88d8ac2bd /sys/dev | |
| parent | 7d5560eb106df2e421dc302ec7b2987c8732366e (diff) | |
Set virtqueues in virtio_child_attach_finish
The number of virtqueue maybe change in a part of VirtIO devices
(e.g. vioif(4)). And it is fixed after negotiation of features.
So the configuration is moved into the function.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/pci/if_vioif.c | 32 | ||||
| -rw-r--r-- | sys/dev/pci/ld_virtio.c | 10 | ||||
| -rw-r--r-- | sys/dev/pci/vio9p.c | 17 | ||||
| -rw-r--r-- | sys/dev/pci/viomb.c | 10 | ||||
| -rw-r--r-- | sys/dev/pci/viornd.c | 9 | ||||
| -rw-r--r-- | sys/dev/pci/vioscsi.c | 11 | ||||
| -rw-r--r-- | sys/dev/pci/virtio.c | 58 | ||||
| -rw-r--r-- | sys/dev/pci/virtio_pci.c | 30 | ||||
| -rw-r--r-- | sys/dev/pci/virtiovar.h | 14 | ||||
| -rw-r--r-- | sys/dev/virtio/viocon.c | 13 |
10 files changed, 102 insertions, 102 deletions
diff --git a/sys/dev/pci/if_vioif.c b/sys/dev/pci/if_vioif.c index 8608aa33fec..2e2c95eaf85 100644 --- a/sys/dev/pci/if_vioif.c +++ b/sys/dev/pci/if_vioif.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_vioif.c,v 1.102 2023/03/23 03:02:17 yamaguchi Exp $ */ +/* $NetBSD: if_vioif.c,v 1.103 2023/03/23 03:27:48 yamaguchi Exp $ */ /* * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.102 2023/03/23 03:02:17 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.103 2023/03/23 03:27:48 yamaguchi Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -465,7 +465,7 @@ vioif_attach(device_t parent, device_t self, void *aux) u_int softint_flags; int r, i, req_flags; char xnamebuf[MAXCOMLEN]; - size_t netq_num; + size_t nvqs; if (virtio_child(vsc) != NULL) { aprint_normal(": child already attached for %s; " @@ -509,11 +509,11 @@ vioif_attach(device_t parent, device_t self, void *aux) #ifdef VIOIF_MULTIQ req_features |= VIRTIO_NET_F_MQ; #endif - virtio_child_attach_start(vsc, self, IPL_NET, NULL, - vioif_config_change, virtio_vq_intrhand, req_flags, - req_features, VIRTIO_NET_FLAG_BITS); + virtio_child_attach_start(vsc, self, IPL_NET, + req_features, VIRTIO_NET_FLAG_BITS); features = virtio_features(vsc); + if (features == 0) goto err; @@ -565,10 +565,12 @@ vioif_attach(device_t parent, device_t self, void *aux) /* Limit the number of queue pairs to use */ sc->sc_req_nvq_pairs = MIN(sc->sc_max_nvq_pairs, ncpu); + + if (sc->sc_max_nvq_pairs > 1) + req_flags |= VIRTIO_F_INTR_PERVQ; } vioif_alloc_queues(sc); - virtio_child_attach_set_vqs(vsc, sc->sc_vqs, sc->sc_req_nvq_pairs); #ifdef VIOIF_MPSAFE softint_flags = SOFTINT_NET | SOFTINT_MPSAFE; @@ -579,15 +581,17 @@ vioif_attach(device_t parent, device_t self, void *aux) /* * Initialize network queues */ - netq_num = sc->sc_max_nvq_pairs * 2; - for (i = 0; i < netq_num; i++) { + nvqs = sc->sc_max_nvq_pairs * 2; + for (i = 0; i < nvqs; i++) { r = vioif_netqueue_init(sc, vsc, i, softint_flags); if (r != 0) goto err; } if (sc->sc_has_ctrl) { - int ctrlq_idx = sc->sc_max_nvq_pairs * 2; + int ctrlq_idx = nvqs; + + nvqs++; /* * Allocating a virtqueue for control channel */ @@ -618,7 +622,9 @@ vioif_attach(device_t parent, device_t self, void *aux) if (vioif_alloc_mems(sc) < 0) goto err; - if (virtio_child_attach_finish(vsc) != 0) + r = virtio_child_attach_finish(vsc, sc->sc_vqs, nvqs, + vioif_config_change, virtio_vq_intrhand, req_flags); + if (r != 0) goto err; if (vioif_setup_sysctl(sc) != 0) { @@ -656,8 +662,8 @@ vioif_attach(device_t parent, device_t self, void *aux) return; err: - netq_num = sc->sc_max_nvq_pairs * 2; - for (i = 0; i < netq_num; i++) { + nvqs = sc->sc_max_nvq_pairs * 2; + for (i = 0; i < nvqs; i++) { vioif_netqueue_teardown(sc, vsc, i); } diff --git a/sys/dev/pci/ld_virtio.c b/sys/dev/pci/ld_virtio.c index 13a76709cb0..c360312e4f6 100644 --- a/sys/dev/pci/ld_virtio.c +++ b/sys/dev/pci/ld_virtio.c @@ -1,4 +1,4 @@ -/* $NetBSD: ld_virtio.c,v 1.30 2022/04/13 10:42:12 uwe Exp $ */ +/* $NetBSD: ld_virtio.c,v 1.31 2023/03/23 03:27:48 yamaguchi Exp $ */ /* * Copyright (c) 2010 Minoura Makoto. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,v 1.30 2022/04/13 10:42:12 uwe Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,v 1.31 2023/03/23 03:27:48 yamaguchi Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -275,8 +275,7 @@ ld_virtio_attach(device_t parent, device_t self, void *aux) sc->sc_dev = self; sc->sc_virtio = vsc; - virtio_child_attach_start(vsc, self, IPL_BIO, &sc->sc_vq, - NULL, virtio_vq_intr, VIRTIO_F_INTR_MSIX, + virtio_child_attach_start(vsc, self, IPL_BIO, (VIRTIO_BLK_F_SIZE_MAX | VIRTIO_BLK_F_SEG_MAX | VIRTIO_BLK_F_GEOMETRY | VIRTIO_BLK_F_RO | VIRTIO_BLK_F_BLK_SIZE | VIRTIO_BLK_F_FLUSH | VIRTIO_BLK_F_CONFIG_WCE), @@ -340,7 +339,8 @@ ld_virtio_attach(device_t parent, device_t self, void *aux) qsize = sc->sc_vq.vq_num; sc->sc_vq.vq_done = ld_virtio_vq_done; - if (virtio_child_attach_finish(vsc) != 0) + if (virtio_child_attach_finish(vsc, &sc->sc_vq, 1, + NULL, virtio_vq_intr, VIRTIO_F_INTR_MSIX) != 0) goto err; ld->sc_dv = self; diff --git a/sys/dev/pci/vio9p.c b/sys/dev/pci/vio9p.c index beed4ee322c..5a4cfb4bf28 100644 --- a/sys/dev/pci/vio9p.c +++ b/sys/dev/pci/vio9p.c @@ -1,4 +1,4 @@ -/* $NetBSD: vio9p.c,v 1.9 2022/04/20 22:08:10 uwe Exp $ */ +/* $NetBSD: vio9p.c,v 1.10 2023/03/23 03:27:48 yamaguchi Exp $ */ /* * Copyright (c) 2019 Internet Initiative Japan, Inc. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vio9p.c,v 1.9 2022/04/20 22:08:10 uwe Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vio9p.c,v 1.10 2023/03/23 03:27:48 yamaguchi Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -500,11 +500,8 @@ vio9p_attach(device_t parent, device_t self, void *aux) sc->sc_dev = self; sc->sc_virtio = vsc; - virtio_child_attach_start(vsc, self, IPL_VM, sc->sc_vq, - NULL, virtio_vq_intr, - VIRTIO_F_INTR_MPSAFE | VIRTIO_F_INTR_SOFTINT, - VIO9P_F_MOUNT_TAG, - VIO9P_FLAG_BITS); + virtio_child_attach_start(vsc, self, IPL_VM, + VIO9P_F_MOUNT_TAG, VIO9P_FLAG_BITS); features = virtio_features(vsc); if ((features & VIO9P_F_MOUNT_TAG) == 0) @@ -517,8 +514,6 @@ vio9p_attach(device_t parent, device_t self, void *aux) sc->sc_vq[0].vq_done = vio9p_request_done; - virtio_child_attach_set_vqs(vsc, sc->sc_vq, 1); - sc->sc_buf_tx = kmem_alloc(VIO9P_MAX_REQLEN, KM_SLEEP); sc->sc_buf_rx = kmem_alloc(VIO9P_MAX_REQLEN, KM_SLEEP); @@ -559,7 +554,9 @@ vio9p_attach(device_t parent, device_t self, void *aux) vio9p_read_config(sc); aprint_normal_dev(self, "tagged as %s\n", sc->sc_tag); - error = virtio_child_attach_finish(vsc); + error = virtio_child_attach_finish(vsc, sc->sc_vq, + __arraycount(sc->sc_vq), NULL, virtio_vq_intr, + VIRTIO_F_INTR_MPSAFE | VIRTIO_F_INTR_SOFTINT); if (error != 0) goto err_mutex; diff --git a/sys/dev/pci/viomb.c b/sys/dev/pci/viomb.c index ed101e450f1..ae23a4c2b09 100644 --- a/sys/dev/pci/viomb.c +++ b/sys/dev/pci/viomb.c @@ -1,4 +1,4 @@ -/* $NetBSD: viomb.c,v 1.13 2022/04/13 10:42:12 uwe Exp $ */ +/* $NetBSD: viomb.c,v 1.14 2023/03/23 03:27:48 yamaguchi Exp $ */ /* * Copyright (c) 2010 Minoura Makoto. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: viomb.c,v 1.13 2022/04/13 10:42:12 uwe Exp $"); +__KERNEL_RCSID(0, "$NetBSD: viomb.c,v 1.14 2023/03/23 03:27:48 yamaguchi Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -148,8 +148,7 @@ viomb_attach(device_t parent, device_t self, void *aux) sc->sc_dev = self; sc->sc_virtio = vsc; - virtio_child_attach_start(vsc, self, IPL_VM, sc->sc_vq, - viomb_config_change, virtio_vq_intr, 0, + virtio_child_attach_start(vsc, self, IPL_VM, VIRTIO_BALLOON_F_MUST_TELL_HOST, VIRTIO_BALLOON_FLAG_BITS); features = virtio_features(vsc); @@ -190,7 +189,8 @@ viomb_attach(device_t parent, device_t self, void *aux) goto err_dmamap; } - if (virtio_child_attach_finish(vsc) != 0) + if (virtio_child_attach_finish(vsc, sc->sc_vq, __arraycount(sc->sc_vq), + viomb_config_change, virtio_vq_intr, 0) != 0) goto err_out; if (kthread_create(PRI_IDLE, KTHREAD_MPSAFE, NULL, diff --git a/sys/dev/pci/viornd.c b/sys/dev/pci/viornd.c index 897d7fca788..97888340787 100644 --- a/sys/dev/pci/viornd.c +++ b/sys/dev/pci/viornd.c @@ -1,4 +1,4 @@ -/* $NetBSD: viornd.c,v 1.18 2022/04/14 19:47:14 riastradh Exp $ */ +/* $NetBSD: viornd.c,v 1.19 2023/03/23 03:27:48 yamaguchi Exp $ */ /* $OpenBSD: viornd.c,v 1.1 2014/01/21 21:14:58 sf Exp $ */ /* @@ -176,8 +176,7 @@ viornd_attach(device_t parent, device_t self, void *aux) goto load_failed; } - virtio_child_attach_start(vsc, self, IPL_NET, &sc->sc_vq, - NULL, virtio_vq_intr, 0, + virtio_child_attach_start(vsc, self, IPL_NET, 0, VIRTIO_COMMON_FLAG_BITS); error = virtio_alloc_vq(vsc, &sc->sc_vq, 0, VIORND_BUFSIZE, 1, @@ -189,7 +188,9 @@ viornd_attach(device_t parent, device_t self, void *aux) } sc->sc_vq.vq_done = viornd_vq_done; - if (virtio_child_attach_finish(vsc) != 0) { + error = virtio_child_attach_finish(vsc, &sc->sc_vq, 1, + NULL, virtio_vq_intr, 0); + if (error) { virtio_free_vq(vsc, &sc->sc_vq); goto vio_failed; } diff --git a/sys/dev/pci/vioscsi.c b/sys/dev/pci/vioscsi.c index 77d98c2c455..addd114a320 100644 --- a/sys/dev/pci/vioscsi.c +++ b/sys/dev/pci/vioscsi.c @@ -1,4 +1,4 @@ -/* $NetBSD: vioscsi.c,v 1.30 2022/10/11 22:03:37 andvar Exp $ */ +/* $NetBSD: vioscsi.c,v 1.31 2023/03/23 03:27:48 yamaguchi Exp $ */ /* $OpenBSD: vioscsi.c,v 1.3 2015/03/14 03:38:49 jsg Exp $ */ /* @@ -18,7 +18,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vioscsi.c,v 1.30 2022/10/11 22:03:37 andvar Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vioscsi.c,v 1.31 2023/03/23 03:27:48 yamaguchi Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -128,8 +128,7 @@ vioscsi_attach(device_t parent, device_t self, void *aux) sc->sc_dev = self; - virtio_child_attach_start(vsc, self, ipl, sc->sc_vqs, - NULL, virtio_vq_intr, VIRTIO_F_INTR_MSIX, + virtio_child_attach_start(vsc, self, ipl, 0, VIRTIO_COMMON_FLAG_BITS); mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, ipl); @@ -171,7 +170,9 @@ vioscsi_attach(device_t parent, device_t self, void *aux) " max_lun %u\n", cmd_per_lun, qsize, seg_max, max_target, max_lun); - if (virtio_child_attach_finish(vsc) != 0) + if (virtio_child_attach_finish(vsc, sc->sc_vqs, + __arraycount(sc->sc_vqs), NULL, virtio_vq_intr, + VIRTIO_F_INTR_MSIX) != 0) goto err; /* diff --git a/sys/dev/pci/virtio.c b/sys/dev/pci/virtio.c index 39301d61cc2..9ff436809d8 100644 --- a/sys/dev/pci/virtio.c +++ b/sys/dev/pci/virtio.c @@ -1,4 +1,4 @@ -/* $NetBSD: virtio.c,v 1.65 2023/01/03 19:33:31 jakllsch Exp $ */ +/* $NetBSD: virtio.c,v 1.66 2023/03/23 03:27:48 yamaguchi Exp $ */ /* * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: virtio.c,v 1.65 2023/01/03 19:33:31 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: virtio.c,v 1.66 2023/03/23 03:27:48 yamaguchi Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -762,9 +762,6 @@ virtio_alloc_vq(struct virtio_softc *sc, struct virtqueue *vq, int index, int rsegs, r, hdrlen; #define VIRTQUEUE_ALIGN(n) roundup(n, VIRTIO_PAGE_SIZE) - /* Make sure callers allocate vqs in order */ - KASSERT(sc->sc_nvqs == index); - memset(vq, 0, sizeof(*vq)); vq_size = sc->sc_ops->read_queue_size(sc, index); @@ -864,8 +861,6 @@ virtio_alloc_vq(struct virtio_softc *sc, struct virtqueue *vq, int index, "using %d byte (%d entries) indirect descriptors\n", allocsize3, maxnsegs * vq_size); - sc->sc_nvqs++; - return 0; err: @@ -913,8 +908,6 @@ virtio_free_vq(struct virtio_softc *sc, struct virtqueue *vq) mutex_destroy(&vq->vq_aring_lock); memset(vq, 0, sizeof(*vq)); - sc->sc_nvqs--; - return 0; } @@ -1270,19 +1263,12 @@ virtio_dequeue_commit(struct virtio_softc *sc, struct virtqueue *vq, int slot) */ void virtio_child_attach_start(struct virtio_softc *sc, device_t child, int ipl, - struct virtqueue *vqs, - virtio_callback config_change, - virtio_callback intr_hand, - int req_flags, int req_features, const char *feat_bits) + uint64_t req_features, const char *feat_bits) { char buf[1024]; sc->sc_child = child; sc->sc_ipl = ipl; - sc->sc_vqs = vqs; - sc->sc_config_change = config_change; - sc->sc_intrhand = intr_hand; - sc->sc_flags = req_flags; virtio_negotiate_features(sc, req_features); snprintb(buf, sizeof(buf), feat_bits, sc->sc_active_features); @@ -1290,25 +1276,35 @@ virtio_child_attach_start(struct virtio_softc *sc, device_t child, int ipl, aprint_naive("\n"); } -void -virtio_child_attach_set_vqs(struct virtio_softc *sc, - struct virtqueue *vqs, int nvq_pairs) -{ - - KASSERT(nvq_pairs == 1 || - (sc->sc_flags & VIRTIO_F_INTR_SOFTINT) == 0); - if (nvq_pairs > 1) - sc->sc_child_mq = true; - - sc->sc_vqs = vqs; -} - int -virtio_child_attach_finish(struct virtio_softc *sc) +virtio_child_attach_finish(struct virtio_softc *sc, + struct virtqueue *vqs, size_t nvqs, + virtio_callback config_change, virtio_callback intr_hand, + int req_flags) { int r; +#ifdef DIAGNOSTIC + KASSERT(nvqs > 0); +#define VIRTIO_ASSERT_FLAGS (VIRTIO_F_INTR_SOFTINT | VIRTIO_F_INTR_PERVQ) + KASSERT((req_flags & VIRTIO_ASSERT_FLAGS) != VIRTIO_ASSERT_FLAGS); +#undef VIRTIO_ASSERT_FLAGS + + for (size_t _i = 0; _i < nvqs; _i++){ + KASSERT(vqs[_i].vq_index == _i); + KASSERT((req_flags & VIRTIO_F_INTR_PERVQ) == 0 || + vqs[_i].vq_intrhand != NULL); + } +#endif + sc->sc_finished_called = true; + + sc->sc_vqs = vqs; + sc->sc_nvqs = nvqs; + sc->sc_config_change = config_change; + sc->sc_intrhand = intr_hand; + sc->sc_flags = req_flags; + r = sc->sc_ops->alloc_interrupts(sc); if (r != 0) { aprint_error_dev(sc->sc_dev, diff --git a/sys/dev/pci/virtio_pci.c b/sys/dev/pci/virtio_pci.c index 08b63114b33..35edca7a0d4 100644 --- a/sys/dev/pci/virtio_pci.c +++ b/sys/dev/pci/virtio_pci.c @@ -1,4 +1,4 @@ -/* $NetBSD: virtio_pci.c,v 1.38 2022/05/30 20:28:18 riastradh Exp $ */ +/* $NetBSD: virtio_pci.c,v 1.39 2023/03/23 03:27:48 yamaguchi Exp $ */ /* * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: virtio_pci.c,v 1.38 2022/05/30 20:28:18 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: virtio_pci.c,v 1.39 2023/03/23 03:27:48 yamaguchi Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -73,6 +73,7 @@ static int virtio_pci_detach(device_t, int); sizeof(pcireg_t)) struct virtio_pci_softc { struct virtio_softc sc_sc; + bool sc_intr_pervq; /* IO space */ bus_space_tag_t sc_iot; @@ -629,7 +630,7 @@ virtio_pci_setup_queue_09(struct virtio_softc *sc, uint16_t idx, uint64_t addr) if (psc->sc_ihs_num > 1) { int vec = VIRTIO_MSIX_QUEUE_VECTOR_INDEX; - if (sc->sc_child_mq) + if (psc->sc_intr_pervq) vec += idx; bus_space_write_2(psc->sc_iot, psc->sc_ioh, VIRTIO_CONFIG_MSI_QUEUE_VECTOR, vec); @@ -751,7 +752,7 @@ virtio_pci_setup_queue_10(struct virtio_softc *sc, uint16_t idx, uint64_t addr) if (psc->sc_ihs_num > 1) { int vec = VIRTIO_MSIX_QUEUE_VECTOR_INDEX; - if (sc->sc_child_mq) + if (psc->sc_intr_pervq) vec += idx; bus_space_write_2(iot, ioh, VIRTIO_CONFIG1_QUEUE_MSIX_VECTOR, vec); @@ -849,7 +850,7 @@ virtio_pci_setup_interrupts_10(struct virtio_softc *sc, int reinit) for (qid = 0; qid < sc->sc_nvqs; qid++) { vector = VIRTIO_MSIX_QUEUE_VECTOR_INDEX; - if (sc->sc_child_mq) + if (psc->sc_intr_pervq) vector += qid; bus_space_write_2(iot, ioh, VIRTIO_CONFIG1_QUEUE_SELECT, qid); bus_space_write_2(iot, ioh, VIRTIO_CONFIG1_QUEUE_MSIX_VECTOR, @@ -895,7 +896,7 @@ virtio_pci_setup_interrupts_09(struct virtio_softc *sc, int reinit) offset = VIRTIO_CONFIG_MSI_QUEUE_VECTOR; vector = VIRTIO_MSIX_QUEUE_VECTOR_INDEX; - if (sc->sc_child_mq) + if (psc->sc_intr_pervq) vector += qid; bus_space_write_2(psc->sc_iot, psc->sc_ioh, offset, vector); @@ -941,7 +942,7 @@ virtio_pci_establish_msix_interrupts(struct virtio_softc *sc, } idx = VIRTIO_MSIX_QUEUE_VECTOR_INDEX; - if (sc->sc_child_mq) { + if (psc->sc_intr_pervq) { for (qid = 0; qid < sc->sc_nvqs; qid++) { n = idx + qid; vq = &sc->sc_vqs[qid]; @@ -979,7 +980,7 @@ virtio_pci_establish_msix_interrupts(struct virtio_softc *sc, intrstr = pci_intr_string(pc, psc->sc_ihp[idx], intrbuf, sizeof(intrbuf)); aprint_normal_dev(self, "config interrupting at %s\n", intrstr); idx = VIRTIO_MSIX_QUEUE_VECTOR_INDEX; - if (sc->sc_child_mq) { + if (psc->sc_intr_pervq) { kcpuset_t *affinity; int affinity_to, r; @@ -1019,7 +1020,7 @@ error: if (psc->sc_ihs[idx] != NULL) pci_intr_disestablish(psc->sc_pa.pa_pc, psc->sc_ihs[idx]); idx = VIRTIO_MSIX_QUEUE_VECTOR_INDEX; - if (sc->sc_child_mq) { + if (psc->sc_intr_pervq) { for (qid = 0; qid < sc->sc_nvqs; qid++) { n = idx + qid; if (psc->sc_ihs[n] == NULL) @@ -1085,13 +1086,10 @@ virtio_pci_alloc_interrupts(struct virtio_softc *sc) counts[PCI_INTR_TYPE_INTX] = 1; } else { /* Try MSI-X first and INTx second */ - if (sc->sc_nvqs + VIRTIO_MSIX_QUEUE_VECTOR_INDEX <= nmsix) { + if (ISSET(sc->sc_flags, VIRTIO_F_INTR_PERVQ) && + sc->sc_nvqs + VIRTIO_MSIX_QUEUE_VECTOR_INDEX <= nmsix) { nmsix = sc->sc_nvqs + VIRTIO_MSIX_QUEUE_VECTOR_INDEX; } else { - sc->sc_child_mq = false; - } - - if (sc->sc_child_mq == false) { nmsix = 2; } @@ -1109,6 +1107,7 @@ retry: } if (pci_intr_type(pc, psc->sc_ihp[0]) == PCI_INTR_TYPE_MSIX) { + psc->sc_intr_pervq = nmsix > 2 ? true : false; psc->sc_ihs = kmem_zalloc(sizeof(*psc->sc_ihs) * nmsix, KM_SLEEP); @@ -1127,6 +1126,7 @@ retry: psc->sc_devcfg_offset = VIRTIO_CONFIG_DEVICE_CONFIG_MSI; virtio_pci_adjust_config_region(psc); } else if (pci_intr_type(pc, psc->sc_ihp[0]) == PCI_INTR_TYPE_INTX) { + psc->sc_intr_pervq = false; psc->sc_ihs = kmem_zalloc(sizeof(*psc->sc_ihs) * 1, KM_SLEEP); @@ -1149,6 +1149,8 @@ retry: } } + if (!psc->sc_intr_pervq) + CLR(sc->sc_flags, VIRTIO_F_INTR_PERVQ); return 0; } diff --git a/sys/dev/pci/virtiovar.h b/sys/dev/pci/virtiovar.h index 4aece4b0ad5..9a2ad02644a 100644 --- a/sys/dev/pci/virtiovar.h +++ b/sys/dev/pci/virtiovar.h @@ -1,4 +1,4 @@ -/* $NetBSD: virtiovar.h,v 1.24 2022/03/24 08:08:05 andvar Exp $ */ +/* $NetBSD: virtiovar.h,v 1.25 2023/03/23 03:27:48 yamaguchi Exp $ */ /* * Copyright (c) 2010 Minoura Makoto. @@ -171,7 +171,6 @@ struct virtio_softc { int sc_childdevid; device_t sc_child; /* set by child */ - bool sc_child_mq; virtio_callback sc_config_change; /* set by child */ virtio_callback sc_intrhand; /* set by child */ }; @@ -184,6 +183,7 @@ struct virtio_softc; #define VIRTIO_F_INTR_MPSAFE (1 << 0) #define VIRTIO_F_INTR_SOFTINT (1 << 1) #define VIRTIO_F_INTR_MSIX (1 << 2) +#define VIRTIO_F_INTR_PERVQ (1 << 3) #define VIRTIO_CHILD_FAILED ((void *)1) @@ -211,12 +211,10 @@ void virtio_reset(struct virtio_softc *); int virtio_reinit_start(struct virtio_softc *); void virtio_reinit_end(struct virtio_softc *); void virtio_child_attach_start(struct virtio_softc *, device_t, int, - struct virtqueue *, - virtio_callback, virtio_callback, int, - int, const char *); -void virtio_child_attach_set_vqs(struct virtio_softc *, - struct virtqueue *, int); -int virtio_child_attach_finish(struct virtio_softc *); + uint64_t, const char *); +int virtio_child_attach_finish(struct virtio_softc *, + struct virtqueue *, size_t, + virtio_callback, virtio_callback, int); void virtio_child_attach_failed(struct virtio_softc *); void virtio_child_detach(struct virtio_softc *); diff --git a/sys/dev/virtio/viocon.c b/sys/dev/virtio/viocon.c index 3f3c5fadd5d..3a374d00d80 100644 --- a/sys/dev/virtio/viocon.c +++ b/sys/dev/virtio/viocon.c @@ -1,4 +1,4 @@ -/* $NetBSD: viocon.c,v 1.5 2022/08/13 17:31:32 riastradh Exp $ */ +/* $NetBSD: viocon.c,v 1.6 2023/03/23 03:27:48 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.5 2022/08/13 17:31:32 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: viocon.c,v 1.6 2023/03/23 03:27:48 yamaguchi Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -209,10 +209,8 @@ viocon_attach(struct device *parent, struct device *self, void *aux) sc->sc_ports = kmem_zalloc(maxports * sizeof(sc->sc_ports[0]), KM_SLEEP); - virtio_child_attach_start(vsc, self, IPL_TTY, sc->sc_vqs, - /*config_change*/NULL, virtio_vq_intr, - /*req_flags*/0, /*req_features*/VIRTIO_CONSOLE_F_SIZE, - VIRTIO_CONSOLE_FLAG_BITS); + virtio_child_attach_start(vsc, self, IPL_TTY, + /*req_features*/VIRTIO_CONSOLE_F_SIZE, VIRTIO_CONSOLE_FLAG_BITS); DPRINTF("%s: softc: %p\n", __func__, sc); if (viocon_port_create(sc, 0) != 0) { @@ -221,7 +219,8 @@ viocon_attach(struct device *parent, struct device *self, void *aux) } viocon_rx_fill(sc->sc_ports[0]); - if (virtio_child_attach_finish(vsc) != 0) + if (virtio_child_attach_finish(vsc, sc->sc_vqs, sc->sc_max_ports * 2, + /*config_change*/NULL, virtio_vq_intr, /*req_flags*/0) != 0) goto err; return; |
