Commit d5305319 authored by Alex Williamson's avatar Alex Williamson

vfio/pci: Pass eventfd context object through irqfd

Further avoid lookup of the context object by passing it through the
irqfd data field.
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Link: https://lore.kernel.org/r/20240401195406.3720453-3-alex.williamson@redhat.comSigned-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent 071e7310
...@@ -85,19 +85,14 @@ vfio_irq_ctx_alloc(struct vfio_pci_core_device *vdev, unsigned long index) ...@@ -85,19 +85,14 @@ vfio_irq_ctx_alloc(struct vfio_pci_core_device *vdev, unsigned long index)
/* /*
* INTx * INTx
*/ */
static void vfio_send_intx_eventfd(void *opaque, void *unused) static void vfio_send_intx_eventfd(void *opaque, void *data)
{ {
struct vfio_pci_core_device *vdev = opaque; struct vfio_pci_core_device *vdev = opaque;
if (likely(is_intx(vdev) && !vdev->virq_disabled)) { if (likely(is_intx(vdev) && !vdev->virq_disabled)) {
struct vfio_pci_irq_ctx *ctx; struct vfio_pci_irq_ctx *ctx = data;
struct eventfd_ctx *trigger; struct eventfd_ctx *trigger = READ_ONCE(ctx->trigger);
ctx = vfio_irq_ctx_get(vdev, 0);
if (WARN_ON_ONCE(!ctx))
return;
trigger = READ_ONCE(ctx->trigger);
if (likely(trigger)) if (likely(trigger))
eventfd_signal(trigger); eventfd_signal(trigger);
} }
...@@ -167,11 +162,11 @@ bool vfio_pci_intx_mask(struct vfio_pci_core_device *vdev) ...@@ -167,11 +162,11 @@ bool vfio_pci_intx_mask(struct vfio_pci_core_device *vdev)
* a signal is necessary, which can then be handled via a work queue * a signal is necessary, which can then be handled via a work queue
* or directly depending on the caller. * or directly depending on the caller.
*/ */
static int vfio_pci_intx_unmask_handler(void *opaque, void *unused) static int vfio_pci_intx_unmask_handler(void *opaque, void *data)
{ {
struct vfio_pci_core_device *vdev = opaque; struct vfio_pci_core_device *vdev = opaque;
struct pci_dev *pdev = vdev->pdev; struct pci_dev *pdev = vdev->pdev;
struct vfio_pci_irq_ctx *ctx; struct vfio_pci_irq_ctx *ctx = data;
unsigned long flags; unsigned long flags;
int ret = 0; int ret = 0;
...@@ -187,10 +182,6 @@ static int vfio_pci_intx_unmask_handler(void *opaque, void *unused) ...@@ -187,10 +182,6 @@ static int vfio_pci_intx_unmask_handler(void *opaque, void *unused)
goto out_unlock; goto out_unlock;
} }
ctx = vfio_irq_ctx_get(vdev, 0);
if (WARN_ON_ONCE(!ctx))
goto out_unlock;
if (ctx->masked && !vdev->virq_disabled) { if (ctx->masked && !vdev->virq_disabled) {
/* /*
* A pending interrupt here would immediately trigger, * A pending interrupt here would immediately trigger,
...@@ -214,10 +205,12 @@ static int vfio_pci_intx_unmask_handler(void *opaque, void *unused) ...@@ -214,10 +205,12 @@ static int vfio_pci_intx_unmask_handler(void *opaque, void *unused)
static void __vfio_pci_intx_unmask(struct vfio_pci_core_device *vdev) static void __vfio_pci_intx_unmask(struct vfio_pci_core_device *vdev)
{ {
struct vfio_pci_irq_ctx *ctx = vfio_irq_ctx_get(vdev, 0);
lockdep_assert_held(&vdev->igate); lockdep_assert_held(&vdev->igate);
if (vfio_pci_intx_unmask_handler(vdev, NULL) > 0) if (vfio_pci_intx_unmask_handler(vdev, ctx) > 0)
vfio_send_intx_eventfd(vdev, NULL); vfio_send_intx_eventfd(vdev, ctx);
} }
void vfio_pci_intx_unmask(struct vfio_pci_core_device *vdev) void vfio_pci_intx_unmask(struct vfio_pci_core_device *vdev)
...@@ -249,7 +242,7 @@ static irqreturn_t vfio_intx_handler(int irq, void *dev_id) ...@@ -249,7 +242,7 @@ static irqreturn_t vfio_intx_handler(int irq, void *dev_id)
spin_unlock_irqrestore(&vdev->irqlock, flags); spin_unlock_irqrestore(&vdev->irqlock, flags);
if (ret == IRQ_HANDLED) if (ret == IRQ_HANDLED)
vfio_send_intx_eventfd(vdev, NULL); vfio_send_intx_eventfd(vdev, ctx);
return ret; return ret;
} }
...@@ -604,7 +597,7 @@ static int vfio_pci_set_intx_unmask(struct vfio_pci_core_device *vdev, ...@@ -604,7 +597,7 @@ static int vfio_pci_set_intx_unmask(struct vfio_pci_core_device *vdev,
if (fd >= 0) if (fd >= 0)
return vfio_virqfd_enable((void *) vdev, return vfio_virqfd_enable((void *) vdev,
vfio_pci_intx_unmask_handler, vfio_pci_intx_unmask_handler,
vfio_send_intx_eventfd, NULL, vfio_send_intx_eventfd, ctx,
&ctx->unmask, fd); &ctx->unmask, fd);
vfio_virqfd_disable(&ctx->unmask); vfio_virqfd_disable(&ctx->unmask);
...@@ -671,11 +664,11 @@ static int vfio_pci_set_intx_trigger(struct vfio_pci_core_device *vdev, ...@@ -671,11 +664,11 @@ static int vfio_pci_set_intx_trigger(struct vfio_pci_core_device *vdev,
return -EINVAL; return -EINVAL;
if (flags & VFIO_IRQ_SET_DATA_NONE) { if (flags & VFIO_IRQ_SET_DATA_NONE) {
vfio_send_intx_eventfd(vdev, NULL); vfio_send_intx_eventfd(vdev, vfio_irq_ctx_get(vdev, 0));
} else if (flags & VFIO_IRQ_SET_DATA_BOOL) { } else if (flags & VFIO_IRQ_SET_DATA_BOOL) {
uint8_t trigger = *(uint8_t *)data; uint8_t trigger = *(uint8_t *)data;
if (trigger) if (trigger)
vfio_send_intx_eventfd(vdev, NULL); vfio_send_intx_eventfd(vdev, vfio_irq_ctx_get(vdev, 0));
} }
return 0; return 0;
} }
......
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