Module Name: src Committed By: yamaguchi Date: Thu Oct 28 01:36:43 UTC 2021
Modified Files: src/sys/dev/pci: if_vioif.c virtio.c virtio_pci.c virtiovar.h Log Message: virtio: stop reinit for safety when a device resetting is failed To generate a diff of this commit: cvs rdiff -u -r1.70 -r1.71 src/sys/dev/pci/if_vioif.c cvs rdiff -u -r1.52 -r1.53 src/sys/dev/pci/virtio.c cvs rdiff -u -r1.32 -r1.33 src/sys/dev/pci/virtio_pci.c cvs rdiff -u -r1.22 -r1.23 src/sys/dev/pci/virtiovar.h 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/pci/if_vioif.c diff -u src/sys/dev/pci/if_vioif.c:1.70 src/sys/dev/pci/if_vioif.c:1.71 --- src/sys/dev/pci/if_vioif.c:1.70 Mon Feb 8 06:56:26 2021 +++ src/sys/dev/pci/if_vioif.c Thu Oct 28 01:36:43 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_vioif.c,v 1.70 2021/02/08 06:56:26 skrll Exp $ */ +/* $NetBSD: if_vioif.c,v 1.71 2021/10/28 01:36:43 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.70 2021/02/08 06:56:26 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.71 2021/10/28 01:36:43 yamaguchi Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -46,6 +46,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v #include <sys/mbuf.h> #include <sys/mutex.h> #include <sys/sockio.h> +#include <sys/syslog.h> #include <sys/cpu.h> #include <sys/module.h> #include <sys/pcq.h> @@ -1155,7 +1156,12 @@ vioif_init(struct ifnet *ifp) vioif_stop(ifp, 0); - virtio_reinit_start(vsc); + r = virtio_reinit_start(vsc); + if (r != 0) { + log(LOG_ERR, "%s: reset failed\n", ifp->if_xname); + return EIO; + } + virtio_negotiate_features(vsc, virtio_features(vsc)); for (i = 0; i < sc->sc_req_nvq_pairs; i++) { Index: src/sys/dev/pci/virtio.c diff -u src/sys/dev/pci/virtio.c:1.52 src/sys/dev/pci/virtio.c:1.53 --- src/sys/dev/pci/virtio.c:1.52 Thu Oct 21 07:08:55 2021 +++ src/sys/dev/pci/virtio.c Thu Oct 28 01:36:43 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: virtio.c,v 1.52 2021/10/21 07:08:55 yamaguchi Exp $ */ +/* $NetBSD: virtio.c,v 1.53 2021/10/28 01:36:43 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.52 2021/10/21 07:08:55 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: virtio.c,v 1.53 2021/10/28 01:36:43 yamaguchi Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -90,7 +90,7 @@ virtio_reset(struct virtio_softc *sc) virtio_device_reset(sc); } -void +int virtio_reinit_start(struct virtio_softc *sc) { int i, r; @@ -114,10 +114,15 @@ virtio_reinit_start(struct virtio_softc } r = sc->sc_ops->setup_interrupts(sc, 1); - if (r != 0) { - printf("%s: failed to setup interrupts\n", - device_xname(sc->sc_dev)); - } + if (r != 0) + goto fail; + + return 0; + +fail: + virtio_set_status(sc, VIRTIO_CONFIG_DEVICE_STATUS_FAILED); + + return 1; } void Index: src/sys/dev/pci/virtio_pci.c diff -u src/sys/dev/pci/virtio_pci.c:1.32 src/sys/dev/pci/virtio_pci.c:1.33 --- src/sys/dev/pci/virtio_pci.c:1.32 Thu Oct 21 05:37:43 2021 +++ src/sys/dev/pci/virtio_pci.c Thu Oct 28 01:36:43 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: virtio_pci.c,v 1.32 2021/10/21 05:37:43 yamaguchi Exp $ */ +/* $NetBSD: virtio_pci.c,v 1.33 2021/10/28 01:36:43 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.32 2021/10/21 05:37:43 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: virtio_pci.c,v 1.33 2021/10/28 01:36:43 yamaguchi Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -36,6 +36,7 @@ __KERNEL_RCSID(0, "$NetBSD: virtio_pci.c #include <sys/module.h> #include <sys/endian.h> #include <sys/interrupt.h> +#include <sys/syslog.h> #include <sys/device.h> @@ -50,6 +51,18 @@ __KERNEL_RCSID(0, "$NetBSD: virtio_pci.c #include <dev/pci/virtiovar.h> /* XXX: move to non-pci */ +#define VIRTIO_PCI_LOG(_sc, _use_log, _fmt, _args...) \ +do { \ + if ((_use_log)) { \ + log(LOG_DEBUG, "%s: " _fmt, \ + device_xname((_sc)->sc_dev), \ + ##_args); \ + } else { \ + aprint_error_dev((_sc)->sc_dev, \ + _fmt, ##_args); \ + } \ +} while(0) + static int virtio_pci_match(device_t, cfdata_t, void *); static void virtio_pci_attach(device_t, device_t, void *); static int virtio_pci_rescan(device_t, const char *, const int *); @@ -808,7 +821,6 @@ static int virtio_pci_setup_interrupts_10(struct virtio_softc *sc, int reinit) { struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc; - device_t self = sc->sc_dev; bus_space_tag_t iot = psc->sc_iot; bus_space_handle_t ioh = psc->sc_ioh; int vector, ret, qid; @@ -821,10 +833,8 @@ virtio_pci_setup_interrupts_10(struct vi VIRTIO_CONFIG1_CONFIG_MSIX_VECTOR, vector); ret = bus_space_read_2(iot, ioh, VIRTIO_CONFIG1_CONFIG_MSIX_VECTOR); if (ret != vector) { - if (reinit == 0) { - aprint_error_dev(self, - "can't set config msix vector\n"); - } + VIRTIO_PCI_LOG(sc, reinit, + "can't set config msix vector\n"); return -1; } @@ -839,10 +849,8 @@ virtio_pci_setup_interrupts_10(struct vi ret = bus_space_read_2(iot, ioh, VIRTIO_CONFIG1_QUEUE_MSIX_VECTOR); if (ret != vector) { - if (reinit == 0) { - aprint_error_dev(self, "can't set queue %d " - "msix vector\n", qid); - } + VIRTIO_PCI_LOG(sc, reinit, "can't set queue %d " + "msix vector\n", qid); return -1; } } @@ -854,7 +862,6 @@ static int virtio_pci_setup_interrupts_09(struct virtio_softc *sc, int reinit) { struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc; - device_t self = sc->sc_dev; int offset, vector, ret, qid; if (!virtio_pci_msix_enabled(psc)) @@ -868,10 +875,8 @@ virtio_pci_setup_interrupts_09(struct vi aprint_debug_dev(sc->sc_dev, "expected=%d, actual=%d\n", vector, ret); if (ret != vector) { - if (reinit == 0) { - aprint_error_dev(self, - "can't set config msix vector\n"); - } + VIRTIO_PCI_LOG(sc, reinit, + "can't set config msix vector\n"); return -1; } @@ -890,10 +895,8 @@ virtio_pci_setup_interrupts_09(struct vi aprint_debug_dev(sc->sc_dev, "expected=%d, actual=%d\n", vector, ret); if (ret != vector) { - if (reinit == 0) { - aprint_error_dev(self, "can't set queue %d " - "msix vector\n", qid); - } + VIRTIO_PCI_LOG(sc, reinit, "can't set queue %d " + "msix vector\n", qid); return -1; } } Index: src/sys/dev/pci/virtiovar.h diff -u src/sys/dev/pci/virtiovar.h:1.22 src/sys/dev/pci/virtiovar.h:1.23 --- src/sys/dev/pci/virtiovar.h:1.22 Thu Oct 21 05:37:43 2021 +++ src/sys/dev/pci/virtiovar.h Thu Oct 28 01:36:43 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: virtiovar.h,v 1.22 2021/10/21 05:37:43 yamaguchi Exp $ */ +/* $NetBSD: virtiovar.h,v 1.23 2021/10/28 01:36:43 yamaguchi Exp $ */ /* * Copyright (c) 2010 Minoura Makoto. @@ -208,7 +208,7 @@ int virtio_alloc_vq(struct virtio_softc* const char*); int virtio_free_vq(struct virtio_softc*, struct virtqueue*); void virtio_reset(struct virtio_softc *); -void virtio_reinit_start(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 *,