um: virtio: Use dynamic IRQ allocation
authorJohannes Berg <johannes.berg@intel.com>
Wed, 2 Dec 2020 11:59:51 +0000 (12:59 +0100)
committerRichard Weinberger <richard@nod.at>
Sun, 13 Dec 2020 21:22:11 +0000 (22:22 +0100)
This separates the devices, which is better for debug and for
later suspend/resume and wakeup support, since there we'll
have to separate which IRQs can wake up the system and which
cannot.

Acked-By: Anton Ivanov <anton.ivanov@cambridgegreys.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Acked-By: Anton Ivanov <anton.ivanov@cambridgegreys.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/drivers/virtio_uml.c
arch/um/include/asm/irq.h

index f76b8da28d20bf6a361156269d0b820ed83c86c8..94b112749d5bece3e13f58c8a6e9426458a797bd 100644 (file)
@@ -55,7 +55,7 @@ struct virtio_uml_device {
        struct platform_device *pdev;
 
        spinlock_t sock_lock;
-       int sock, req_fd;
+       int sock, req_fd, irq;
        u64 features;
        u64 protocol_features;
        u8 status;
@@ -409,12 +409,14 @@ static int vhost_user_init_slave_req(struct virtio_uml_device *vu_dev)
                return rc;
        vu_dev->req_fd = req_fds[0];
 
-       rc = um_request_irq(VIRTIO_IRQ, vu_dev->req_fd, IRQ_READ,
+       rc = um_request_irq(UM_IRQ_ALLOC, vu_dev->req_fd, IRQ_READ,
                            vu_req_interrupt, IRQF_SHARED,
                            vu_dev->pdev->name, vu_dev);
        if (rc < 0)
                goto err_close;
 
+       vu_dev->irq = rc;
+
        rc = vhost_user_send_no_payload_fd(vu_dev, VHOST_USER_SET_SLAVE_REQ_FD,
                                           req_fds[1]);
        if (rc)
@@ -423,7 +425,7 @@ static int vhost_user_init_slave_req(struct virtio_uml_device *vu_dev)
        goto out;
 
 err_free_irq:
-       um_free_irq(VIRTIO_IRQ, vu_dev);
+       um_free_irq(vu_dev->irq, vu_dev);
 err_close:
        os_close_file(req_fds[0]);
 out:
@@ -802,7 +804,11 @@ static void vu_del_vq(struct virtqueue *vq)
        struct virtio_uml_vq_info *info = vq->priv;
 
        if (info->call_fd >= 0) {
-               um_free_irq(VIRTIO_IRQ, vq);
+               struct virtio_uml_device *vu_dev;
+
+               vu_dev = to_virtio_uml_device(vq->vdev);
+
+               um_free_irq(vu_dev->irq, vq);
                os_close_file(info->call_fd);
        }
 
@@ -852,7 +858,7 @@ 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(VIRTIO_IRQ, info->call_fd, IRQ_READ,
+       rc = um_request_irq(vu_dev->irq, info->call_fd, IRQ_READ,
                            vu_interrupt, IRQF_SHARED, info->name, vq);
        if (rc < 0)
                goto close_both;
@@ -864,7 +870,7 @@ static int vu_setup_vq_call_fd(struct virtio_uml_device *vu_dev,
        goto out;
 
 release_irq:
-       um_free_irq(VIRTIO_IRQ, vq);
+       um_free_irq(vu_dev->irq, vq);
 close_both:
        os_close_file(call_fds[0]);
 out:
@@ -969,7 +975,7 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
 
 error_setup:
        if (info->call_fd >= 0) {
-               um_free_irq(VIRTIO_IRQ, vq);
+               um_free_irq(vu_dev->irq, vq);
                os_close_file(info->call_fd);
        }
 error_call:
@@ -1078,7 +1084,7 @@ static void virtio_uml_release_dev(struct device *d)
 
        /* might not have been opened due to not negotiating the feature */
        if (vu_dev->req_fd >= 0) {
-               um_free_irq(VIRTIO_IRQ, vu_dev);
+               um_free_irq(vu_dev->irq, vu_dev);
                os_close_file(vu_dev->req_fd);
        }
 
index b6fa6301c75b0f27a7ec0af9643651d7f9afd572..547bff7b3a89c3ceca22b0f17335afe92885086e 100644 (file)
 #define TELNETD_IRQ            12
 #define XTERM_IRQ              13
 #define RANDOM_IRQ             14
-#define VIRTIO_IRQ             15
 
 #ifdef CONFIG_UML_NET_VECTOR
 
-#define VECTOR_BASE_IRQ                (VIRTIO_IRQ + 1)
+#define VECTOR_BASE_IRQ                (RANDOM_IRQ + 1)
 #define VECTOR_IRQ_SPACE       8
 
 #define UM_FIRST_DYN_IRQ (VECTOR_IRQ_SPACE + VECTOR_BASE_IRQ)
 
 #else
 
-#define UM_FIRST_DYN_IRQ (VIRTIO_IRQ + 1)
+#define UM_FIRST_DYN_IRQ (RANDOM_IRQ + 1)
 
 #endif