Commit aaf5800e authored by Johannes Berg's avatar Johannes Berg Committed by Richard Weinberger

um: virtio: Use dynamic IRQ allocation

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: default avatarAnton Ivanov <anton.ivanov@cambridgegreys.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Acked-By: default avatarAnton Ivanov <anton.ivanov@cambridgegreys.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent 36d46a59
...@@ -55,7 +55,7 @@ struct virtio_uml_device { ...@@ -55,7 +55,7 @@ struct virtio_uml_device {
struct platform_device *pdev; struct platform_device *pdev;
spinlock_t sock_lock; spinlock_t sock_lock;
int sock, req_fd; int sock, req_fd, irq;
u64 features; u64 features;
u64 protocol_features; u64 protocol_features;
u8 status; u8 status;
...@@ -409,12 +409,14 @@ static int vhost_user_init_slave_req(struct virtio_uml_device *vu_dev) ...@@ -409,12 +409,14 @@ static int vhost_user_init_slave_req(struct virtio_uml_device *vu_dev)
return rc; return rc;
vu_dev->req_fd = req_fds[0]; 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_req_interrupt, IRQF_SHARED,
vu_dev->pdev->name, vu_dev); vu_dev->pdev->name, vu_dev);
if (rc < 0) if (rc < 0)
goto err_close; goto err_close;
vu_dev->irq = rc;
rc = vhost_user_send_no_payload_fd(vu_dev, VHOST_USER_SET_SLAVE_REQ_FD, rc = vhost_user_send_no_payload_fd(vu_dev, VHOST_USER_SET_SLAVE_REQ_FD,
req_fds[1]); req_fds[1]);
if (rc) if (rc)
...@@ -423,7 +425,7 @@ static int vhost_user_init_slave_req(struct virtio_uml_device *vu_dev) ...@@ -423,7 +425,7 @@ static int vhost_user_init_slave_req(struct virtio_uml_device *vu_dev)
goto out; goto out;
err_free_irq: err_free_irq:
um_free_irq(VIRTIO_IRQ, vu_dev); um_free_irq(vu_dev->irq, vu_dev);
err_close: err_close:
os_close_file(req_fds[0]); os_close_file(req_fds[0]);
out: out:
...@@ -802,7 +804,11 @@ static void vu_del_vq(struct virtqueue *vq) ...@@ -802,7 +804,11 @@ static void vu_del_vq(struct virtqueue *vq)
struct virtio_uml_vq_info *info = vq->priv; struct virtio_uml_vq_info *info = vq->priv;
if (info->call_fd >= 0) { 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); os_close_file(info->call_fd);
} }
...@@ -852,7 +858,7 @@ static int vu_setup_vq_call_fd(struct virtio_uml_device *vu_dev, ...@@ -852,7 +858,7 @@ static int vu_setup_vq_call_fd(struct virtio_uml_device *vu_dev,
return rc; return rc;
info->call_fd = call_fds[0]; 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); vu_interrupt, IRQF_SHARED, info->name, vq);
if (rc < 0) if (rc < 0)
goto close_both; goto close_both;
...@@ -864,7 +870,7 @@ static int vu_setup_vq_call_fd(struct virtio_uml_device *vu_dev, ...@@ -864,7 +870,7 @@ static int vu_setup_vq_call_fd(struct virtio_uml_device *vu_dev,
goto out; goto out;
release_irq: release_irq:
um_free_irq(VIRTIO_IRQ, vq); um_free_irq(vu_dev->irq, vq);
close_both: close_both:
os_close_file(call_fds[0]); os_close_file(call_fds[0]);
out: out:
...@@ -969,7 +975,7 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev, ...@@ -969,7 +975,7 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
error_setup: error_setup:
if (info->call_fd >= 0) { if (info->call_fd >= 0) {
um_free_irq(VIRTIO_IRQ, vq); um_free_irq(vu_dev->irq, vq);
os_close_file(info->call_fd); os_close_file(info->call_fd);
} }
error_call: error_call:
...@@ -1078,7 +1084,7 @@ static void virtio_uml_release_dev(struct device *d) ...@@ -1078,7 +1084,7 @@ static void virtio_uml_release_dev(struct device *d)
/* might not have been opened due to not negotiating the feature */ /* might not have been opened due to not negotiating the feature */
if (vu_dev->req_fd >= 0) { 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); os_close_file(vu_dev->req_fd);
} }
......
...@@ -17,18 +17,17 @@ ...@@ -17,18 +17,17 @@
#define TELNETD_IRQ 12 #define TELNETD_IRQ 12
#define XTERM_IRQ 13 #define XTERM_IRQ 13
#define RANDOM_IRQ 14 #define RANDOM_IRQ 14
#define VIRTIO_IRQ 15
#ifdef CONFIG_UML_NET_VECTOR #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 VECTOR_IRQ_SPACE 8
#define UM_FIRST_DYN_IRQ (VECTOR_IRQ_SPACE + VECTOR_BASE_IRQ) #define UM_FIRST_DYN_IRQ (VECTOR_IRQ_SPACE + VECTOR_BASE_IRQ)
#else #else
#define UM_FIRST_DYN_IRQ (VIRTIO_IRQ + 1) #define UM_FIRST_DYN_IRQ (RANDOM_IRQ + 1)
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment