summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Fiddaman <omnios@citrus-it.co.uk>2019-08-29 21:50:54 +0000
committerAndy Fiddaman <omnios@citrus-it.co.uk>2019-08-30 23:31:03 +0000
commit89cb8ffb5df88f95defaae8f0f4f0c67ccd9d17e (patch)
tree768d8860697a4d66c7401ab8c3229b3ed65f3284
parent9e59ac1c9bffd2ba0d7192da3c5f7d1c3444991a (diff)
downloadillumos-joyent-89cb8ffb5df88f95defaae8f0f4f0c67ccd9d17e.tar.gz
11643 panic when detaching vioif
Reviewed by: Joshua M. Clulow <josh@sysmgr.org> Reviewed by: Toomas Soome <tsoome@me.com> Reviewed by: Robert Mustacchi <rm@joyent.com> Reviewed by: Rich Lowe <richlowe@richlowe.net> Approved by: Dan McDonald <danmcd@joyent.com>
-rw-r--r--usr/src/uts/common/io/vioif/vioif.c9
-rw-r--r--usr/src/uts/common/io/vioif/vioif.h1
-rw-r--r--usr/src/uts/common/io/virtio/virtio_main.c4
3 files changed, 9 insertions, 5 deletions
diff --git a/usr/src/uts/common/io/vioif/vioif.c b/usr/src/uts/common/io/vioif/vioif.c
index 201e84e11b..a97dd9deca 100644
--- a/usr/src/uts/common/io/vioif/vioif.c
+++ b/usr/src/uts/common/io/vioif/vioif.c
@@ -1725,7 +1725,6 @@ vioif_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
dev_err(dip, CE_WARN, "!MAC unregister failed (%d)", r);
return (DDI_FAILURE);
}
- mac_free(vif->vif_macp);
/*
* Shut down the device so that we can recover any previously
@@ -1743,9 +1742,13 @@ vioif_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
vioif_rxbuf_free(vif, rb);
}
- (void) virtio_fini(vif->vif_virtio, B_FALSE);
-
+ /*
+ * vioif_free_bufs() must be called before virtio_fini()
+ * as it uses virtio_chain_free() which itself depends on some
+ * virtio data structures still being around.
+ */
vioif_free_bufs(vif);
+ (void) virtio_fini(vif->vif_virtio, B_FALSE);
mutex_exit(&vif->vif_mutex);
mutex_destroy(&vif->vif_mutex);
diff --git a/usr/src/uts/common/io/vioif/vioif.h b/usr/src/uts/common/io/vioif/vioif.h
index 51dbc1acd4..19d8965bd4 100644
--- a/usr/src/uts/common/io/vioif/vioif.h
+++ b/usr/src/uts/common/io/vioif/vioif.h
@@ -342,7 +342,6 @@ struct vioif {
vioif_runstate_t vif_runstate;
mac_handle_t vif_mac_handle;
- mac_register_t *vif_macp;
virtio_queue_t *vif_rx_vq;
virtio_queue_t *vif_tx_vq;
diff --git a/usr/src/uts/common/io/virtio/virtio_main.c b/usr/src/uts/common/io/virtio/virtio_main.c
index be92dacfba..cb81142a53 100644
--- a/usr/src/uts/common/io/virtio/virtio_main.c
+++ b/usr/src/uts/common/io/virtio/virtio_main.c
@@ -81,6 +81,7 @@ static int virtio_interrupts_setup(virtio_t *, int);
static void virtio_interrupts_teardown(virtio_t *);
static void virtio_interrupts_disable_locked(virtio_t *);
static void virtio_queue_free(virtio_queue_t *);
+static void virtio_device_reset_locked(virtio_t *);
/*
* We use the same device access attributes for BAR mapping and access to the
@@ -194,7 +195,7 @@ virtio_fini(virtio_t *vio, boolean_t failed)
*/
virtio_set_status(vio, VIRTIO_STATUS_FAILED);
} else {
- virtio_device_reset(vio);
+ virtio_device_reset_locked(vio);
}
/*
@@ -215,6 +216,7 @@ virtio_fini(virtio_t *vio, boolean_t failed)
/*
* Ensure we have torn down everything we set up.
*/
+ vio->vio_initlevel &= ~VIRTIO_INITLEVEL_SHUTDOWN;
VERIFY0(vio->vio_initlevel);
mutex_exit(&vio->vio_mutex);