Hello Maxime,

On Mon, 20 Jul 2026 at 10:01, Maxime Leroy <[email protected]> wrote:
>
> event_register() added each Rx queue interrupt fd to the per-thread epoll
> set before the worker loop, while the queues were still disarmed. This
> works when the fd is assigned at queue setup and stays fixed, as on MSI-X
> NICs.
>
> The dpaa2 PMD delivers Rx interrupts through a per-lcore QBMan portal and
> binds the fd when the interrupt is enabled, not at queue setup. Adding a
> queue to the epoll set before arming it then watches an fd that is not
> bound yet, so the lcore never wakes from rte_epoll_wait().
>
> Register from rx_interrupt_wait(), after the queues are armed, and only
> once: keep the epoll entry installed for the lifetime of the loop. NICs
> with a fixed per-queue fd are unaffected.
>
> Signed-off-by: Maxime Leroy <[email protected]>
> ---
>  examples/l3fwd-power/main.c | 34 +++++++++++++++++-----------------
>  1 file changed, 17 insertions(+), 17 deletions(-)
>
> diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
> index 70f76d202e..4874a55de1 100644
> --- a/examples/l3fwd-power/main.c
> +++ b/examples/l3fwd-power/main.c
> @@ -945,7 +945,7 @@ static int event_register(struct lcore_conf *qconf)
>  }
>
>  static int
> -rx_interrupt_wait(struct lcore_conf *qconf)
> +rx_interrupt_wait(struct lcore_conf *qconf, int *intr_registered)

On the principle, passing intr_registered is ugly.

intr_registered is an internal state that does not need to be exported
in the caller.
Maybe move this to struct lcore_conf?

This change also drops a log that flagged that Rx interrupts were not
available, please restore it (maybe add a "once" boolean to only raise
the log on the first error).

>  {
>         int ret;
>

-- 
David Marchand

Reply via email to