Module Name: src Committed By: yamaguchi Date: Fri Mar 31 07:34:26 UTC 2023
Modified Files: src/sys/dev/pci: virtio.c virtio_pci.c virtiovar.h src/sys/dev/virtio: virtio_mmio.c Log Message: Added flags to store status of attaching a virtio device This prevents a panic on reboot after a virtio device had called virtio_child_attach_failed(). To generate a diff of this commit: cvs rdiff -u -r1.73 -r1.74 src/sys/dev/pci/virtio.c cvs rdiff -u -r1.39 -r1.40 src/sys/dev/pci/virtio_pci.c cvs rdiff -u -r1.27 -r1.28 src/sys/dev/pci/virtiovar.h cvs rdiff -u -r1.7 -r1.8 src/sys/dev/virtio/virtio_mmio.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/pci/virtio.c diff -u src/sys/dev/pci/virtio.c:1.73 src/sys/dev/pci/virtio.c:1.74 --- src/sys/dev/pci/virtio.c:1.73 Fri Mar 31 07:31:48 2023 +++ src/sys/dev/pci/virtio.c Fri Mar 31 07:34:26 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: virtio.c,v 1.73 2023/03/31 07:31:48 yamaguchi Exp $ */ +/* $NetBSD: virtio.c,v 1.74 2023/03/31 07:34:26 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.73 2023/03/31 07:31:48 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: virtio.c,v 1.74 2023/03/31 07:34:26 yamaguchi Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1327,6 +1327,9 @@ virtio_child_attach_start(struct virtio_ { char buf[1024]; + KASSERT(sc->sc_child == NULL); + KASSERT(!ISSET(sc->sc_child_flags, VIRTIO_CHILD_DETACHED)); + sc->sc_child = child; sc->sc_ipl = ipl; @@ -1359,7 +1362,6 @@ virtio_child_attach_finish(struct virtio } #endif - sc->sc_finished_called = true; sc->sc_vqs = vqs; sc->sc_nvqs = nvqs; @@ -1402,6 +1404,7 @@ virtio_child_attach_finish(struct virtio } } + SET(sc->sc_child_flags, VIRTIO_CHILD_ATTACH_FINISHED); virtio_set_status(sc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER_OK); return 0; @@ -1420,7 +1423,11 @@ fail: void virtio_child_detach(struct virtio_softc *sc) { - sc->sc_child = NULL; + + /* already detached */ + if (ISSET(sc->sc_child_flags, VIRTIO_CHILD_DETACHED)) + return; + sc->sc_vqs = NULL; virtio_device_reset(sc); @@ -1431,6 +1438,8 @@ virtio_child_detach(struct virtio_softc softint_disestablish(sc->sc_soft_ih); sc->sc_soft_ih = NULL; } + + SET(sc->sc_child_flags, VIRTIO_CHILD_DETACHED); } void @@ -1440,7 +1449,7 @@ virtio_child_attach_failed(struct virtio virtio_set_status(sc, VIRTIO_CONFIG_DEVICE_STATUS_FAILED); - sc->sc_child = VIRTIO_CHILD_FAILED; + SET(sc->sc_child_flags, VIRTIO_CHILD_ATTACH_FAILED); } bus_dma_tag_t @@ -1476,19 +1485,19 @@ virtio_attach_failed(struct virtio_softc if (sc->sc_childdevid == 0) return 1; - if (sc->sc_child == NULL) { - aprint_error_dev(self, - "no matching child driver; not configured\n"); + if (ISSET(sc->sc_child_flags, VIRTIO_CHILD_ATTACH_FAILED)) { + aprint_error_dev(self, "virtio configuration failed\n"); return 1; } - if (sc->sc_child == VIRTIO_CHILD_FAILED) { - aprint_error_dev(self, "virtio configuration failed\n"); + if (sc->sc_child == NULL) { + aprint_error_dev(self, + "no matching child driver; not configured\n"); return 1; } /* sanity check */ - if (!sc->sc_finished_called) { + if (!ISSET(sc->sc_child_flags, VIRTIO_CHILD_ATTACH_FINISHED)) { aprint_error_dev(self, "virtio internal error, child driver " "signaled OK but didn't initialize interrupts\n"); return 1; Index: src/sys/dev/pci/virtio_pci.c diff -u src/sys/dev/pci/virtio_pci.c:1.39 src/sys/dev/pci/virtio_pci.c:1.40 --- src/sys/dev/pci/virtio_pci.c:1.39 Thu Mar 23 03:27:48 2023 +++ src/sys/dev/pci/virtio_pci.c Fri Mar 31 07:34:26 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: virtio_pci.c,v 1.39 2023/03/23 03:27:48 yamaguchi Exp $ */ +/* $NetBSD: virtio_pci.c,v 1.40 2023/03/31 07:34:26 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.39 2023/03/23 03:27:48 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: virtio_pci.c,v 1.40 2023/03/31 07:34:26 yamaguchi Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -329,14 +329,12 @@ virtio_pci_detach(device_t self, int fla struct virtio_softc * const sc = &psc->sc_sc; int r; - if (sc->sc_child != NULL) { - r = config_detach(sc->sc_child, flags); - if (r) - return r; - } + r = config_detach_children(self, flags); + if (r != 0) + return r; /* Check that child detached properly */ - KASSERT(sc->sc_child == NULL); + KASSERT(ISSET(sc->sc_child_flags, VIRTIO_CHILD_DETACHED)); KASSERT(sc->sc_vqs == NULL); KASSERT(psc->sc_ihs_num == 0); Index: src/sys/dev/pci/virtiovar.h diff -u src/sys/dev/pci/virtiovar.h:1.27 src/sys/dev/pci/virtiovar.h:1.28 --- src/sys/dev/pci/virtiovar.h:1.27 Fri Mar 31 07:31:48 2023 +++ src/sys/dev/pci/virtiovar.h Fri Mar 31 07:34:26 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: virtiovar.h,v 1.27 2023/03/31 07:31:48 yamaguchi Exp $ */ +/* $NetBSD: virtiovar.h,v 1.28 2023/03/31 07:34:26 yamaguchi Exp $ */ /* * Copyright (c) 2010 Minoura Makoto. @@ -158,13 +158,17 @@ struct virtio_softc { uint64_t sc_active_features; bool sc_indirect; bool sc_version_1; - bool sc_finished_called; int sc_nvqs; /* set by child */ struct virtqueue *sc_vqs; /* set by child */ int sc_childdevid; device_t sc_child; /* set by child */ + uint32_t sc_child_flags; +#define VIRTIO_CHILD_ATTACH_FINISHED __BIT(0) +#define VIRTIO_CHILD_ATTACH_FAILED __BIT(1) +#define VIRTIO_CHILD_DETACHED __BIT(2) + virtio_callback sc_config_change; /* set by child */ virtio_callback sc_intrhand; }; @@ -179,9 +183,6 @@ struct virtio_softc; #define VIRTIO_F_INTR_MSIX (1 << 2) #define VIRTIO_F_INTR_PERVQ (1 << 3) - -#define VIRTIO_CHILD_FAILED ((void *)1) - /* public interface */ void virtio_negotiate_features(struct virtio_softc*, uint64_t); Index: src/sys/dev/virtio/virtio_mmio.c diff -u src/sys/dev/virtio/virtio_mmio.c:1.7 src/sys/dev/virtio/virtio_mmio.c:1.8 --- src/sys/dev/virtio/virtio_mmio.c:1.7 Fri Oct 22 02:57:23 2021 +++ src/sys/dev/virtio/virtio_mmio.c Fri Mar 31 07:34:26 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: virtio_mmio.c,v 1.7 2021/10/22 02:57:23 yamaguchi Exp $ */ +/* $NetBSD: virtio_mmio.c,v 1.8 2023/03/31 07:34:26 yamaguchi Exp $ */ /* $OpenBSD: virtio_mmio.c,v 1.2 2017/02/24 17:12:31 patrick Exp $ */ /* @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: virtio_mmio.c,v 1.7 2021/10/22 02:57:23 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: virtio_mmio.c,v 1.8 2023/03/31 07:34:26 yamaguchi Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -213,12 +213,11 @@ virtio_mmio_common_detach(struct virtio_ struct virtio_softc *vsc = &sc->sc_sc; int r; - if (vsc->sc_child != NULL && vsc->sc_child != VIRTIO_CHILD_FAILED) { - r = config_detach(vsc->sc_child, flags); - if (r) - return r; - } - KASSERT(vsc->sc_child == NULL || vsc->sc_child == VIRTIO_CHILD_FAILED); + r = config_detach_children(self, flags); + if (r != 0) + return r; + + KASSERT(ISSET(sc->sc_child_flags, VIRTIO_CHILD_DETACHED)); KASSERT(vsc->sc_vqs == NULL); KASSERT(sc->sc_ih == NULL);