* [PATCH net] rtnetlink: add RTEXT_FILTER_TERSE_DUMP support
@ 2026-05-07 17:45 Eric Dumazet
2026-05-07 17:46 ` Eric Dumazet
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Eric Dumazet @ 2026-05-07 17:45 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, Paolo Abeni
Cc: Simon Horman, David Ahern, Kuniyuki Iwashima, netdev,
eric.dumazet, Eric Dumazet
iproute2 can spend considerable amount of time in ll_init_map()
or ll_link_get() to dump verbose netdev attributes, contributing
to RTNL pressure.
Add RTEXT_FILTER_TERSE_DUMP new flag so that rtnl_fill_ifinfo()
limits its output to:
- struct nlmsghdr
- IFLA_IFNAME
- IFLA_PROP_LIST
We can later avoid using RTNL when RTEXT_FILTER_TERSE_DUMP
is requested, as none of these attributes need RTNL.
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
include/uapi/linux/rtnetlink.h | 1 +
net/core/rtnetlink.c | 31 ++++++++++++++++++++++---------
2 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h
index dab9493c791b8465c6476990f42c4ee5ae82da2d..4b1dbd554e5c72c90d2416f7ade37956ad5472b7 100644
--- a/include/uapi/linux/rtnetlink.h
+++ b/include/uapi/linux/rtnetlink.h
@@ -840,6 +840,7 @@ enum {
#define RTEXT_FILTER_CFM_CONFIG (1 << 5)
#define RTEXT_FILTER_CFM_STATUS (1 << 6)
#define RTEXT_FILTER_MST (1 << 7)
+#define RTEXT_FILTER_TERSE_DUMP (1 << 8)
/* End of information exported to user level */
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index b613bb6e07df6586aa06e7a59c8384dcedffeeef..7a9a769d142b6826d7fb01b599a4d9e0ae09a97d 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1295,7 +1295,12 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev,
size = NLMSG_ALIGN(sizeof(struct ifinfomsg))
+ nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */
- + nla_total_size(IFALIASZ) /* IFLA_IFALIAS */
+ + rtnl_prop_list_size(dev);
+
+ if (ext_filter_mask & RTEXT_FILTER_TERSE_DUMP)
+ return size;
+
+ size += nla_total_size(IFALIASZ) /* IFLA_IFALIAS */
+ nla_total_size(IFNAMSIZ) /* IFLA_QDISC */
+ nla_total_size_64bit(sizeof(struct rtnl_link_ifmap))
+ nla_total_size(MAX_ADDR_LEN) /* IFLA_ADDRESS */
@@ -1342,7 +1347,6 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev,
+ nla_total_size(4) /* IFLA_CARRIER_DOWN_COUNT */
+ nla_total_size(4) /* IFLA_MIN_MTU */
+ nla_total_size(4) /* IFLA_MAX_MTU */
- + rtnl_prop_list_size(dev)
+ nla_total_size(MAX_ADDR_LEN) /* IFLA_PERM_ADDRESS */
+ rtnl_devlink_port_size(dev)
+ rtnl_dpll_pin_size(dev)
@@ -1940,15 +1944,18 @@ static int rtnl_fill_alt_ifnames(struct sk_buff *skb,
struct netdev_name_node *name_node;
int count = 0;
+ rcu_read_lock();
list_for_each_entry_rcu(name_node, &dev->name_node->list, list) {
- if (nla_put_string(skb, IFLA_ALT_IFNAME, name_node->name))
+ if (nla_put_string(skb, IFLA_ALT_IFNAME, name_node->name)) {
+ rcu_read_unlock();
return -EMSGSIZE;
+ }
count++;
}
+ rcu_read_unlock();
return count;
}
-/* RCU protected. */
static int rtnl_fill_prop_list(struct sk_buff *skb,
const struct net_device *dev)
{
@@ -2071,13 +2078,20 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
ifm->ifi_flags = netif_get_flags(dev);
ifm->ifi_change = change;
- if (tgt_netnsid >= 0 && nla_put_s32(skb, IFLA_TARGET_NETNSID, tgt_netnsid))
- goto nla_put_failure;
-
netdev_copy_name(dev, devname);
if (nla_put_string(skb, IFLA_IFNAME, devname))
goto nla_put_failure;
+ if (rtnl_fill_prop_list(skb, dev))
+ goto nla_put_failure;
+
+ if (ext_filter_mask & RTEXT_FILTER_TERSE_DUMP)
+ goto end;
+
+ if (tgt_netnsid >= 0 &&
+ nla_put_s32(skb, IFLA_TARGET_NETNSID, tgt_netnsid))
+ goto nla_put_failure;
+
if (nla_put_u32(skb, IFLA_TXQLEN, READ_ONCE(dev->tx_queue_len)) ||
nla_put_u8(skb, IFLA_OPERSTATE,
netif_running(dev) ? READ_ONCE(dev->operstate) :
@@ -2190,8 +2204,6 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
goto nla_put_failure_rcu;
if (rtnl_fill_link_ifmap(skb, dev))
goto nla_put_failure_rcu;
- if (rtnl_fill_prop_list(skb, dev))
- goto nla_put_failure_rcu;
rcu_read_unlock();
if (dev->dev.parent &&
@@ -2210,6 +2222,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb,
if (rtnl_fill_dpll_pin(skb, dev))
goto nla_put_failure;
+end:
nlmsg_end(skb, nlh);
return 0;
--
2.54.0.563.g4f69b47b94-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH net] rtnetlink: add RTEXT_FILTER_TERSE_DUMP support
2026-05-07 17:45 [PATCH net] rtnetlink: add RTEXT_FILTER_TERSE_DUMP support Eric Dumazet
@ 2026-05-07 17:46 ` Eric Dumazet
2026-05-08 0:02 ` Kuniyuki Iwashima
2026-05-08 23:18 ` Jakub Kicinski
2 siblings, 0 replies; 5+ messages in thread
From: Eric Dumazet @ 2026-05-07 17:46 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, Paolo Abeni
Cc: Simon Horman, David Ahern, Kuniyuki Iwashima, netdev,
eric.dumazet
On Thu, May 7, 2026 at 10:45 AM Eric Dumazet <edumazet@google.com> wrote:
>
> iproute2 can spend considerable amount of time in ll_init_map()
> or ll_link_get() to dump verbose netdev attributes, contributing
> to RTNL pressure.
>
> Add RTEXT_FILTER_TERSE_DUMP new flag so that rtnl_fill_ifinfo()
> limits its output to:
>
> - struct nlmsghdr
> - IFLA_IFNAME
> - IFLA_PROP_LIST
>
> We can later avoid using RTNL when RTEXT_FILTER_TERSE_DUMP
> is requested, as none of these attributes need RTNL.
>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
Wrong patch title, this targets net-next tree (obviously).
Thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net] rtnetlink: add RTEXT_FILTER_TERSE_DUMP support
2026-05-07 17:45 [PATCH net] rtnetlink: add RTEXT_FILTER_TERSE_DUMP support Eric Dumazet
2026-05-07 17:46 ` Eric Dumazet
@ 2026-05-08 0:02 ` Kuniyuki Iwashima
2026-05-08 23:18 ` Jakub Kicinski
2 siblings, 0 replies; 5+ messages in thread
From: Kuniyuki Iwashima @ 2026-05-08 0:02 UTC (permalink / raw)
To: Eric Dumazet
Cc: David S . Miller, Jakub Kicinski, Paolo Abeni, Simon Horman,
David Ahern, netdev, eric.dumazet
On Thu, May 7, 2026 at 10:45 AM Eric Dumazet <edumazet@google.com> wrote:
>
> iproute2 can spend considerable amount of time in ll_init_map()
> or ll_link_get() to dump verbose netdev attributes, contributing
> to RTNL pressure.
>
> Add RTEXT_FILTER_TERSE_DUMP new flag so that rtnl_fill_ifinfo()
> limits its output to:
>
> - struct nlmsghdr
> - IFLA_IFNAME
> - IFLA_PROP_LIST
>
> We can later avoid using RTNL when RTEXT_FILTER_TERSE_DUMP
> is requested, as none of these attributes need RTNL.
>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net] rtnetlink: add RTEXT_FILTER_TERSE_DUMP support
2026-05-07 17:45 [PATCH net] rtnetlink: add RTEXT_FILTER_TERSE_DUMP support Eric Dumazet
2026-05-07 17:46 ` Eric Dumazet
2026-05-08 0:02 ` Kuniyuki Iwashima
@ 2026-05-08 23:18 ` Jakub Kicinski
2026-05-11 6:16 ` Eric Dumazet
2 siblings, 1 reply; 5+ messages in thread
From: Jakub Kicinski @ 2026-05-08 23:18 UTC (permalink / raw)
To: Eric Dumazet
Cc: David S . Miller, Paolo Abeni, Simon Horman, David Ahern,
Kuniyuki Iwashima, netdev, eric.dumazet
On Thu, 7 May 2026 17:45:47 +0000 Eric Dumazet wrote:
> We can later avoid using RTNL when RTEXT_FILTER_TERSE_DUMP
> is requested, as none of these attributes need RTNL.
Since this is uAPI I think we need a better name?
TERSE_DUMP doesn't explain much, my first thought was that you'll just
trim some ancient attributes to make things smaller. Sounds like you
want it to be lockless. Also GET will effectively support this bit
too so _DUMP is a lie.
Maybe RTEXT_FILTER_LOCKLESS or RTEXT_FILTER_NAME_ONLY ?
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net] rtnetlink: add RTEXT_FILTER_TERSE_DUMP support
2026-05-08 23:18 ` Jakub Kicinski
@ 2026-05-11 6:16 ` Eric Dumazet
0 siblings, 0 replies; 5+ messages in thread
From: Eric Dumazet @ 2026-05-11 6:16 UTC (permalink / raw)
To: Jakub Kicinski
Cc: David S . Miller, Paolo Abeni, Simon Horman, David Ahern,
Kuniyuki Iwashima, netdev, eric.dumazet
On Fri, May 8, 2026 at 4:18 PM Jakub Kicinski <kuba@kernel.org> wrote:
>
> On Thu, 7 May 2026 17:45:47 +0000 Eric Dumazet wrote:
> > We can later avoid using RTNL when RTEXT_FILTER_TERSE_DUMP
> > is requested, as none of these attributes need RTNL.
>
> Since this is uAPI I think we need a better name?
> TERSE_DUMP doesn't explain much, my first thought was that you'll just
> trim some ancient attributes to make things smaller. Sounds like you
> want it to be lockless. Also GET will effectively support this bit
> too so _DUMP is a lie.
>
> Maybe RTEXT_FILTER_LOCKLESS or RTEXT_FILTER_NAME_ONLY ?
SGTM, thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-05-11 6:16 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-07 17:45 [PATCH net] rtnetlink: add RTEXT_FILTER_TERSE_DUMP support Eric Dumazet
2026-05-07 17:46 ` Eric Dumazet
2026-05-08 0:02 ` Kuniyuki Iwashima
2026-05-08 23:18 ` Jakub Kicinski
2026-05-11 6:16 ` Eric Dumazet
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox