On 3/22/18 11:11 AM, Steven Rostedt wrote:
On Thu, 22 Mar 2018 11:01:48 -0700 Alexei Starovoitov <[email protected]> wrote:From: Alexei Starovoitov <[email protected]> Fix all tracepoint arguments to pass structures (large and small) by reference instead of by value. Avoiding passing large structs by value is a good coding style. Passing small structs sometimes is beneficial, but in all cases it makes no difference vs readability of the code. The subsequent patch enforces that all tracepoints args are either integers or pointers and fit into 64-bit.But some of these structures are used to force type checking, and are just the same size as a number. That's why they don't have "struct" in front of them. Like pmd_t. Will the subsequent patches really break if the structure itself has one element that is of size long? Just seems to add extra code to pass in an address to something that fits into a single register.
yeah. C doesn't allow casting of 'struct s { u64 var };' into u64
without massive hacks and aliasing warnings by compiler.
CAST_TO_U64 macro in patch 7 will prevent tracepoint arguments to be
things like pmd_t. It's not perfect, but doing & of pmd_t variable
is imo clean enough as you can see in this patch.
The macro can be tweaked to do the cast like
*(sizeof(typeof(arg))*)&arg,
but there is no way to get rid of compiler warning.
