From: Mostafa Saleh <smostafa@google.com>
To: kvm@vger.kernel.org
Cc: will@kernel.org, julien.thierry.kdev@gmail.com, praan@google.com,
eric.auger@redhat.com, alex@shazbot.org,
Mostafa Saleh <smostafa@google.com>
Subject: [PATCH kvmtool 3/9] vfio: Support edge-triggered wired IRQs
Date: Sat, 24 Oct 2026 16:18:56 +0000 [thread overview]
Message-ID: <20261024161902.2093581-4-smostafa@google.com> (raw)
In-Reply-To: <20261024161902.2093581-1-smostafa@google.com>
PCI INTx is are level-triggered and automasked, but platform
device interrupts can also be edge-triggered.
Pass an automasked boolean to vfio_irq_enable() and only create and
register unmask_fd when the interrupt is automasked.
Signed-off-by: Mostafa Saleh <smostafa@google.com>
---
include/kvm/vfio.h | 2 +-
vfio/core.c | 51 ++++++++++++++++++++++++++--------------------
vfio/pci.c | 3 ++-
3 files changed, 32 insertions(+), 24 deletions(-)
diff --git a/include/kvm/vfio.h b/include/kvm/vfio.h
index 9a5783e..0b2b105 100644
--- a/include/kvm/vfio.h
+++ b/include/kvm/vfio.h
@@ -141,7 +141,7 @@ int vfio_map_region(struct kvm *kvm, struct vfio_device *vdev,
struct vfio_region *region);
void vfio_unmap_region(struct kvm *kvm, struct vfio_region *region);
int vfio_irq_enable(struct kvm *kvm, struct vfio_device *vdev,
- unsigned int index, struct vfio_irq *irq);
+ unsigned int index, bool automasked, struct vfio_irq *irq);
void vfio_irq_disable(struct kvm *kvm, struct vfio_device *vdev,
unsigned int index, struct vfio_irq *irq);
int vfio_pci_setup_device(struct kvm *kvm, struct vfio_device *device);
diff --git a/vfio/core.c b/vfio/core.c
index 24d3f2d..aa124d2 100644
--- a/vfio/core.c
+++ b/vfio/core.c
@@ -301,15 +301,16 @@ void vfio_irq_disable(struct kvm *kvm, struct vfio_device *vdev,
irq__del_irqfd(kvm, gsi, irq->trigger_fd);
close(irq->trigger_fd);
- close(irq->unmask_fd);
+ if (irq->unmask_fd >= 0)
+ close(irq->unmask_fd);
irq->trigger_fd = -1;
}
int vfio_irq_enable(struct kvm *kvm, struct vfio_device *vdev,
- unsigned int index, struct vfio_irq *irq)
+ unsigned int index, bool automasked, struct vfio_irq *irq)
{
int ret;
- int trigger_fd, unmask_fd;
+ int trigger_fd, unmask_fd = -1;
union vfio_irq_eventfd trigger;
union vfio_irq_eventfd unmask;
int gsi = irq->gsi;
@@ -318,7 +319,7 @@ int vfio_irq_enable(struct kvm *kvm, struct vfio_device *vdev,
return 0;
/*
- * PCI IRQ is level-triggered, so we use two eventfds. trigger_fd
+ * Level-triggered IRQ is automasked, so we use two eventfds. trigger_fd
* signals an interrupt from host to guest, and unmask_fd signals the
* deassertion of the line from guest to host.
*/
@@ -328,11 +329,13 @@ int vfio_irq_enable(struct kvm *kvm, struct vfio_device *vdev,
return trigger_fd;
}
- unmask_fd = eventfd(0, 0);
- if (unmask_fd < 0) {
- vfio_dev_err(vdev, "failed to create unmask eventfd");
- close(trigger_fd);
- return unmask_fd;
+ if (automasked) {
+ unmask_fd = eventfd(0, 0);
+ if (unmask_fd < 0) {
+ vfio_dev_err(vdev, "failed to create unmask eventfd");
+ close(trigger_fd);
+ return unmask_fd;
+ }
}
ret = irq__add_irqfd(kvm, gsi, trigger_fd, unmask_fd);
@@ -354,19 +357,22 @@ int vfio_irq_enable(struct kvm *kvm, struct vfio_device *vdev,
goto err_delete_line;
}
- unmask.irq = (struct vfio_irq_set) {
- .argsz = sizeof(unmask),
- .flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_UNMASK,
- .index = index,
- .start = 0,
- .count = 1,
- };
- set_vfio_irq_eventd_payload(&unmask, unmask_fd);
+ if (unmask_fd >= 0) {
+ unmask.irq = (struct vfio_irq_set) {
+ .argsz = sizeof(unmask),
+ .flags = VFIO_IRQ_SET_DATA_EVENTFD |
+ VFIO_IRQ_SET_ACTION_UNMASK,
+ .index = index,
+ .start = 0,
+ .count = 1,
+ };
+ set_vfio_irq_eventd_payload(&unmask, unmask_fd);
- ret = ioctl(vdev->fd, VFIO_DEVICE_SET_IRQS, &unmask);
- if (ret < 0) {
- vfio_dev_err(vdev, "failed to setup unmask IRQ");
- goto err_remove_event;
+ ret = ioctl(vdev->fd, VFIO_DEVICE_SET_IRQS, &unmask);
+ if (ret < 0) {
+ vfio_dev_err(vdev, "failed to setup unmask IRQ");
+ goto err_remove_event;
+ }
}
irq->trigger_fd = trigger_fd;
@@ -385,7 +391,8 @@ err_delete_line:
err_close:
close(trigger_fd);
- close(unmask_fd);
+ if (unmask_fd >= 0)
+ close(unmask_fd);
return ret;
}
diff --git a/vfio/pci.c b/vfio/pci.c
index fb98435..9bf2f9e 100644
--- a/vfio/pci.c
+++ b/vfio/pci.c
@@ -1216,7 +1216,8 @@ static int vfio_pci_enable_intx(struct kvm *kvm, struct vfio_device *vdev)
{
struct vfio_pci_device *pdev = &vdev->pci;
- return vfio_irq_enable(kvm, vdev, VFIO_PCI_INTX_IRQ_INDEX, &pdev->intx);
+ return vfio_irq_enable(kvm, vdev, VFIO_PCI_INTX_IRQ_INDEX, true,
+ &pdev->intx);
}
static int vfio_pci_init_intx(struct kvm *kvm, struct vfio_device *vdev)
--
2.56.0.307.g5fe7bd680c-goog
next prev parent reply other threads:[~2026-10-24 16:20 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-24 16:18 [PATCH kvmtool 0/9] vfio: Add support for platform devices Mostafa Saleh
2026-10-24 16:18 ` [PATCH kvmtool 1/9] vfio: Fix fd leak in vfio_group_get_for_dev() Mostafa Saleh
2026-10-24 16:18 ` [PATCH kvmtool 2/9] vfio: Factor out wired IRQ setup and teardown Mostafa Saleh
2026-10-24 16:18 ` Mostafa Saleh [this message]
2026-10-24 16:18 ` [PATCH kvmtool 4/9] fdt: Allow fdt_irq_fn to generate multiple interrupts Mostafa Saleh
2026-10-24 16:18 ` [PATCH kvmtool 5/9] fdt: Add helper to copy an FDT node Mostafa Saleh
2026-10-24 16:18 ` [PATCH kvmtool 6/9] vfio: Reserve guest address space for VFIO platform Mostafa Saleh
2026-10-24 16:19 ` [PATCH kvmtool 7/9] vfio: Add basic support for vfio-platform Mostafa Saleh
2026-10-24 16:19 ` [PATCH kvmtool 8/9] vfio: platform: Add interrupts support Mostafa Saleh
2026-10-24 16:19 ` [PATCH kvmtool 9/9] vfio: platform: Take the guest node from a device tree template Mostafa Saleh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261024161902.2093581-4-smostafa@google.com \
--to=smostafa@google.com \
--cc=alex@shazbot.org \
--cc=eric.auger@redhat.com \
--cc=julien.thierry.kdev@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=praan@google.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.