aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Rostedt (Google) <[email protected]>2024-02-22 16:14:17 -0500
committerSteven Rostedt (Google) <[email protected]>2024-03-18 10:32:57 -0400
commite8b737bfb16a0d540413173e8d1574e3bf8cc0e9 (patch)
tree8628e4a3dcf7e54564ceb4e487cbcb1cdbd3863b
parentc1fa617caeb005e7e3db60826cff6dddebb0363f (diff)
tracing: Do not calculate strlen() twice for __string() fields
The TRACE_EVENT() macro handles dynamic strings by having: TP_PROTO(struct some_struct *s), TP_ARGS(s), TP_STRUCT__entry( __string(my_string, s->string) ), TP_fast_assign( __assign_str(my_string, s->string); ) TP_printk("%s", __get_str(my_string)) There's even some code that may call a function helper to find the s->string value. The problem with the above is that the work to get the s->string is done twice. Once at the __string() and again in the __assign_str(). The length of the string is calculated via a strlen(), not once, but twice. Once during the __string() macro and again in __assign_str(). But the length is actually already recorded in the data location and here's no reason to call strlen() again. Just use the saved length that was saved in the __string() code for the __assign_str() code. Link: https://lore.kernel.org/linux-trace-kernel/[email protected] Cc: Masami Hiramatsu <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Mathieu Desnoyers <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Ville Syrjälä <[email protected]> Cc: Rodrigo Vivi <[email protected]> Cc: Chuck Lever <[email protected]> Signed-off-by: Steven Rostedt (Google) <[email protected]>
-rw-r--r--include/trace/stages/stage6_event_callback.h10
1 files changed, 6 insertions, 4 deletions
diff --git a/include/trace/stages/stage6_event_callback.h b/include/trace/stages/stage6_event_callback.h
index b3e2f321e787..c0e5d097324e 100644
--- a/include/trace/stages/stage6_event_callback.h
+++ b/include/trace/stages/stage6_event_callback.h
@@ -32,8 +32,9 @@
#undef __assign_str
#define __assign_str(dst, src) \
- strcpy(__get_str(dst), __data_offsets.dst##_ptr_ ? \
- __data_offsets.dst##_ptr_ : "(null)")
+ memcpy(__get_str(dst), __data_offsets.dst##_ptr_ ? \
+ __data_offsets.dst##_ptr_ : "(null)", \
+ __get_dynamic_array_len(dst))
#undef __assign_str_len
#define __assign_str_len(dst, src, len) \
@@ -94,8 +95,9 @@
#undef __assign_rel_str
#define __assign_rel_str(dst, src) \
- strcpy(__get_rel_str(dst), __data_offsets.dst##_ptr_ ? \
- __data_offsets.dst##_ptr_ : "(null)")
+ memcpy(__get_rel_str(dst), __data_offsets.dst##_ptr_ ? \
+ __data_offsets.dst##_ptr_ : "(null)", \
+ __get_rel_dynamic_array_len(dst))
#undef __assign_rel_str_len
#define __assign_rel_str_len(dst, src, len) \