From: Masami Hiramatsu on
Srikar Dronamraju wrote:
> Move common parts of trace_kprobe.c and adjust
> kernel/trace/trace_kprobe.c after moving common code to
> kernel/trace/trace_probe.h
>
> Signed-off-by: Srikar Dronamraju <srikar(a)linux.vnet.ibm.com>

Looks good!
I have just a few comments.

> diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h
> new file mode 100644
> index 0000000..66a4498
> --- /dev/null
> +++ b/kernel/trace/trace_probe.h
> @@ -0,0 +1,111 @@
> +/*
> + * Uprobes-based tracing events

Isn't it a common header for kprobes and uprobes? :)

Maybe "Probe-based dynamic events common header" ?

> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + *
> + * Copyright (C) IBM Corporation, 2010
> + * Author: Srikar Dronamraju
> + */
> +
> +#include <linux/seq_file.h>
> +#include <linux/slab.h>
> +#include <linux/smp.h>
> +#include <linux/debugfs.h>
> +#include <linux/types.h>
> +#include <linux/string.h>
> +#include <linux/ctype.h>
> +#include <linux/ptrace.h>
> +#include <linux/perf_event.h>
> +
> +#include "trace.h"
> +#include "trace_output.h"
> +
> +#define MAX_TRACE_ARGS 128
> +#define MAX_ARGSTR_LEN 63
> +#define MAX_EVENT_NAME_LEN 64
> +#define UPROBE_EVENT_SYSTEM "uprobes"

You should *just move* the common code in this patch.
Additional uprobes code can be introduced in next patch.

> +#define KPROBE_EVENT_SYSTEM "kprobes"
> +
> +/* Reserved field names */
> +#define FIELD_STRING_IP "__probe_ip"
> +#define FIELD_STRING_NARGS "__probe_nargs"
> +#define FIELD_STRING_RETIP "__probe_ret_ip"
> +#define FIELD_STRING_FUNC "__probe_func"
> +#define FIELD_STRING_PID "__probe_pid"
> +
> +static const char *reserved_field_names[] = {
> + "common_type",
> + "common_flags",
> + "common_preempt_count",
> + "common_pid",
> + "common_tgid",
> + "common_lock_depth",
> + FIELD_STRING_IP,
> + FIELD_STRING_NARGS,
> + FIELD_STRING_RETIP,
> + FIELD_STRING_FUNC,
> + FIELD_STRING_PID,
> +};
> +
> +/* Flags for trace_probe */
> +#define TP_FLAG_TRACE 1
> +#define TP_FLAG_PROFILE 2
> +#define UPROBE_ENABLED 4

If this is a trace_probe flag, it is better to start with TP_FLAG_.

Thank you,

--
Masami Hiramatsu
e-mail: mhiramat(a)redhat.com

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Masami Hiramatsu on
Srikar Dronamraju wrote:
>>
>> Isn't it a common header for kprobes and uprobes? :)
>>
>> Maybe "Probe-based dynamic events common header" ?
>>
>
> Agree.
>
>>> +#define MAX_TRACE_ARGS 128
>>> +#define MAX_ARGSTR_LEN 63
>>> +#define MAX_EVENT_NAME_LEN 64
>>> +#define UPROBE_EVENT_SYSTEM "uprobes"
>>
>> You should *just move* the common code in this patch.
>> Additional uprobes code can be introduced in next patch.
>>
>
> Okay.
>
>>> +
>>> +/* Flags for trace_probe */
>>> +#define TP_FLAG_TRACE 1
>>> +#define TP_FLAG_PROFILE 2
>>> +#define UPROBE_ENABLED 4
>>
>> If this is a trace_probe flag, it is better to start with TP_FLAG_.
>
> Okay.
> Does TP_FLAG_UPROBE sound fine?

Sure, that's good for me:)

Thank you,


--
Masami Hiramatsu
e-mail: mhiramat(a)redhat.com
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Masami Hiramatsu on
Srikar Dronamraju wrote:
> share_traceevents.patch.
>
> From: Srikar Dronamraju <srikar(a)linux.vnet.ibm.com>
>
> Changelog from v5: Addressed comments from Masami.
> Also shared lot more code from kprobes traceevents.
>
> Move common parts of trace_kprobe.c and trace_uprobec.
> Adjust kernel/trace/trace_kprobe.c after moving common code to
> kernel/trace/trace_probe.h. However they still have few duplicate
> functions.

Hi Shriker,

OK, sharing fetch codes between them is acceptable.

> diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h
> new file mode 100644
> index 0000000..b4c5763
> --- /dev/null
> +++ b/kernel/trace/trace_probe.h
[...]

> +/* Printing in basic type function template */
> +#define DEFINE_BASIC_PRINT_TYPE_FUNC(type, fmt, cast) \
> +static __kprobes int PRINT_TYPE_FUNC_NAME(type)(struct trace_seq *s, \
> + const char *name, void *data)\
> +{ \
> + return trace_seq_printf(s, " %s=" fmt, name, (cast)*(type *)data);\
> +} \
> +static const char PRINT_TYPE_FMT_NAME(type)[] = fmt;
> +
> +DEFINE_BASIC_PRINT_TYPE_FUNC(u8, "%x", unsigned int)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x", unsigned int)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%lx", unsigned long)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%llx", unsigned long long)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(s8, "%d", int)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d", int)

Please do NOT define static variables in header file...
It should be in trace_probe_common.c.

> +
> +/* Data fetch function type */
> +typedef void (*fetch_func_t)(struct pt_regs *, void *, void *);
> +
> +struct fetch_param {
> + fetch_func_t fn;
> + void *data;
> +};
> +
> +#define FETCH_FUNC_NAME(kind, type) fetch_##kind##_##type
> +/*
> + * Define macro for basic types - we don't need to define s* types, because
> + * we have to care only about bitwidth at recording time.
> + */
> +#define DEFINE_BASIC_FETCH_FUNCS(kind) \
> +DEFINE_FETCH_##kind(u8) \
> +DEFINE_FETCH_##kind(u16) \
> +DEFINE_FETCH_##kind(u32) \
> +DEFINE_FETCH_##kind(u64)
> +
> +#define CHECK_BASIC_FETCH_FUNCS(kind, fn) \
> + ((FETCH_FUNC_NAME(kind, u8) == fn) || \
> + (FETCH_FUNC_NAME(kind, u16) == fn) || \
> + (FETCH_FUNC_NAME(kind, u32) == fn) || \
> + (FETCH_FUNC_NAME(kind, u64) == fn))
> +
> +/* Data fetch function templates */
> +#define DEFINE_FETCH_reg(type) \
> +static __kprobes void FETCH_FUNC_NAME(reg, type)(struct pt_regs *regs, \
> + void *offset, void *dest) \
> +{ \
> + *(type *)dest = (type)regs_get_register(regs, \
> + (unsigned int)((unsigned long)offset)); \
> +}
> +DEFINE_BASIC_FETCH_FUNCS(reg)
> +
> +/* 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(kind, type) \
> + .kind = FETCH_FUNC_NAME(kind, type)

And, please do not split these macros and function bodies.
I think we should make a new .c and put them into there.
Maybe, we need a new interface for generating new fetch_arg
according to its type (and access region, user/kernel).

> +
> +/* Flags for trace_probe */
> +#define TP_FLAG_TRACE 1
> +#define TP_FLAG_PROFILE 2
> +
> +#define PARAM_MAX_ARGS 16
> +#define PARAM_MAX_STACK (THREAD_SIZE / sizeof(unsigned long))
> +
> +struct probe_arg {
> + struct fetch_param fetch;
> + unsigned int offset; /* Offset from argument entry */
> + const char *name; /* Name of this argument */
> + const char *comm; /* Command of this argument */
> + const struct fetch_type *type; /* Type of this argument */
> +};
> +
> +static __kprobes void call_fetch(struct fetch_param *fprm,
> + struct pt_regs *regs, void *dest)
> +{
> + return fprm->fn(regs, fprm->data, dest);
> +}
> +
> +/* Check the name is good for event/group */
> +static inline int check_event_name(const char *name)
> +{
> + if (!isalpha(*name) && *name != '_')
> + return 0;
> + while (*++name != '\0') {
> + if (!isalpha(*name) && !isdigit(*name) && *name != '_')
> + return 0;
> + }
> + return 1;
> +}
> +
> +static int probe_event_raw_init(struct ftrace_event_call *event_call)
> +{
> + return 0;
> +}

Exporting these interfaces are OK.

Thank you,



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/