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.
This commit is contained in:
parent
1639a2df8d
commit
86598168c1
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
/*
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 *);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue