Question: prestera: clarify event handler RCU-list contract
From: Runyu Xiao
Date: Sat Jun 27 2026 - 09:55:40 EST
Hi Prestera maintainers,
This question comes from a candidate found by our static analysis tool
and then manually reviewed against the current tree. The audit used
CONFIG_PROVE_RCU_LIST as target-matched triage evidence; I am asking
for maintainer guidance because the source-level review did not prove
a use-after-free.
A CONFIG_PROVE_RCU_LIST audit flags the shared event-handler lookup
helper:
drivers/net/ethernet/marvell/prestera/prestera_hw.c:923 __find_event_handler()
The receive-side paths use prestera_find_event_handler(), which wraps
the helper in rcu_read_lock(), copies the handler record, and drops RCU
before invoking the callback.
The registration paths call __find_event_handler() directly:
drivers/net/ethernet/marvell/prestera/prestera_hw.c:2255 prestera_hw_event_handler_register()
drivers/net/ethernet/marvell/prestera/prestera_hw.c:2280 prestera_hw_event_handler_unregister()
Registration adds entries with list_add_rcu(). Unregistration removes
entries with list_del_rcu() and frees them with kfree_rcu(). The call
sites look init/fini-style, and I am not claiming a use-after-free here.
The question is only how the non-receive-side lookup contract is meant
to be expressed.
Would you prefer one of these directions?
1. split the helper into an RCU-reader lookup and a registration-time
lookup;
2. wrap the direct register/unregister lookups in a local RCU read-side
section;
3. add an explicit event-handler registration lock if concurrent
register/unregister is possible;
4. document that handler registration is init/fini ordered and leave
the direct helper calls unchanged.
I am intentionally sending this as a maintainer question rather than a
patch because the right shape depends on the intended registration and
teardown model.
Thanks.