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