[RFC 3/4] interrupts: mark file descriptors invalid on allocation

David Marchand david.marchand at redhat.com
Fri Jul 24 14:16:43 CEST 2026


On Thu, 23 Jul 2026 at 15:19, David Marchand <david.marchand at redhat.com> wrote:
>
> Initialize fd, dev_fd, and all efds array elements as invalid in
> rte_intr_instance_alloc().
> This follows Unix convention, avoiding confusion with fd 0
> which could result from zero-initialization.
>
> Update the API documentation to reflect this behavior and add a
> unit test check to verify the fd is invalid after allocation.
>
> Remove now-redundant initialization calls that were setting the fd
> invalid right after allocation.
>
> Signed-off-by: David Marchand <david.marchand at redhat.com>
> ---
>  app/test/test_interrupts.c             |  5 +++--
>  doc/guides/rel_notes/release_26_11.rst |  5 +++++
>  drivers/bus/cdx/cdx_vfio.c             |  6 ------
>  drivers/bus/pci/linux/pci_vfio.c       | 11 -----------
>  drivers/bus/pci/pci_common_uio.c       |  6 ------
>  drivers/bus/vmbus/vmbus_common_uio.c   |  6 ------
>  drivers/net/failsafe/failsafe.c        |  3 ---
>  drivers/net/mana/mana.c                |  4 ----
>  drivers/net/memif/rte_eth_memif.c      |  6 ------
>  drivers/net/mlx4/mlx4.c                |  3 ---
>  drivers/net/tap/rte_eth_tap.c          |  1 -
>  lib/eal/common/eal_common_interrupts.c |  6 ++++++
>  lib/eal/freebsd/eal_alarm.c            |  3 ---
>  lib/eal/include/rte_interrupts.h       |  2 ++
>  lib/eal/linux/eal_dev.c                |  4 ----
>  15 files changed, 16 insertions(+), 55 deletions(-)
>
> diff --git a/app/test/test_interrupts.c b/app/test/test_interrupts.c
> index 3a5be92cd7..5901cec2fe 100644
> --- a/app/test/test_interrupts.c
> +++ b/app/test/test_interrupts.c
> @@ -73,11 +73,12 @@ test_interrupt_init(void)
>                         rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE);
>                 if (!intr_handles[i])
>                         return -1;
> +               /* Verify fd is initialized to -1 */
> +               if (rte_intr_fd_get(intr_handles[i]) != -1)
> +                       return -1;
>         }
>
>         test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_INVALID];
> -       if (rte_intr_fd_set(test_intr_handle, -1))
> -               return -1;
>         if (rte_intr_type_set(test_intr_handle, RTE_INTR_HANDLE_UNKNOWN))
>                 return -1;
>

An "interesting" failure came from the unit test.

The unit test does not set a dev_fd in its simulated interrupt handles.
However, Linux implementation in rte_intr_enable(), rte_intr_ack() and
rte_intr_disable() enforce that a valid dev_fd is set.

So the unit test for RTE_INTR_HANDLE_UIO type was passing so far
because the interrupt handler contained a valid 0 dev fd...  that was
unused in EAL in RTE_INTR_HANDLE_UIO only.

None of the other UIO and VFIO types (that do need a dev_fd) are
covered by the unit test.

On the other hand, actual usage of RTE_INTR_HANDLE_UIO type in the PCI
bus driver does set a dev_fd.

drivers/bus/pci/linux/pci_uio.c-        uio_cfg_fd = open(cfgname, O_RDWR);
drivers/bus/pci/linux/pci_uio.c-        if (uio_cfg_fd < 0) {
drivers/bus/pci/linux/pci_uio.c-                PCI_LOG(ERR, "Cannot
open %s: %s", cfgname, strerror(errno));
drivers/bus/pci/linux/pci_uio.c-                goto error;
drivers/bus/pci/linux/pci_uio.c-        }
drivers/bus/pci/linux/pci_uio.c-
drivers/bus/pci/linux/pci_uio.c-        if
(rte_intr_dev_fd_set(dev->intr_handle, uio_cfg_fd))
drivers/bus/pci/linux/pci_uio.c-                goto error;
drivers/bus/pci/linux/pci_uio.c-
drivers/bus/pci/linux/pci_uio.c-        if (dev->kdrv == RTE_PCI_KDRV_IGB_UIO) {
drivers/bus/pci/linux/pci_uio.c:                if
(rte_intr_type_set(dev->intr_handle, RTE_INTR_HANDLE_UIO))

I'd lean towards removing the funky UIO part of the unit test.

Opinion?


-- 
David Marchand



More information about the dev mailing list