diff options
| author | Andy Fiddaman <omnios@citrus-it.co.uk> | 2019-08-29 21:50:54 +0000 |
|---|---|---|
| committer | Andy Fiddaman <omnios@citrus-it.co.uk> | 2019-08-30 23:31:03 +0000 |
| commit | 89cb8ffb5df88f95defaae8f0f4f0c67ccd9d17e (patch) | |
| tree | 768d8860697a4d66c7401ab8c3229b3ed65f3284 | |
| parent | 9e59ac1c9bffd2ba0d7192da3c5f7d1c3444991a (diff) | |
| download | illumos-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.c | 9 | ||||
| -rw-r--r-- | usr/src/uts/common/io/vioif/vioif.h | 1 | ||||
| -rw-r--r-- | usr/src/uts/common/io/virtio/virtio_main.c | 4 |
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); |
