mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
net/sched: acp_api: no longer acquire RTNL in tc_action_net_exit()
tc_action_net_exit() got an rtnl exclusion in commita159d3c4b8("net_sched: acquire RTNL in tc_action_net_exit()") Since then, commit16af606739("net: sched: implement reference counted action release") made this RTNL exclusion obsolete for most cases. Only tcf_action_offload_del() might still require it. Move the rtnl locking into tcf_idrinfo_destroy() when an offload action is found. Most netns do not have actions, yet deleting them is adding a lot of pressure on RTNL, which is for many the most contended mutex in the kernel. We are moving to a per-netns 'rtnl', so tc_action_net_exit() will not be able to grab 'rtnl' a single time for a batch of netns. Before the patch: perf probe -a rtnl_lock perf record -e probe:rtnl_lock -a /bin/bash -c 'unshare -n "/bin/true"; sleep 1' [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.305 MB perf.data (25 samples) ] After the patch: perf record -e probe:rtnl_lock -a /bin/bash -c 'unshare -n "/bin/true"; sleep 1' [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.304 MB perf.data (9 samples) ] Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Vlad Buslov <vladbu@nvidia.com> Cc: Jiri Pirko <jiri@resnulli.us> Cc: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Link: https://patch.msgid.link/20250702071230.1892674-1-edumazet@google.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
committed by
Paolo Abeni
parent
d23647fd54
commit
84a7d6797e
@@ -933,18 +933,25 @@ void tcf_idrinfo_destroy(const struct tc_action_ops *ops,
|
||||
struct tcf_idrinfo *idrinfo)
|
||||
{
|
||||
struct idr *idr = &idrinfo->action_idr;
|
||||
bool mutex_taken = false;
|
||||
struct tc_action *p;
|
||||
int ret;
|
||||
unsigned long id = 1;
|
||||
unsigned long tmp;
|
||||
int ret;
|
||||
|
||||
idr_for_each_entry_ul(idr, p, tmp, id) {
|
||||
if (tc_act_in_hw(p) && !mutex_taken) {
|
||||
rtnl_lock();
|
||||
mutex_taken = true;
|
||||
}
|
||||
ret = __tcf_idr_release(p, false, true);
|
||||
if (ret == ACT_P_DELETED)
|
||||
module_put(ops->owner);
|
||||
else if (ret < 0)
|
||||
return;
|
||||
}
|
||||
if (mutex_taken)
|
||||
rtnl_unlock();
|
||||
idr_destroy(&idrinfo->action_idr);
|
||||
}
|
||||
EXPORT_SYMBOL(tcf_idrinfo_destroy);
|
||||
|
||||
Reference in New Issue
Block a user