tracing: expose current->comm to [ku]probe events
Subsystems (2)
v2 cover tracing: expose current->comm to [ku]probe events
From: Omar Sandoval <[email protected]>
Hi,
Respinning with a few changes:
- Added patches 1 and 3 (document "string_size" type and make "string" default for $comm)
- Also support uprobe events
- Only allow "string" and "string_size" types
Patch 2, which actually introduces $comm, is pretty simple. Patch 3 is more intrusive, but without it, the default type for $comm is invalid, which is stupid.
This series applies to v4.7-rc1.
Thanks!
Omar Sandoval (3):
tracing: document "string_size" [ku]probe type
tracing: expose current->comm to [ku]probe events
tracing: make "string" the default type for [ku]probe event $comm
Documentation/trace/kprobetrace.txt | 15 +++-- Documentation/trace/uprobetracer.txt | 13 ++-- kernel/trace/trace_kprobe.c | 1 + kernel/trace/trace_probe.c | 123 ++++++++++++++++++++++++++--------- kernel/trace/trace_probe.h | 10 +++ 5 files changed, 123 insertions(+), 39 deletions(-)
Signature · 1 line
2.8.3
PATCH v2 1/3 tracing: document "string_size" [ku]probe type
From: Omar Sandoval <[email protected]>
It has been undocumented since it was introduced in commit e09c8614b329 ("tracing/kprobes: Support "string" type").
--- Documentation/trace/kprobetrace.txt | 11 ++++++----- Documentation/trace/uprobetracer.txt | 9 +++++---- 2 files changed, 11 insertions(+), 9 deletions(-)
Documentation/trace/kprobetrace.txt +6 -5
@@ -43,8 +43,8 @@ Synopsis of kprobe_events +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types - (u8/u16/u32/u64/s8/s16/s32/s64), "string" and bitfield - are supported. + (u8/u16/u32/u64/s8/s16/s32/s64), "string", "string_size", and + bitfield are supported. (*) only for return probe. (**) this is useful for fetching a field of data structures.
@@ -54,9 +54,10 @@ Types Several types are supported for fetch-args. Kprobe tracer will access memory by given type. Prefix 's' and 'u' means those types are signed and unsigned respectively. Traced arguments are shown in decimal (signed) or hex (unsigned). -String type is a special type, which fetches a "null-terminated" string from -kernel space. This means it will fail and store NULL if the string container -has been paged out. +"string" is a special type which fetches a null-terminated string from kernel +space. This means it will fail and store NULL if the string container has been +paged out. "string_size" is the length of a null-terminated string including +the NUL byte. Bitfield is another special type, which takes 3 parameters, bit-width, bit- offset, and container-size (usually 32). The syntax is;
Documentation/trace/uprobetracer.txt +5 -4
@@ -39,8 +39,8 @@ Synopsis of uprobe_tracer +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types - (u8/u16/u32/u64/s8/s16/s32/s64), "string" and bitfield - are supported. + (u8/u16/u32/u64/s8/s16/s32/s64), "string", + "string_size", and bitfield are supported. (*) only for return probe. (**) this is useful for fetching a field of data structures.
@@ -50,8 +50,9 @@ Types Several types are supported for fetch-args. Uprobe tracer will access memory by given type. Prefix 's' and 'u' means those types are signed and unsigned respectively. Traced arguments are shown in decimal (signed) or hex (unsigned). -String type is a special type, which fetches a "null-terminated" string from -user space. +"string" is a special type which fetches a null-terminated string from user +space. "string_size" is the length of a null-terminated string including the +NUL byte. Bitfield is another special type, which takes 3 parameters, bit-width, bit- offset, and container-size (usually 32). The syntax is;
Signature · 1 line
2.8.3
Masami Hiramatsu
maintainerRe: [PATCH v2 1/3] tracing: document "string_size" [ku]probe type
Quoted 4 lines · On Thu, 2 Jun 2016 18:11:01 -0700 Omar Sandoval <[email protected]> wrote:
From: Omar Sandoval <[email protected]>
It has been undocumented since it was introduced in commit
e09c8614b329("tracing/kprobes: Support "string" type").
Ah, actually, string_size is a support fetch function for string. So please ignore it. Or would you have any idea to use it?
Thank you,
Quoted 66 lines
Signed-off-by Omar Sandoval <[email protected]>--- Documentation/trace/kprobetrace.txt | 11 ++++++----- Documentation/trace/uprobetracer.txt | 9 +++++---- 2 files changed, 11 insertions(+), 9 deletions(-)Documentation/trace/kprobetrace.txt +6
-5@@ -43,8 +43,8 @@ Synopsis of kprobe_events +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types - (u8/u16/u32/u64/s8/s16/s32/s64), "string" and bitfield - are supported. + (u8/u16/u32/u64/s8/s16/s32/s64), "string", "string_size", and + bitfield are supported. (*) only for return probe. (**) this is useful for fetching a field of data structures.@@ -54,9 +54,10 @@ Types Several types are supported for fetch-args. Kprobe tracer will access memory by given type. Prefix 's' and 'u' means those types are signed and unsigned respectively. Traced arguments are shown in decimal (signed) or hex (unsigned). -String type is a special type, which fetches a "null-terminated" string from -kernel space. This means it will fail and store NULL if the string container -has been paged out. +"string" is a special type which fetches a null-terminated string from kernel +space. This means it will fail and store NULL if the string container has been +paged out. "string_size" is the length of a null-terminated string including +the NUL byte. Bitfield is another special type, which takes 3 parameters, bit-width, bit- offset, and container-size (usually 32). The syntax is;Documentation/trace/uprobetracer.txt +5
-4@@ -39,8 +39,8 @@ Synopsis of uprobe_tracer +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types - (u8/u16/u32/u64/s8/s16/s32/s64), "string" and bitfield - are supported. + (u8/u16/u32/u64/s8/s16/s32/s64), "string", + "string_size", and bitfield are supported. (*) only for return probe. (**) this is useful for fetching a field of data structures.@@ -50,8 +50,9 @@ Types Several types are supported for fetch-args. Uprobe tracer will access memory by given type. Prefix 's' and 'u' means those types are signed and unsigned respectively. Traced arguments are shown in decimal (signed) or hex (unsigned). -String type is a special type, which fetches a "null-terminated" string from -user space. +"string" is a special type which fetches a null-terminated string from user +space. "string_size" is the length of a null-terminated string including the +NUL byte. Bitfield is another special type, which takes 3 parameters, bit-width, bit- offset, and container-size (usually 32). The syntax is;Signature · 1 line
2.8.3
Signature · 1 line
Masami Hiramatsu <[email protected]>
PATCH v2 2/3 tracing: expose current->comm to [ku]probe events
In reply to Omar SandovalFrom: Omar Sandoval <[email protected]>
ftrace is very quick to give up on saving the task command line (see trace_save_cmdline()). The workaround for events which really care about the command line is to explicitly assign it as part of the entry. However, this doesn't work for kprobe events, as there's no straightforward way to get access to current->comm. Add a kprobe/uprobe event variable $comm which provides exactly that.
--- Documentation/trace/kprobetrace.txt | 4 ++++ Documentation/trace/uprobetracer.txt | 4 ++++ kernel/trace/trace_kprobe.c | 1 + kernel/trace/trace_probe.c | 27 +++++++++++++++++++++++++++ kernel/trace/trace_probe.h | 10 ++++++++++ 5 files changed, 46 insertions(+)
Documentation/trace/kprobetrace.txt +4 -0
@@ -40,6 +40,7 @@ Synopsis of kprobe_events $stackN : Fetch Nth entry of stack (N >= 0) $stack : Fetch stack address. $retval : Fetch return value.(*) + $comm : Fetch current task comm.(***) +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types
@@ -48,6 +49,7 @@ Synopsis of kprobe_events (*) only for return probe. (**) this is useful for fetching a field of data structures. + (***) you probably want this as a string, i.e., $comm:string Types -----
@@ -63,6 +65,8 @@ offset, and container-size (usually 32). The syntax is; b<bit-width>@<bit-offset>/<container-size> +For $comm, the type must be either "string" or "string_size". + Per-Probe Event Filtering -------------------------
Documentation/trace/uprobetracer.txt +4 -0
@@ -36,6 +36,7 @@ Synopsis of uprobe_tracer $stackN : Fetch Nth entry of stack (N >= 0) $stack : Fetch stack address. $retval : Fetch return value.(*) + $comm : Fetch current task comm.(***) +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types
@@ -44,6 +45,7 @@ Synopsis of uprobe_tracer (*) only for return probe. (**) this is useful for fetching a field of data structures. + (***) you probably want this as a string, i.e., $comm:string Types -----
@@ -58,6 +60,8 @@ offset, and container-size (usually 32). The syntax is; b<bit-width>@<bit-offset>/<container-size> +For $comm, the type must be either "string" or "string_size". + Event Profiling ---------------
kernel/trace/trace_kprobe.c +1 -0
@@ -587,6 +587,7 @@ static int create_trace_kprobe(int argc, char **argv)* $retval : fetch return value * $stack : fetch stack address * $stackN : fetch Nth of stack (N:0-) +* $comm : fetch current task comm * @ADDR : fetch memory at ADDR (ADDR should be in kernel) * @SYM[+|-offs] : fetch memory at SYM +|- offs (SYM is a data symbol) * %REG : fetch register REG
kernel/trace/trace_probe.c +27 -0
@@ -218,6 +218,28 @@ free_bitfield_fetch_param(struct bitfield_fetch_param *data)kfree (data); } +void FETCH_FUNC_NAME (comm ,string )(struct pt_regs *regs, +void *data,void *dest) +{ +int maxlen =get_rloc_len (*(u32 *)dest); +u8 *dst =get_rloc_data (dest); +long ret; + +if (!maxlen) +return ; + + ret =strlcpy (dst, current->comm, maxlen); + *(u32 *)dest =make_data_rloc (ret,get_rloc_offs (*(u32 *)dest)); +} +NOKPROBE_SYMBOL (FETCH_FUNC_NAME (comm, string)); + +void FETCH_FUNC_NAME (comm ,string_size )(struct pt_regs *regs, +void *data,void *dest) +{ + *(u32 *)dest =strlen (current->comm) +1 ; +} +NOKPROBE_SYMBOL (FETCH_FUNC_NAME (comm, string_size)); +static const struct fetch_type *find_fetch_type (const char *type,const struct fetch_type *ftbl) {
@@ -348,6 +370,11 @@ static int parse_probe_vars(char *arg, const struct fetch_type *t, } }else ret = -EINVAL ; + }else if (strcmp (arg,"comm" ) ==0 ) { +if (strcmp (t->name,"string" ) !=0 && +strcmp (t->name,"string_size" ) !=0 ) +return -EINVAL ; + f->fn = t->fetch[FETCH_MTD_comm]; }else ret = -EINVAL ;
kernel/trace/trace_probe.h +10 -0
@@ -102,6 +102,7 @@ enum { FETCH_MTD_reg =0 , FETCH_MTD_stack, FETCH_MTD_retval, + FETCH_MTD_comm, FETCH_MTD_memory, FETCH_MTD_symbol, FETCH_MTD_deref,
@@ -183,6 +184,14 @@ DECLARE_BASIC_FETCH_FUNCS(bitfield);#define fetch_bitfield_string NULL#define fetch_bitfield_string_size NULL +/* comm only makes sense as a string */ +#define fetch_comm_u8 NULL +#define fetch_comm_u16 NULL +#define fetch_comm_u32 NULL +#define fetch_comm_u64 NULL +DECLARE_FETCH_FUNC (comm, string); +DECLARE_FETCH_FUNC (comm, string_size); +/* * Define macro for basic types - we don't need to define s* types, because * we have to care only about bitwidth at recording time.
@@ -213,6 +222,7 @@ DEFINE_FETCH_##method(u64)ASSIGN_FETCH_FUNC (reg, ftype), \ASSIGN_FETCH_FUNC (stack, ftype), \ASSIGN_FETCH_FUNC (retval, ftype), \ +ASSIGN_FETCH_FUNC (comm, ftype), \ASSIGN_FETCH_FUNC (memory, ftype), \ASSIGN_FETCH_FUNC (symbol, ftype), \ ASSIGN_FETCH_FUNC(deref, ftype), \
Signature · 1 line
2.8.3
Quoted 39 lines · On Thu, 2 Jun 2016 18:11:02 -0700 Omar Sandoval <[email protected]> wrote:
From: Omar Sandoval <[email protected]>
ftrace is very quick to give up on saving the task command line (see
trace_save_cmdline()). The workaround for events which really care about the command line is to explicitly assign it as part of the entry. However, this doesn't work for kprobe events, as there's no straightforward way to get access tocurrent->comm. Add a kprobe/uprobe event variable $comm which provides exactly that.Signed-off-by Omar Sandoval <[email protected]>--- Documentation/trace/kprobetrace.txt | 4 ++++ Documentation/trace/uprobetracer.txt | 4 ++++ kernel/trace/trace_kprobe.c | 1 + kernel/trace/trace_probe.c | 27 +++++++++++++++++++++++++++ kernel/trace/trace_probe.h | 10 ++++++++++ 5 files changed, 46 insertions(+)Documentation/trace/kprobetrace.txt +2
-0@@ -40,6 +40,7 @@ Synopsis of kprobe_events $stackN : Fetch Nth entry of stack (N >= 0) $stack : Fetch stack address. $retval : Fetch return value.(*) + $comm : Fetch current task comm.(***) +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types@@ -48,6 +49,7 @@ Synopsis of kprobe_events (*) only for return probe. (**) this is useful for fetching a field of data structures. + (***) you probably want this as a string, i.e., $comm:string Types -----
Documentation/trace/kprobetrace.txt offset, and container-size (usually 32). The syntax is; · line 68
Quoted 4 lines
Documentation/trace/kprobetrace.txt +1
-0@@ -63,6 +65,8 @@ offset, and container-size (usually 32). The syntax is; b<bit-width>@<bit-offset>/<container-size> +For $comm, the type must be either "string" or "string_size".
Please remove string_size, which is an internal type.
Quoted 17 lines
Documentation/trace/kprobetrace.txt +1
-0+ Per-Probe Event Filtering -------------------------Documentation/trace/uprobetracer.txt +1
-0@@ -36,6 +36,7 @@ Synopsis of uprobe_tracer $stackN : Fetch Nth entry of stack (N >= 0) $stack : Fetch stack address. $retval : Fetch return value.(*) + $comm : Fetch current task comm.(***) +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types
Documentation/trace/uprobetracer.txt Synopsis of uprobe_tracer · line 48
Quoted 4 lines
Documentation/trace/uprobetracer.txt +1
-0@@ -44,6 +45,7 @@ Synopsis of uprobe_tracer (*) only for return probe. (**) this is useful for fetching a field of data structures. + (***) you probably want this as a string, i.e., $comm:string
Ditto.
Other part looks OK for me :)
Thank you,
Quoted 107 lines
Documentation/trace/uprobetracer.txt +2
-0Types -----@@ -58,6 +60,8 @@ offset, and container-size (usually 32). The syntax is; b<bit-width>@<bit-offset>/<container-size> +For $comm, the type must be either "string" or "string_size". + Event Profiling ---------------kernel/trace/trace_kprobe.c +1
-0@@ -587,6 +587,7 @@ static int create_trace_kprobe(int argc, char **argv)* $retval : fetch return value * $stack : fetch stack address * $stackN : fetch Nth of stack (N:0-) +* $comm : fetch current task comm * @ADDR : fetch memory at ADDR (ADDR should be in kernel) * @SYM[+|-offs] : fetch memory at SYM +|- offs (SYM is a data symbol) * %REG : fetch register REG kernel/trace/trace_probe.c +27
-0@@ -218,6 +218,28 @@ free_bitfield_fetch_param(struct bitfield_fetch_param *data)kfree (data); } +void FETCH_FUNC_NAME (comm ,string )(struct pt_regs *regs, +void *data,void *dest) +{ +int maxlen =get_rloc_len (*(u32 *)dest); +u8 *dst =get_rloc_data (dest); +long ret; + +if (!maxlen) +return ; + + ret =strlcpy (dst, current->comm, maxlen); + *(u32 *)dest =make_data_rloc (ret,get_rloc_offs (*(u32 *)dest)); +} +NOKPROBE_SYMBOL (FETCH_FUNC_NAME (comm, string)); + +void FETCH_FUNC_NAME (comm ,string_size )(struct pt_regs *regs, +void *data,void *dest) +{ + *(u32 *)dest =strlen (current->comm) +1 ; +} +NOKPROBE_SYMBOL (FETCH_FUNC_NAME (comm, string_size)); +static const struct fetch_type *find_fetch_type (const char *type,const struct fetch_type *ftbl) {@@ -348,6 +370,11 @@ static int parse_probe_vars(char *arg, const struct fetch_type *t, } }else ret = -EINVAL ; + }else if (strcmp (arg,"comm" ) ==0 ) { +if (strcmp (t->name,"string" ) !=0 && +strcmp (t->name,"string_size" ) !=0 ) +return -EINVAL ; + f->fn = t->fetch[FETCH_MTD_comm]; }else ret = -EINVAL ;kernel/trace/trace_probe.h +10
-0@@ -102,6 +102,7 @@ enum { FETCH_MTD_reg =0 , FETCH_MTD_stack, FETCH_MTD_retval, + FETCH_MTD_comm, FETCH_MTD_memory, FETCH_MTD_symbol, FETCH_MTD_deref,@@ -183,6 +184,14 @@ DECLARE_BASIC_FETCH_FUNCS(bitfield);#define fetch_bitfield_string NULL#define fetch_bitfield_string_size NULL +/* comm only makes sense as a string */ +#define fetch_comm_u8 NULL +#define fetch_comm_u16 NULL +#define fetch_comm_u32 NULL +#define fetch_comm_u64 NULL +DECLARE_FETCH_FUNC (comm, string); +DECLARE_FETCH_FUNC (comm, string_size); +/* * Define macro for basic types - we don't need to define s* types, because * we have to care only about bitwidth at recording time. @@ -213,6 +222,7 @@ DEFINE_FETCH_##method(u64)ASSIGN_FETCH_FUNC (reg, ftype), \ASSIGN_FETCH_FUNC (stack, ftype), \ASSIGN_FETCH_FUNC (retval, ftype), \ +ASSIGN_FETCH_FUNC (comm, ftype), \ASSIGN_FETCH_FUNC (memory, ftype), \ASSIGN_FETCH_FUNC (symbol, ftype), \ ASSIGN_FETCH_FUNC(deref, ftype), \Signature · 1 line
2.8.3
Signature · 1 line
Masami Hiramatsu <[email protected]>
Hello,
Quoted 5 lines · Masami Hiramatsu
Quoted 2 lines · On Thu, 2 Jun 2016 18:11:02 -0700 Omar Sandoval <[email protected]> wrote:
From: Omar Sandoval <[email protected]>
Quoted 7 lines
Quoted 7 lines
ftrace is very quick to give up on saving the task command line (see
trace_save_cmdline()). The workaround for events which really care about the command line is to explicitly assign it as part of the entry. However, this doesn't work for kprobe events, as there's no straightforward way to get access tocurrent->comm. Add a kprobe/uprobe event variable $comm which provides exactly that.
Same opinion with Masami; The string_size itself seems not useful IMHO. Also you can increase 'saved_cmdlines_size' in the tracefs.
Thanks,
Namhyung
Quoted 177 lines
Quoted 30 lines
Signed-off-by Omar Sandoval <[email protected]>--- Documentation/trace/kprobetrace.txt | 4 ++++ Documentation/trace/uprobetracer.txt | 4 ++++ kernel/trace/trace_kprobe.c | 1 + kernel/trace/trace_probe.c | 27 +++++++++++++++++++++++++++ kernel/trace/trace_probe.h | 10 ++++++++++ 5 files changed, 46 insertions(+)Documentation/trace/kprobetrace.txt +2
-0@@ -40,6 +40,7 @@ Synopsis of kprobe_events $stackN : Fetch Nth entry of stack (N >= 0) $stack : Fetch stack address. $retval : Fetch return value.(*) + $comm : Fetch current task comm.(***) +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types@@ -48,6 +49,7 @@ Synopsis of kprobe_events (*) only for return probe. (**) this is useful for fetching a field of data structures. + (***) you probably want this as a string, i.e., $comm:string Types -----Documentation/trace/kprobetrace.txt offset, and container-size (usually 32). The syntax is; · line 68
Quoted 4 lines
Documentation/trace/kprobetrace.txt +1
-0@@ -63,6 +65,8 @@ offset, and container-size (usually 32). The syntax is; b<bit-width>@<bit-offset>/<container-size> +For $comm, the type must be either "string" or "string_size".Please remove
string_size, which is an internal type.Quoted 17 lines
Documentation/trace/kprobetrace.txt +1
-0+ Per-Probe Event Filtering -------------------------Documentation/trace/uprobetracer.txt +1
-0@@ -36,6 +36,7 @@ Synopsis of uprobe_tracer $stackN : Fetch Nth entry of stack (N >= 0) $stack : Fetch stack address. $retval : Fetch return value.(*) + $comm : Fetch current task comm.(***) +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic typesDocumentation/trace/uprobetracer.txt Synopsis of uprobe_tracer · line 48
Quoted 4 lines
Documentation/trace/uprobetracer.txt +1
-0@@ -44,6 +45,7 @@ Synopsis of uprobe_tracer (*) only for return probe. (**) this is useful for fetching a field of data structures. + (***) you probably want this as a string, i.e., $comm:stringDitto.
Other part looks OK for me :)
Acked-by Masami Hiramatsu <[email protected]>Quoted 107 lines
Documentation/trace/uprobetracer.txt +2
-0Types -----@@ -58,6 +60,8 @@ offset, and container-size (usually 32). The syntax is; b<bit-width>@<bit-offset>/<container-size> +For $comm, the type must be either "string" or "string_size". + Event Profiling ---------------kernel/trace/trace_kprobe.c +1
-0@@ -587,6 +587,7 @@ static int create_trace_kprobe(int argc, char **argv)* $retval : fetch return value * $stack : fetch stack address * $stackN : fetch Nth of stack (N:0-) +* $comm : fetch current task comm * @ADDR : fetch memory at ADDR (ADDR should be in kernel) * @SYM[+|-offs] : fetch memory at SYM +|- offs (SYM is a data symbol) * %REG : fetch register REG kernel/trace/trace_probe.c +27
-0@@ -218,6 +218,28 @@ free_bitfield_fetch_param(struct bitfield_fetch_param *data)kfree (data); } +void FETCH_FUNC_NAME (comm ,string )(struct pt_regs *regs, +void *data,void *dest) +{ +int maxlen =get_rloc_len (*(u32 *)dest); +u8 *dst =get_rloc_data (dest); +long ret; + +if (!maxlen) +return ; + + ret =strlcpy (dst, current->comm, maxlen); + *(u32 *)dest =make_data_rloc (ret,get_rloc_offs (*(u32 *)dest)); +} +NOKPROBE_SYMBOL (FETCH_FUNC_NAME (comm, string)); + +void FETCH_FUNC_NAME (comm ,string_size )(struct pt_regs *regs, +void *data,void *dest) +{ + *(u32 *)dest =strlen (current->comm) +1 ; +} +NOKPROBE_SYMBOL (FETCH_FUNC_NAME (comm, string_size)); +static const struct fetch_type *find_fetch_type (const char *type,const struct fetch_type *ftbl) {@@ -348,6 +370,11 @@ static int parse_probe_vars(char *arg, const struct fetch_type *t, } }else ret = -EINVAL ; + }else if (strcmp (arg,"comm" ) ==0 ) { +if (strcmp (t->name,"string" ) !=0 && +strcmp (t->name,"string_size" ) !=0 ) +return -EINVAL ; + f->fn = t->fetch[FETCH_MTD_comm]; }else ret = -EINVAL ;kernel/trace/trace_probe.h +10
-0@@ -102,6 +102,7 @@ enum { FETCH_MTD_reg =0 , FETCH_MTD_stack, FETCH_MTD_retval, + FETCH_MTD_comm, FETCH_MTD_memory, FETCH_MTD_symbol, FETCH_MTD_deref,@@ -183,6 +184,14 @@ DECLARE_BASIC_FETCH_FUNCS(bitfield);#define fetch_bitfield_string NULL#define fetch_bitfield_string_size NULL +/* comm only makes sense as a string */ +#define fetch_comm_u8 NULL +#define fetch_comm_u16 NULL +#define fetch_comm_u32 NULL +#define fetch_comm_u64 NULL +DECLARE_FETCH_FUNC (comm, string); +DECLARE_FETCH_FUNC (comm, string_size); +/* * Define macro for basic types - we don't need to define s* types, because * we have to care only about bitwidth at recording time. @@ -213,6 +222,7 @@ DEFINE_FETCH_##method(u64)ASSIGN_FETCH_FUNC (reg, ftype), \ASSIGN_FETCH_FUNC (stack, ftype), \ASSIGN_FETCH_FUNC (retval, ftype), \ +ASSIGN_FETCH_FUNC (comm, ftype), \ASSIGN_FETCH_FUNC (memory, ftype), \ASSIGN_FETCH_FUNC (symbol, ftype), \ ASSIGN_FETCH_FUNC(deref, ftype), \Signature · 1 line
2.8.3Signature · 1 line
Masami Hiramatsu <[email protected]>
PATCH v2 3/3 tracing: make "string" the default type for [ku]probe event $comm
In reply to Omar SandovalFrom: Omar Sandoval <[email protected]>
You'd only ever want $comm as a string, but the default is still u64. Push the type parsing later so we can decide based on the actual fetcharg and make "string" the default for $comm.
--- Documentation/trace/kprobetrace.txt | 6 +-- Documentation/trace/uprobetracer.txt | 6 +-- kernel/trace/trace_probe.c | 102 +++++++++++++++++++++++------------ 3 files changed, 75 insertions(+), 39 deletions(-)
Documentation/trace/kprobetrace.txt +3 -3
@@ -40,7 +40,7 @@ Synopsis of kprobe_events $stackN : Fetch Nth entry of stack (N >= 0) $stack : Fetch stack address. $retval : Fetch return value.(*) - $comm : Fetch current task comm.(***) + $comm : Fetch current task comm. +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types
@@ -49,7 +49,6 @@ Synopsis of kprobe_events (*) only for return probe. (**) this is useful for fetching a field of data structures. - (***) you probably want this as a string, i.e., $comm:string Types -----
@@ -65,7 +64,8 @@ offset, and container-size (usually 32). The syntax is; b<bit-width>@<bit-offset>/<container-size> -For $comm, the type must be either "string" or "string_size". +For $comm, the type must be either "string" or "string_size". The default is +"string". Per-Probe Event Filtering
Documentation/trace/uprobetracer.txt +3 -3
@@ -36,7 +36,7 @@ Synopsis of uprobe_tracer $stackN : Fetch Nth entry of stack (N >= 0) $stack : Fetch stack address. $retval : Fetch return value.(*) - $comm : Fetch current task comm.(***) + $comm : Fetch current task comm. +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types
@@ -45,7 +45,6 @@ Synopsis of uprobe_tracer (*) only for return probe. (**) this is useful for fetching a field of data structures. - (***) you probably want this as a string, i.e., $comm:string Types -----
@@ -60,7 +59,8 @@ offset, and container-size (usually 32). The syntax is; b<bit-width>@<bit-offset>/<container-size> -For $comm, the type must be either "string" or "string_size". +For $comm, the type must be either "string" or "string_size". The default is +"string". Event Profiling
kernel/trace/trace_probe.c +69 -33
210 lines not on this page · raw message
Signature · 1 line
2.8.3
Masami Hiramatsu
maintainerRe: [PATCH v2 3/3] tracing: make "string" the default type for [ku]probe event $comm
Quoted 5 lines · On Thu, 2 Jun 2016 18:11:03 -0700 Omar Sandoval <[email protected]> wrote:
From: Omar Sandoval <[email protected]>
You'd only ever want $comm as a string, but the default is still u64. Push the type parsing later so we can decide based on the actual fetcharg and make "string" the default for $comm.
Hmm, at this moment, I'd rather like a small hack in traceprobe_parse_probe_arg() as like below:
kernel/trace/trace_probe.c +6 -0
@@ -522,6 +522,12 @@ int traceprobe_parse_probe_arg(char *arg, ssize_t *size, arg[t - parg->comm] ='\0' ; t++; } +/* +* The default type of "$comm" should be a string, and it must not +* be dereferred +*/ +if (!t &&strcmp ("$comm" , arg)) + t ="string" ; parg->type =find_fetch_type (t, ftbl);if (!parg->type) {pr_info ("Unsupported type: %s\n" , t);
This is not general, but easy to review :)
Thank you,
Signature · 1 line
Masami Hiramatsu <[email protected]>
Re: [PATCH v2 3/3] tracing: make "string" the default type for [ku]probe event $comm
Quoted 28 lines · Masami Hiramatsu
Quoted 5 lines · On Thu, 2 Jun 2016 18:11:03 -0700 Omar Sandoval <[email protected]> wrote:
From: Omar Sandoval <[email protected]>
You'd only ever want $comm as a string, but the default is still u64. Push the type parsing later so we can decide based on the actual fetcharg and make "string" the default for $comm.
Hmm, at this moment, I'd rather like a small hack in
traceprobe_parse_probe_arg()as like below:kernel/trace/trace_probe.c +6
-0@@ -522,6 +522,12 @@ int traceprobe_parse_probe_arg(char *arg, ssize_t *size, arg[t - parg->comm] ='\0' ; t++; } +/* +* The default type of "$comm" should be a string, and it must not +* be dereferred +*/ +if (!t &&strcmp ("$comm" , arg)) + t ="string" ; parg->type =find_fetch_type (t, ftbl);if (!parg->type) {pr_info ("Unsupported type: %s\n" , t);
Quoted 1 line
This is not general, but easy to review :)
+1
Thanks,
Namhyung
Steven Rostedt
maintainerRe: [PATCH v2 3/3] tracing: make "string" the default type for [ku]probe event $comm
Quoted 3 lines · On Tue, 7 Jun 2016 22:41:33 +0900 Namhyung Kim <[email protected]> wrote:
Quoted 1 line
This is not general, but easy to review :)
+1
I'll wait for v3 then :-)
-- Steve