[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <AE36F453-DEAE-432C-9CDA-0D2DA875CDA2@linux.dev>
Date: Wed, 23 Jul 2025 14:15:02 -0700
From: Thorsten Blum <thorsten.blum@...ux.dev>
To: Steven Rostedt <rostedt@...dmis.org>
Cc: Masami Hiramatsu <mhiramat@...nel.org>,
Mathieu Desnoyers <mathieu.desnoyers@...icios.com>,
Guillaume Nault <gnault@...hat.com>,
Paolo Abeni <pabeni@...hat.com>,
Ido Schimmel <idosch@...dia.com>,
Petr Machata <petrm@...dia.com>,
linux-kernel@...r.kernel.org,
linux-trace-kernel@...r.kernel.org
Subject: Re: [PATCH net-next] tracing: ipv6: Replace deprecated strcpy() with
strscpy()
On 23. Jul 2025, at 11:36, Steven Rostedt wrote:
> On Wed, 23 Jul 2025 10:46:12 -0700 Thorsten Blum wrote:
>
>> Your commit fca8300f68fe3 changed it from __dynamic_array() to __array()
>> and __string() seems to be just a special version of __dynamic_array()
>> with a length of -1.
>>
>> In the commit description you wrote: "Since the size of the name is at
>> most 16 bytes (defined by IFNAMSIZ), it is not worth spending the effort
>> to determine the size of the string."
>
> So the original had:
>
> __dynamic_array(char, name, IFNAMSIZ )
>
> Which is not dynamic at all. A dynamic_array (like __string) saves the
> size in meta data within the event. So basically the above is wasting
> bytes to save a fixed size. If you are going to use a dynamic array,
> might as well make it dynamic!
>
> I was doing various clean ups back then so I didn't look too deeply
> into this event when I made that change. I just saw the obvious waste
> of space in the ring buffer.
>
> Just to explain it in more detail. A dynamic_array has in the ring buffer:
>
> short offset;
> short len;
> [..]
> char name[len];
>
> That is, 4 bytes are used to know the size of the array and where in
> the event it is located. Thus the __dynamic_array() usage basically had:
>
> short offset;
> short len = IFNAMSIZ;
> [..]
> char name[IFNAMSIZ];
>
> Why have the offset and length? with just __array(char, name, IFNAMSIZ}
> it would be just:
>
> char name[IFNAMSIZ];
>
> See why I changed it?
>
> Now, the change I'm suggesting now would make the __string() be dynamic!
>
> short offset;
> short len = strlen(res->nh && res->nh->fib_nh_dev ? res->nh->fib_nh_dev->name : "-") + 1;
> [..]
> char name[len];
>
> As IFNAMSIZ is 16, and the above adds 4 bytes to the name, if the name
> is less than 7 bytes or less, you save memory on the ring buffer.
>
> 2 bytes: offset
> 2 bytes: len;
> 7 bytes + '\0'
>
> total: 12 bytes
>
> Note, if there's only one dynamic value, it is always at least 4 bytes aligned.
Thanks for the detailed explanation.
I think the better change would be this then:
diff --git a/include/trace/events/fib6.h b/include/trace/events/fib6.h
index 8d22b2e98d48..3f95df1fd155 100644
--- a/include/trace/events/fib6.h
+++ b/include/trace/events/fib6.h
@@ -32,8 +32,9 @@ TRACE_EVENT(fib6_table_lookup,
__field( u16, dport )
__field( u8, proto )
__field( u8, rt_type )
- __array( char, name, IFNAMSIZ )
- __array( __u8, gw, 16 )
+ __string( name, res->nh && res->nh->fib_nh_dev ?
+ res->nh->fib_nh_dev->name : "-" )
+ __array( __u8, gw, 16 )
),
TP_fast_assign(
@@ -64,11 +65,8 @@ TRACE_EVENT(fib6_table_lookup,
__entry->dport = 0;
}
- if (res->nh && res->nh->fib_nh_dev) {
- strscpy(__entry->name, res->nh->fib_nh_dev->name, IFNAMSIZ);
- } else {
- strcpy(__entry->name, "-");
- }
+ __assign_str(name);
+
if (res->f6i == net->ipv6.fib6_null_entry) {
in6 = (struct in6_addr *)__entry->gw;
*in6 = in6addr_any;
@@ -82,7 +80,7 @@ TRACE_EVENT(fib6_table_lookup,
__entry->tb_id, __entry->oif, __entry->iif, __entry->proto,
__entry->src, __entry->sport, __entry->dst, __entry->dport,
__entry->flowlabel, __entry->tos, __entry->scope,
- __entry->flags, __entry->name, __entry->gw, __entry->err)
+ __entry->flags, __get_str(name), __entry->gw, __entry->err)
);
#endif /* _TRACE_FIB6_H */
I'll submit a v2 if you agree that this is correct.
Thanks,
Thorsten
Powered by blists - more mailing lists