From: Eric Dumazet <edumazet@xxxxxxxxxx> Date: Fri, 7 Mar 2025 11:28:36 +0100 > On Wed, Mar 5, 2025 at 5:22 PM Alexander Lobakin > <aleksander.lobakin@xxxxxxxxx> wrote: >> >> Add the missing linking of NAPIs to netdev queues when enabling >> interrupt vectors in order to support NAPI configuration and >> interfaces requiring get_rx_queue()->napi to be set (like XSk >> busy polling). >> >> Signed-off-by: Alexander Lobakin <aleksander.lobakin@xxxxxxxxx> >> --- >> drivers/net/ethernet/intel/idpf/idpf_txrx.c | 30 +++++++++++++++++++++ >> 1 file changed, 30 insertions(+) >> >> diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c >> index 2f221c0abad8..a3f6e8cff7a0 100644 >> --- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c >> +++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c >> @@ -3560,8 +3560,11 @@ void idpf_vport_intr_rel(struct idpf_vport *vport) >> static void idpf_vport_intr_rel_irq(struct idpf_vport *vport) >> { >> struct idpf_adapter *adapter = vport->adapter; >> + bool unlock; >> int vector; >> >> + unlock = rtnl_trylock(); > > This is probably not what you want here ? > > If another thread is holding RTNL, then rtnl_ttrylock() will not add > any protection. Yep I know. trylock() is because this function can be called in two scenarios: 1) .ndo_close(), when RTNL is already locked; 2) "soft reset" aka "stop the traffic, reallocate the queues, start the traffic", when RTNL is not taken. The second one spits a WARN without the RTNL being locked. So this trylock() will do nothing for the first scenario and will take the lock for the second one. If that is not correct, let me know, I'll do it a different way (maybe it's better to unconditionally take the lock on the callsite for the second case?). Thanks, Olek