Hello,

30/10/2026 11:22, Sriram Yagnaraman:
> The control-channel callback runs on the interrupt thread and calls
> memif_disconnect() when the peer hangs up. Nothing ordered this against
> an application thread stopping and closing the same port. When the peer
> of a loopback pair is stopped first, the callback can still be running
> memif_disconnect() while the port is closed and released, and then
> dereferences dev->data which is NULL. Seen as a SIGSEGV on the interrupt
> thread during memif_pmd_autotest teardown.
> 
> Detach the control channel in memif_cc_detach(), called without cc_lock:
> 
>   - take pmd->cc under cc_lock so only one caller owns it;
>   - on the interrupt thread (the callback itself) defer the free to the
>     pending-unregister callback, as before;
>   - on an application thread wait for a running callback with
>     rte_intr_callback_unregister_sync() so the device stays valid until
>     it returns, then free.
> 
> memif_intr_handler() no longer disconnects a device that has already
> dropped this channel: it stops polling the fd and returns, letting the
> waiting application thread free the channel. Once memif_cc_detach()
> returns the handler cannot run for the device, so the queue and region
> teardown no longer needs cc_lock.

It seems the teardown is too much complex.
We can probably make something simpler with a re-design.
I'm not sure about applying this big fix on top of a fragile design.
I'm aware it may be a big task.
Tell us if you think the teardown can be better fixed easily.

Otherwise I suggest disabling the memif autotest
from the fast tests series which runs in CI.
What do you think?


Reply via email to