[PATCH 2/7] um: virtio: use dynamic IRQ allocation
Anton Ivanov
anton.ivanov at kot-begemot.co.uk
Mon Nov 30 08:45:32 EST 2020
On 23/11/2020 19:56, Johannes Berg wrote:
> From: Johannes Berg <johannes.berg at intel.com>
>
> 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.
>
> Signed-off-by: Johannes Berg <johannes.berg at intel.com>
> ---
> arch/um/drivers/virtio_uml.c | 22 ++++++++++++++--------
> arch/um/include/asm/irq.h | 5 ++---
> 2 files changed, 16 insertions(+), 11 deletions(-)
>
> diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
> index f76b8da28d20..94b112749d5b 100644
> --- a/arch/um/drivers/virtio_uml.c
> +++ b/arch/um/drivers/virtio_uml.c
> @@ -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);
> }
>
> diff --git a/arch/um/include/asm/irq.h b/arch/um/include/asm/irq.h
> index b6fa6301c75b..547bff7b3a89 100644
> --- a/arch/um/include/asm/irq.h
> +++ b/arch/um/include/asm/irq.h
> @@ -17,18 +17,17 @@
> #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
>
>
Acked-By: Anton Ivanov <anton.ivanov at cambridgegreys.com>
--
Anton R. Ivanov
https://www.kot-begemot.co.uk/
More information about the linux-um
mailing list