From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1761225Ab3LIPMh (ORCPT ); Mon, 9 Dec 2013 10:12:37 -0500 Received: from mail7.hitachi.co.jp ([133.145.228.42]:53930 "EHLO mail7.hitachi.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760719Ab3LIPMd (ORCPT ); Mon, 9 Dec 2013 10:12:33 -0500 Message-ID: <52A5DDD8.4030007@hitachi.com> Date: Tue, 10 Dec 2013 00:12:24 +0900 From: Masami Hiramatsu Organization: Hitachi, Ltd., Japan User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:13.0) Gecko/20120614 Thunderbird/13.0.1 MIME-Version: 1.0 To: Namhyung Kim Cc: Steven Rostedt , Oleg Nesterov , Srikar Dronamraju , Hyeoncheol Lee , "zhangwei(Jovi)" , Arnaldo Carvalho de Melo , Hemant Kumar , LKML , Namhyung Kim Subject: Re: [PATCH 07/17] tracing/probes: Move fetch function helpers to trace_probe.h References: <1386570005-3368-1-git-send-email-namhyung@kernel.org> <1386570005-3368-8-git-send-email-namhyung@kernel.org> In-Reply-To: <1386570005-3368-8-git-send-email-namhyung@kernel.org> Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org (2013/12/09 15:19), Namhyung Kim wrote: > From: Namhyung Kim > > Move fetch function helper macros/functions to the header file and > make them external. This is preparation of supporting uprobe fetch > table in next patch. > > Cc: Masami Hiramatsu > Cc: Srikar Dronamraju > Cc: Oleg Nesterov > Cc: zhangwei(Jovi) > Cc: Arnaldo Carvalho de Melo > Signed-off-by: Namhyung Kim This looks OK for me. Acked-by: Masami Hiramatsu Thanks! > --- > kernel/trace/trace_probe.c | 74 ++++++++-------------------------------------- > kernel/trace/trace_probe.h | 64 +++++++++++++++++++++++++++++++++++++++ > 2 files changed, 77 insertions(+), 61 deletions(-) > > diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c > index d8347b01ce89..c26bc9eaa2ac 100644 > --- a/kernel/trace/trace_probe.c > +++ b/kernel/trace/trace_probe.c > @@ -35,19 +35,15 @@ const char *reserved_field_names[] = { > FIELD_STRING_FUNC, > }; > > -/* Printing function type */ > -#define PRINT_TYPE_FUNC_NAME(type) print_type_##type > -#define PRINT_TYPE_FMT_NAME(type) print_type_format_##type > - > /* Printing in basic type function template */ > #define DEFINE_BASIC_PRINT_TYPE_FUNC(type, fmt) \ > -static __kprobes int PRINT_TYPE_FUNC_NAME(type)(struct trace_seq *s, \ > +__kprobes int PRINT_TYPE_FUNC_NAME(type)(struct trace_seq *s, \ > const char *name, \ > void *data, void *ent) \ > { \ > return trace_seq_printf(s, " %s=" fmt, name, *(type *)data); \ > } \ > -static const char PRINT_TYPE_FMT_NAME(type)[] = fmt; > +const char PRINT_TYPE_FMT_NAME(type)[] = fmt; > > DEFINE_BASIC_PRINT_TYPE_FUNC(u8 , "0x%x") > DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "0x%x") > @@ -58,23 +54,12 @@ DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d") > DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%d") > DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%Ld") > > -static inline void *get_rloc_data(u32 *dl) > -{ > - return (u8 *)dl + get_rloc_offs(*dl); > -} > - > -/* For data_loc conversion */ > -static inline void *get_loc_data(u32 *dl, void *ent) > -{ > - return (u8 *)ent + get_rloc_offs(*dl); > -} > - > /* For defining macros, define string/string_size types */ > typedef u32 string; > typedef u32 string_size; > > /* Print type function for string type */ > -static __kprobes int PRINT_TYPE_FUNC_NAME(string)(struct trace_seq *s, > +__kprobes int PRINT_TYPE_FUNC_NAME(string)(struct trace_seq *s, > const char *name, > void *data, void *ent) > { > @@ -87,7 +72,7 @@ static __kprobes int PRINT_TYPE_FUNC_NAME(string)(struct trace_seq *s, > (const char *)get_loc_data(data, ent)); > } > > -static const char PRINT_TYPE_FMT_NAME(string)[] = "\\\"%s\\\""; > +const char PRINT_TYPE_FMT_NAME(string)[] = "\\\"%s\\\""; > > #define FETCH_FUNC_NAME(method, type) fetch_##method##_##type > /* > @@ -111,7 +96,7 @@ DEFINE_FETCH_##method(u64) > > /* Data fetch function templates */ > #define DEFINE_FETCH_reg(type) \ > -static __kprobes void FETCH_FUNC_NAME(reg, type)(struct pt_regs *regs, \ > +__kprobes void FETCH_FUNC_NAME(reg, type)(struct pt_regs *regs, \ > void *offset, void *dest) \ > { \ > *(type *)dest = (type)regs_get_register(regs, \ > @@ -123,7 +108,7 @@ DEFINE_BASIC_FETCH_FUNCS(reg) > #define fetch_reg_string_size NULL > > #define DEFINE_FETCH_stack(type) \ > -static __kprobes void FETCH_FUNC_NAME(stack, type)(struct pt_regs *regs,\ > +__kprobes void FETCH_FUNC_NAME(stack, type)(struct pt_regs *regs, \ > void *offset, void *dest) \ > { \ > *(type *)dest = (type)regs_get_kernel_stack_nth(regs, \ > @@ -135,7 +120,7 @@ DEFINE_BASIC_FETCH_FUNCS(stack) > #define fetch_stack_string_size NULL > > #define DEFINE_FETCH_retval(type) \ > -static __kprobes void FETCH_FUNC_NAME(retval, type)(struct pt_regs *regs,\ > +__kprobes void FETCH_FUNC_NAME(retval, type)(struct pt_regs *regs, \ > void *dummy, void *dest) \ > { \ > *(type *)dest = (type)regs_return_value(regs); \ > @@ -146,7 +131,7 @@ DEFINE_BASIC_FETCH_FUNCS(retval) > #define fetch_retval_string_size NULL > > #define DEFINE_FETCH_memory(type) \ > -static __kprobes void FETCH_FUNC_NAME(memory, type)(struct pt_regs *regs,\ > +__kprobes void FETCH_FUNC_NAME(memory, type)(struct pt_regs *regs, \ > void *addr, void *dest) \ > { \ > type retval; \ > @@ -160,7 +145,7 @@ DEFINE_BASIC_FETCH_FUNCS(memory) > * Fetch a null-terminated string. Caller MUST set *(u32 *)dest with max > * length and relative data location. > */ > -static __kprobes void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs, > +__kprobes void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs, > void *addr, void *dest) > { > long ret; > @@ -197,7 +182,7 @@ static __kprobes void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs, > } > > /* Return the length of string -- including null terminal byte */ > -static __kprobes void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs, > +__kprobes void FETCH_FUNC_NAME(memory, string_size)(struct pt_regs *regs, > void *addr, void *dest) > { > mm_segment_t old_fs; > @@ -268,7 +253,7 @@ static struct symbol_cache *alloc_symbol_cache(const char *sym, long offset) > } > > #define DEFINE_FETCH_symbol(type) \ > -static __kprobes void FETCH_FUNC_NAME(symbol, type)(struct pt_regs *regs,\ > +__kprobes void FETCH_FUNC_NAME(symbol, type)(struct pt_regs *regs, \ > void *data, void *dest) \ > { \ > struct symbol_cache *sc = data; \ > @@ -288,7 +273,7 @@ struct deref_fetch_param { > }; > > #define DEFINE_FETCH_deref(type) \ > -static __kprobes void FETCH_FUNC_NAME(deref, type)(struct pt_regs *regs,\ > +__kprobes void FETCH_FUNC_NAME(deref, type)(struct pt_regs *regs, \ > void *data, void *dest) \ > { \ > struct deref_fetch_param *dprm = data; \ > @@ -329,7 +314,7 @@ struct bitfield_fetch_param { > }; > > #define DEFINE_FETCH_bitfield(type) \ > -static __kprobes void FETCH_FUNC_NAME(bitfield, type)(struct pt_regs *regs,\ > +__kprobes void FETCH_FUNC_NAME(bitfield, type)(struct pt_regs *regs, \ > void *data, void *dest) \ > { \ > struct bitfield_fetch_param *bprm = data; \ > @@ -374,39 +359,6 @@ free_bitfield_fetch_param(struct bitfield_fetch_param *data) > kfree(data); > } > > -/* Default (unsigned long) fetch type */ > -#define __DEFAULT_FETCH_TYPE(t) u##t > -#define _DEFAULT_FETCH_TYPE(t) __DEFAULT_FETCH_TYPE(t) > -#define DEFAULT_FETCH_TYPE _DEFAULT_FETCH_TYPE(BITS_PER_LONG) > -#define DEFAULT_FETCH_TYPE_STR __stringify(DEFAULT_FETCH_TYPE) > - > -#define ASSIGN_FETCH_FUNC(method, type) \ > - [FETCH_MTD_##method] = FETCH_FUNC_NAME(method, type) > - > -#define __ASSIGN_FETCH_TYPE(_name, ptype, ftype, _size, sign, _fmttype) \ > - {.name = _name, \ > - .size = _size, \ > - .is_signed = sign, \ > - .print = PRINT_TYPE_FUNC_NAME(ptype), \ > - .fmt = PRINT_TYPE_FMT_NAME(ptype), \ > - .fmttype = _fmttype, \ > - .fetch = { \ > -ASSIGN_FETCH_FUNC(reg, ftype), \ > -ASSIGN_FETCH_FUNC(stack, ftype), \ > -ASSIGN_FETCH_FUNC(retval, ftype), \ > -ASSIGN_FETCH_FUNC(memory, ftype), \ > -ASSIGN_FETCH_FUNC(symbol, ftype), \ > -ASSIGN_FETCH_FUNC(deref, ftype), \ > -ASSIGN_FETCH_FUNC(bitfield, ftype), \ > - } \ > - } > - > -#define ASSIGN_FETCH_TYPE(ptype, ftype, sign) \ > - __ASSIGN_FETCH_TYPE(#ptype, ptype, ftype, sizeof(ftype), sign, #ptype) > - > -#define FETCH_TYPE_STRING 0 > -#define FETCH_TYPE_STRSIZE 1 > - > /* Fetch type information table */ > static const struct fetch_type fetch_type_table[] = { > /* Special types */ > diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h > index 2c979cb66367..7c6be146f444 100644 > --- a/kernel/trace/trace_probe.h > +++ b/kernel/trace/trace_probe.h > @@ -81,6 +81,17 @@ > */ > #define convert_rloc_to_loc(dl, offs) ((u32)(dl) + (offs)) > > +static inline void *get_rloc_data(u32 *dl) > +{ > + return (u8 *)dl + get_rloc_offs(*dl); > +} > + > +/* For data_loc conversion */ > +static inline void *get_loc_data(u32 *dl, void *ent) > +{ > + return (u8 *)ent + get_rloc_offs(*dl); > +} > + > /* Data fetch function type */ > typedef void (*fetch_func_t)(struct pt_regs *, void *, void *); > /* Printing function type */ > @@ -115,6 +126,59 @@ struct fetch_param { > void *data; > }; > > +#define PRINT_TYPE_FUNC_NAME(type) print_type_##type > +#define PRINT_TYPE_FMT_NAME(type) print_type_format_##type > + > +/* Printing in basic type function template */ > +#define DECLARE_BASIC_PRINT_TYPE_FUNC(type, fmt) \ > +__kprobes int PRINT_TYPE_FUNC_NAME(type)(struct trace_seq *s, \ > + const char *name, \ > + void *data, void *ent); \ > +extern const char PRINT_TYPE_FMT_NAME(type)[]; > + > +DECLARE_BASIC_PRINT_TYPE_FUNC(u8 , "%x") > +DECLARE_BASIC_PRINT_TYPE_FUNC(u16, "%x") > +DECLARE_BASIC_PRINT_TYPE_FUNC(u32, "%x") > +DECLARE_BASIC_PRINT_TYPE_FUNC(u64, "%Lx") > +DECLARE_BASIC_PRINT_TYPE_FUNC(s8, "%d") > +DECLARE_BASIC_PRINT_TYPE_FUNC(s16, "%d") > +DECLARE_BASIC_PRINT_TYPE_FUNC(s32, "%d") > +DECLARE_BASIC_PRINT_TYPE_FUNC(s64, "%Ld") > + > +/* Default (unsigned long) fetch type */ > +#define __DEFAULT_FETCH_TYPE(t) u##t > +#define _DEFAULT_FETCH_TYPE(t) __DEFAULT_FETCH_TYPE(t) > +#define DEFAULT_FETCH_TYPE _DEFAULT_FETCH_TYPE(BITS_PER_LONG) > +#define DEFAULT_FETCH_TYPE_STR __stringify(DEFAULT_FETCH_TYPE) > + > +#define ASSIGN_FETCH_FUNC(method, type) \ > + [FETCH_MTD_##method] = FETCH_FUNC_NAME(method, type) > + > +#define __ASSIGN_FETCH_TYPE(_name, ptype, ftype, _size, sign, _fmttype) \ > + {.name = _name, \ > + .size = _size, \ > + .is_signed = sign, \ > + .print = PRINT_TYPE_FUNC_NAME(ptype), \ > + .fmt = PRINT_TYPE_FMT_NAME(ptype), \ > + .fmttype = _fmttype, \ > + .fetch = { \ > +ASSIGN_FETCH_FUNC(reg, ftype), \ > +ASSIGN_FETCH_FUNC(stack, ftype), \ > +ASSIGN_FETCH_FUNC(retval, ftype), \ > +ASSIGN_FETCH_FUNC(memory, ftype), \ > +ASSIGN_FETCH_FUNC(symbol, ftype), \ > +ASSIGN_FETCH_FUNC(deref, ftype), \ > +ASSIGN_FETCH_FUNC(bitfield, ftype), \ > + } \ > + } > + > +#define ASSIGN_FETCH_TYPE(ptype, ftype, sign) \ > + __ASSIGN_FETCH_TYPE(#ptype, ptype, ftype, sizeof(ftype), sign, #ptype) > + > +#define FETCH_TYPE_STRING 0 > +#define FETCH_TYPE_STRSIZE 1 > + > + > struct probe_arg { > struct fetch_param fetch; > struct fetch_param fetch_size; > -- Masami HIRAMATSU IT Management Research Dept. Linux Technology Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: masami.hiramatsu.pt@hitachi.com