When detaching virtio devices with multiple queues, spurious and non-fatal error messages appear in the guest kernel log. While virtio-net devices have multiple queues by default, this issue can also be reproduced with other virtio device types (e.g., virtio-blk) when configured with multiple queues: [ 33.820621] virtio_ccw 0.0.0001: Failed to deregister indicators (-22) [ 33.820628] virtio_net virtio2: Error -22 while deleting queue 0 [ 33.820632] virtio_net virtio2: Error -22 while deleting queue 1 [ 33.820634] virtio_net virtio2: Error -22 while deleting queue 2 Since commit 8c58a229688c ("s390/cio: Do not unregister the subchannel based on DNV"), subchannel behavior following a device detach has been updated and results in -EINVAL being propagated rather than -ENODEV, originating from ccw_device_start_timeout_key() in cio/device_ops. In the end, the virtio driver has no ability to react to the difference between device and subchannel states here, and during detach, both -ENODEV and -EINVAL indicate the device cannot be used and should not be treated as errors requiring attention. Update error handling in virtio_ccw_del_vq() and virtio_ccw_drop_indicator() to suppress -EINVAL in addition to -ENODEV. Fixes: 8c58a229688c ("s390/cio: Do not unregister the subchannel based on DNV") Signed-off-by: William Bezenah --- drivers/s390/virtio/virtio_ccw.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c index bab6cad3fd5c..02fd8bf7e469 100644 --- a/drivers/s390/virtio/virtio_ccw.c +++ b/drivers/s390/virtio/virtio_ccw.c @@ -429,7 +429,7 @@ static void virtio_ccw_drop_indicator(struct virtio_ccw_device *vcdev, vcdev->is_thinint ? VIRTIO_CCW_DOING_SET_IND_ADAPTER : VIRTIO_CCW_DOING_SET_IND); - if (ret && (ret != -ENODEV)) + if (ret && (ret != -ENODEV) && (ret != -EINVAL)) dev_info(&vcdev->cdev->dev, "Failed to deregister indicators (%d)\n", ret); else if (vcdev->is_thinint) @@ -515,10 +515,10 @@ static void virtio_ccw_del_vq(struct virtqueue *vq, struct ccw1 *ccw) ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_SET_VQ | index); /* - * -ENODEV isn't considered an error: The device is gone anyway. + * -ENODEV and -EINVAL aren't considered errors: The device is gone anyway. * This may happen on device detach. */ - if (ret && (ret != -ENODEV)) + if (ret && (ret != -ENODEV) && (ret != -EINVAL)) dev_warn(&vq->vdev->dev, "Error %d while deleting queue %d\n", ret, index); -- 2.54.0