Will be used on surprise removal, so we don't need to re-check. Signed-off-by: Michael S. Tsirkin <m...@redhat.com> --- drivers/virtio/virtio.c | 18 +++++++++++++++++- include/linux/virtio.h | 2 ++ 2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c index c441c8cc71ef..1dd5cdf68c1d 100644 --- a/drivers/virtio/virtio.c +++ b/drivers/virtio/virtio.c @@ -127,7 +127,8 @@ static void __virtio_config_changed(struct virtio_device *dev) { struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); - if (!dev->config_core_enabled || dev->config_driver_disabled) + if (!dev->config_core_enabled || dev->config_driver_disabled || + dev->config_transport_disabled) dev->config_change_pending = true; else if (drv && drv->config_changed) { drv->config_changed(dev); @@ -193,6 +194,20 @@ static void virtio_config_core_enable(struct virtio_device *dev) spin_unlock_irq(&dev->config_lock); } +/** + * virtio_config_transport_disable - disable config change reporting by transport + * @dev: the device in question + * + * This must only be called by transport and enabling is not allowed. + */ +void virtio_config_transport_disable(struct virtio_device *dev) +{ + spin_lock_irq(&dev->config_lock); + dev->config_transport_disabled = true; + spin_unlock_irq(&dev->config_lock); +} +EXPORT_SYMBOL_GPL(virtio_config_transport_disable); + void virtio_add_status(struct virtio_device *dev, unsigned int status) { might_sleep(); @@ -530,6 +545,7 @@ int register_virtio_device(struct virtio_device *dev) goto out_ida_remove; spin_lock_init(&dev->config_lock); + dev->config_transport_disabled = false; dev->config_driver_disabled = false; dev->config_core_enabled = false; dev->config_change_pending = false; diff --git a/include/linux/virtio.h b/include/linux/virtio.h index be0beb16b487..072a25f6622c 100644 --- a/include/linux/virtio.h +++ b/include/linux/virtio.h @@ -151,6 +151,7 @@ struct virtio_device { bool failed; u8 config_core_enabled:1; u8 config_driver_disabled:1; + u8 config_transport_disabled:1; u8 config_change_pending:1; spinlock_t config_lock; spinlock_t vqs_list_lock; @@ -185,6 +186,7 @@ void virtio_config_changed(struct virtio_device *dev); void virtio_config_driver_disable(struct virtio_device *dev); void virtio_config_driver_enable(struct virtio_device *dev); +void virtio_config_transport_disable(struct virtio_device *dev); #ifdef CONFIG_PM_SLEEP int virtio_device_freeze(struct virtio_device *dev); int virtio_device_restore(struct virtio_device *dev); -- MST