On Tue, 3 Nov 2026 at 12:58, Robin Jarry <[email protected]> wrote:
>
> When an interface is moved to another namespace, the LSC netlink socket
> is recreated in the new namespace and the interrupt handle FD is updated
> in place. The old socket is never closed, leaking one FD per move.
>
> Create the new socket first, then close the previous one before updating
> the handle, so that the handle never references a closed FD if socket
> creation fails.
>
> Fixes: aae3a38e9e03 ("net/tap: detect namespace change")
> Cc: [email protected]
>
> Signed-off-by: Robin Jarry <[email protected]>
> ---
>  drivers/net/tap/rte_eth_tap.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
> index 1d2b71675a8c..885f1b341388 100644
> --- a/drivers/net/tap/rte_eth_tap.c
> +++ b/drivers/net/tap/rte_eth_tap.c
> @@ -1938,15 +1938,21 @@ tap_lsc_intr_handle_set(struct rte_eth_dev *dev, int 
> set)
>                 return 0;
>         }
>         if (set) {
> +               int fd;
> +
>                 /*
>                  * Subscribe to RTMGRP_LINK to receive RTM_NEWLINK (link state
>                  * changes) events. Also receives RTM_DELLINK events which are
>                  * used for namespace change detection when TUNGETDEVNETNS is
>                  * available.
>                  */
> -               rte_intr_fd_set(pmd->intr_handle, tap_nl_init(RTMGRP_LINK));
> -               if (unlikely(rte_intr_fd_get(pmd->intr_handle) == -1))
> +               fd = tap_nl_init(RTMGRP_LINK);
> +               if (unlikely(fd == -1))
>                         return -EBADF;
> +               /* Close the socket of the previous namespace, if any. */
> +               if (rte_intr_fd_get(pmd->intr_handle) >= 0)
> +                       tap_nl_final(rte_intr_fd_get(pmd->intr_handle));
> +               rte_intr_fd_set(pmd->intr_handle, fd);
>                 return rte_intr_callback_register(
>                         pmd->intr_handle, tap_dev_intr_handler, dev);
>         }

So IIUC, net/tap is changing the FD while the interrupt thread may be
working on it.
This was working "fine" so far as the interrupt thread was working on
a copy, but now, it is racing.

This fix looks correct, however, we have more issues following the
removal of intr_handle duplication.
I would instead make sure the interrupt subsystems acked it stopped
caring about this intr_handle (iow, after this callback returns).
Btw, I see a use after free on port close (probably missing a intr unregister).

I am preparing a different set of fixes (using the same idea than
net/virtio-user).


-- 
David Marchand

Reply via email to