From: Benjamin Berg <benjamin.b...@intel.com>

If the device does not support slave requests, then the IRQ will not yet
be allocated. So initialize the IRQ to UM_IRQ_ALLOC so that it will be
allocated if none has been assigned yet and store it slightly later when
we know that it will not be immediately unregistered again.

Signed-off-by: Benjamin Berg <benjamin.b...@intel.com>
---
 arch/um/drivers/virtio_uml.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
index 2e4b4eadd553..5b19e9a3447a 100644
--- a/arch/um/drivers/virtio_uml.c
+++ b/arch/um/drivers/virtio_uml.c
@@ -889,7 +889,7 @@ static int vu_setup_vq_call_fd(struct virtio_uml_device 
*vu_dev,
 {
        struct virtio_uml_vq_info *info = vq->priv;
        int call_fds[2];
-       int rc;
+       int rc, irq;
 
        /* no call FD needed/desired in this case */
        if (vu_dev->protocol_features &
@@ -906,19 +906,23 @@ static int vu_setup_vq_call_fd(struct virtio_uml_device 
*vu_dev,
                return rc;
 
        info->call_fd = call_fds[0];
-       rc = um_request_irq(vu_dev->irq, info->call_fd, IRQ_READ,
-                           vu_interrupt, IRQF_SHARED, info->name, vq);
-       if (rc < 0)
+       irq = um_request_irq(vu_dev->irq, info->call_fd, IRQ_READ,
+                            vu_interrupt, IRQF_SHARED, info->name, vq);
+       if (irq < 0) {
+               rc = irq;
                goto close_both;
+       }
 
        rc = vhost_user_set_vring_call(vu_dev, vq->index, call_fds[1]);
        if (rc)
                goto release_irq;
 
+       vu_dev->irq = irq;
+
        goto out;
 
 release_irq:
-       um_free_irq(vu_dev->irq, vq);
+       um_free_irq(irq, vq);
 close_both:
        os_close_file(call_fds[0]);
 out:
@@ -1212,6 +1216,7 @@ static int virtio_uml_probe(struct platform_device *pdev)
        vu_dev->vdev.id.vendor = VIRTIO_DEV_ANY_ID;
        vu_dev->pdev = pdev;
        vu_dev->req_fd = -1;
+       vu_dev->irq = UM_IRQ_ALLOC;
 
        time_travel_propagate_time();
 
-- 
2.47.0


Reply via email to