Re: [PATCH net v3 4/7] net/sched: act_gate: read schedule via RCU
From: Victor Nogueira
Date: Wed Jan 21 2026 - 15:45:38 EST
On 21/01/2026 10:20, Paul Moses wrote:
Switch dump/accessor reads to RCU read-side sections. This matches other
actions that read params under rcu_read_lock(), e.g. act_tunnel_key dump
(commit e97ae742972f6c), act_ctinfo dump (commit 799c94178cf9c9), and
act_skbedit dump (commit 1f376373bd225c).
Dump reads tcf_action via READ_ONCE, following the lockless action reads used
in act_sample (commit 5c5670fae43027) and act_gact.
Timer logic stays under tcf_lock and uses rcu_dereference_protected(), keeping
RCU readers cheap while preserving lock-serialized timer updates.
diff --git a/include/net/tc_act/tc_gate.h b/include/net/tc_act/tc_gate.h
index 05968b3822392..9587d9e9fa38f 100644
--- a/include/net/tc_act/tc_gate.h
+++ b/include/net/tc_act/tc_gate.h
@@ -57,9 +57,10 @@ static inline s32 tcf_gate_prio(const struct tc_action *a)
s32 tcfg_prio;
struct tcf_gate_params *p;
- p = rcu_dereference_protected(to_gate(a)->param,
- lockdep_rtnl_is_held());
+ rcu_read_lock();
+ p = rcu_dereference(to_gate(a)->param);
tcfg_prio = p->tcfg_priority;
+ rcu_read_unlock();
These helper functions are called with the tcf_lock acquired, so you
don't need rcu_read_lock here. You can just do:
p = rcu_dereference_protected(to_gate(a)->param,
lockdep_is_held(&gact->tcf_lock));
cheers,
Victor