From: Eric Dumazet Date: Tue, 28 Apr 2026 08:28:51 +0000 (+0000) Subject: tc: use ll_init_map() only when needed X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4f5de57e2ff11a5925dacdf3deeeabee7ba9502a;p=thirdparty%2Fiproute2.git tc: use ll_init_map() only when needed Some setups can have thousands of devices. ll_init_map() is rather expensive for them. Only call ll_init_map() in the following cases: 1) tc runs in batch mode. 2) tc runs in monitor mode. 3) tc dumps qdiscs/classes/filters for all netdev. This greatly reduces RTNL pressure on common operations. Signed-off-by: Eric Dumazet Acked-by: Jamal Hadi Salim Signed-off-by: David Ahern --- diff --git a/tc/f_route.c b/tc/f_route.c index 96b99b06..c234ddf0 100644 --- a/tc/f_route.c +++ b/tc/f_route.c @@ -76,7 +76,6 @@ static int route_parse_opt(const struct filter_util *qu, char *handle, int argc, __u32 id; NEXT_ARG(); - ll_init_map(&rth); if ((id = ll_name_to_index(*argv)) <= 0) { fprintf(stderr, "Illegal \"fromif\"\n"); return -1; diff --git a/tc/m_mirred.c b/tc/m_mirred.c index f4da3c76..e9ae5199 100644 --- a/tc/m_mirred.c +++ b/tc/m_mirred.c @@ -213,8 +213,6 @@ parse_direction(const struct action_util *a, int *argc_p, char ***argv_p, if (d[0]) { int idx; - ll_init_map(&rth); - idx = ll_name_to_index(d); if (!idx) return nodev(d); diff --git a/tc/tc.c b/tc/tc.c index 0fc658c8..7d69e4d5 100644 --- a/tc/tc.c +++ b/tc/tc.c @@ -243,6 +243,7 @@ static int batch(const char *name) return -1; } + ll_init_map(&rth); ret = do_batch(name, force, tc_batch_cmd, NULL); rtnl_close(&rth); diff --git a/tc/tc_class.c b/tc/tc_class.c index ea6d986a..310514ce 100644 --- a/tc/tc_class.c +++ b/tc/tc_class.c @@ -136,11 +136,11 @@ static int tc_class_modify(int cmd, unsigned int flags, int argc, char **argv) } if (d[0]) { - ll_init_map(&rth); - req.t.tcm_ifindex = ll_name_to_index(d); if (!req.t.tcm_ifindex) return -nodev(d); + } else { + ll_init_map(&rth); } if (rtnl_talk(&rth, &req.n, NULL) < 0) @@ -436,8 +436,6 @@ static int tc_class_list(int argc, char **argv) argc--; argv++; } - ll_init_map(&rth); - if (d[0]) { t.tcm_ifindex = ll_name_to_index(d); if (!t.tcm_ifindex) diff --git a/tc/tc_filter.c b/tc/tc_filter.c index b1dcf1ba..7b504029 100644 --- a/tc/tc_filter.c +++ b/tc/tc_filter.c @@ -188,16 +188,17 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) addattr_l(&req.n, sizeof(req), TCA_KIND, k, strlen(k)+1); if (d[0]) { - ll_init_map(&rth); - req.t.tcm_ifindex = ll_name_to_index(d); if (req.t.tcm_ifindex == 0) { fprintf(stderr, "Cannot find device \"%s\"\n", d); return 1; } - } else if (block_index) { - req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK; - req.t.tcm_block_index = block_index; + } else { + ll_init_map(&rth); + if (block_index) { + req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK; + req.t.tcm_block_index = block_index; + } } if (q) { @@ -538,8 +539,6 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) } if (d[0]) { - ll_init_map(&rth); - req.t.tcm_ifindex = ll_name_to_index(d); if (!req.t.tcm_ifindex) return -nodev(d); @@ -703,21 +702,23 @@ static int tc_filter_list(int cmd, int argc, char **argv) req.t.tcm_info = TC_H_MAKE(prio<<16, protocol); - ll_init_map(&rth); - if (d[0]) { req.t.tcm_ifindex = ll_name_to_index(d); if (!req.t.tcm_ifindex) return -nodev(d); filter_ifindex = req.t.tcm_ifindex; - } else if (block_index) { - if (!tc_qdisc_block_exists(block_index)) { - fprintf(stderr, "Cannot find block \"%u\"\n", block_index); - return 1; + } else { + ll_init_map(&rth); + if (block_index) { + if (!tc_qdisc_block_exists(block_index)) { + fprintf(stderr, "Cannot find block \"%u\"\n", + block_index); + return 1; + } + req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK; + req.t.tcm_block_index = block_index; + filter_block_index = block_index; } - req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK; - req.t.tcm_block_index = block_index; - filter_block_index = block_index; } if (filter_chain_index_set) diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c index 634d5f70..b3c395b6 100644 --- a/tc/tc_qdisc.c +++ b/tc/tc_qdisc.c @@ -193,8 +193,6 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv) if (d[0]) { int idx; - ll_init_map(&rth); - idx = ll_name_to_index(d); if (!idx) return -nodev(d); @@ -410,13 +408,14 @@ static int tc_qdisc_list(int argc, char **argv) argc--; argv++; } - ll_init_map(&rth); if (d[0]) { req.t.tcm_ifindex = ll_name_to_index(d); if (!req.t.tcm_ifindex) return -nodev(d); filter_ifindex = req.t.tcm_ifindex; + } else { + ll_init_map(&rth); } if (dump_invisible) {