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);
 

Reply via email to