Re: [RFC/PATCH] perf: Add sizeof operator support

From: Jeremy Linton
Date: Fri Jun 17 2016 - 12:32:21 EST


Hi Steven,

On 06/17/2016 11:17 AM, Steven Rostedt wrote:
On Tue, 14 Jun 2016 11:38:32 -0500
Jeremy Linton <jeremy.linton@xxxxxxx> wrote:

There are a fair number of tracepoints in the kernel making
use of the sizeof operator. Allow perf to understand some of
those cases, and report a more informative error message for
the ones it cannot understand.

Signed-off-by: Jeremy Linton <jeremy.linton@xxxxxxx>
---

So this is as much a RFC as a patch because the use of sizeof
seems to extend to structures, pointers, etc that aren't easy
to deduce from userspace. I'm not sure what the correct solution
should be in those cases.

tools/lib/traceevent/event-parse.c | 46 ++++++++++++++++++++++++++++++++++++++

(trimming)

+
+ if (strcmp(token, "__u64") == 0) {
+ if (asprintf(&arg->atom.atom, "%zd", sizeof(__u64)) < 0)
+ goto out_free_atom;
+ } else if (strcmp(token, "__u32") == 0) {
+ if (asprintf(&arg->atom.atom, "%zd", sizeof(__u32)) < 0)
+ goto out_free_atom;

What events are doing sizeof(__u64) and sizeof(__u32)?

First, that's useless, as sizeof(__u64) will always be 8, and
sizeof(__u32) will always be 4.

What exactly is this fixing?

It starts to fix things like:

kmem:mm_page_alloc
Warning: [kmem:mm_page_alloc] function sizeof not defined

or:

# perf stat -e kvm:kvm_arm_set_regset -- true
Warning: [kvm:kvm_arm_set_regset] function sizeof not defined
Warning: Error: expected type 5 but read 0
*** Error in `perf': double free or corruption (fasttop): 0x00000000303f5930 ***

There is a RH bug about it (and the "~" operator, which has been fixed) here: https://bugzilla.redhat.com/show_bug.cgi?id=1298229

Thanks for taking a look at this,