All of lore.kernel.org
 help / color / mirror / Atom feed
From: Li Zefan <lizf@cn.fujitsu.com>
To: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>, Steven Rostedt <rostedt@goodmis.org>,
	lkml <linux-kernel@vger.kernel.org>,
	systemtap <systemtap@sources.redhat.com>,
	kvm <kvm@vger.kernel.org>,
	DLE <dle-develop@lists.sourceforge.net>,
	Ananth N Mavinakayanahalli <ananth@in.ibm.com>,
	Christoph Hellwig <hch@infradead.org>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Tom Zanussi <tzanussi@gmail.com>
Subject: Re: [PATCH -tip -v11 08/11] tracing: add kprobe-based event tracer
Date: Fri, 10 Jul 2009 15:13:27 +0800	[thread overview]
Message-ID: <4A56EA17.8000508@cn.fujitsu.com> (raw)
In-Reply-To: <20090709202309.13223.9431.stgit@localhost.localdomain>

> +static __kprobes unsigned long fetch_memory(struct pt_regs *regs, void *addr)
> +{
> +	unsigned long retval;

need a space after local variable declarations.

> +	if (probe_kernel_address(addr, retval))
> +		return 0;
> +	return retval;
> +}
> +
> +static __kprobes unsigned long fetch_argument(struct pt_regs *regs, void *num)
> +{
> +	return regs_get_argument_nth(regs, (unsigned int)((unsigned long)num));
> +}
> +
> +static __kprobes unsigned long fetch_retvalue(struct pt_regs *regs,
> +					      void *dummy)
> +{
> +	return regs_return_value(regs);
> +}
> +
> +static __kprobes unsigned long fetch_ip(struct pt_regs *regs, void *dummy)
> +{
> +	return instruction_pointer(regs);
> +}
> +
> +/* Memory fetching by symbol */
> +struct symbol_cache {
> +	char *symbol;
> +	long offset;
> +	unsigned long addr;
> +};
> +
> +static unsigned long update_symbol_cache(struct symbol_cache *sc)
> +{
> +	sc->addr = (unsigned long)kallsyms_lookup_name(sc->symbol);
> +	if (sc->addr)
> +		sc->addr += sc->offset;
> +	return sc->addr;
> +}
> +
> +static void free_symbol_cache(struct symbol_cache *sc)
> +{
> +	kfree(sc->symbol);
> +	kfree(sc);
> +}
> +
> +static struct symbol_cache *alloc_symbol_cache(const char *sym, long offset)
> +{
> +	struct symbol_cache *sc;

ditto.

and in some other places

> +	if (!sym || strlen(sym) == 0)
> +		return NULL;
> +	sc = kzalloc(sizeof(struct symbol_cache), GFP_KERNEL);
> +	if (!sc)
> +		return NULL;
> +
> +	sc->symbol = kstrdup(sym, GFP_KERNEL);
> +	if (!sc->symbol) {
> +		kfree(sc);
> +		return NULL;
> +	}
> +	sc->offset = offset;
> +
> +	update_symbol_cache(sc);
> +	return sc;
> +}

...

> +static int probes_seq_show(struct seq_file *m, void *v)
> +{
> +	struct trace_probe *tp = v;
> +	int i, ret;
> +	char buf[MAX_ARGSTR_LEN + 1];
> +
> +	if (tp == NULL)
> +		return 0;
> +

redundant check. tp won't be NULL.

> +	seq_printf(m, "%c", probe_is_return(tp) ? 'r' : 'p');
> +	if (tp->call.name)
> +		seq_printf(m, ":%s", tp->call.name);
> +
> +	if (tp->symbol)
> +		seq_printf(m, " %s%+ld", probe_symbol(tp), probe_offset(tp));
> +	else
> +		seq_printf(m, " 0x%p", probe_address(tp));
> +
> +	for (i = 0; i < tp->nr_args; i++) {
> +		ret = trace_arg_string(buf, MAX_ARGSTR_LEN, &tp->args[i]);
> +		if (ret) {
> +			pr_warning("Argument%d is too long.\n", i);
> +			break;
> +		}
> +		seq_printf(m, " %s", buf);
> +	}
> +	seq_printf(m, "\n");
> +	return 0;
> +}

...

> +static ssize_t probes_write(struct file *file, const char __user *buffer,
> +			    size_t count, loff_t *ppos)
> +{
> +	char *kbuf, *tmp;
> +	int ret;
> +	size_t done;
> +	size_t size;
> +
> +	if (!count || count < 0)
> +		return 0;

count is unsigned, so won't < 0. Also I don't think you
need to treat (count == 0) specially.

> +
> +	kbuf = kmalloc(WRITE_BUFSIZE, GFP_KERNEL);

should be kmalloc(WRITE_BUFSIZE+1), or...

> +	if (!kbuf)
> +		return -ENOMEM;
> +
> +	ret = done = 0;
> +	do {
> +		size = count - done;
> +		if (size > WRITE_BUFSIZE)
> +			size = WRITE_BUFSIZE;

if (size >= WRITE_BUFSIZE)
	size = WRITE_BUFSIZE - 1;

> +		if (copy_from_user(kbuf, buffer + done, size)) {
> +			ret = -EFAULT;
> +			goto out;
> +		}
> +		kbuf[size] = '\0';
> +		tmp = strchr(kbuf, '\n');
> +		if (!tmp) {
> +			pr_warning("Line length is too long: "
> +				   "Should be less than %d.", WRITE_BUFSIZE);
> +			ret = -EINVAL;
> +			goto out;
> +		}
> +		*tmp = '\0';
> +		size = tmp - kbuf + 1;
> +		done += size;
> +		/* Remove comments */
> +		tmp = strchr(kbuf, '#');
> +		if (tmp)
> +			*tmp = '\0';
> +
> +		ret = command_trace_probe(kbuf);
> +		if (ret)
> +			goto out;
> +
> +	} while (done < count);
> +	ret = done;
> +out:
> +	kfree(kbuf);
> +	return ret;
> +}

...

> +enum print_line_t
> +print_kretprobe_event(struct trace_iterator *iter, int flags)
> +{
> +	struct kretprobe_trace_entry *field;
> +	struct trace_seq *s = &iter->seq;
> +	int i;
> +
> +	trace_assign_type(field, iter->ent);
> +
> +	if (!seq_print_ip_sym(s, field->ret_ip, flags | TRACE_ITER_SYM_OFFSET))
> +		goto partial;
> +

can't we use %pF?

> +	if (!trace_seq_puts(s, " <- "))
> +		goto partial;
> +
> +	if (!seq_print_ip_sym(s, field->func, flags & ~TRACE_ITER_SYM_OFFSET))
> +		goto partial;
> +

and $pf?

> +	if (!trace_seq_puts(s, ":"))
> +		goto partial;
> +

so all the above:

	trace_seq_puts(s, "%pF <- %pf:", (void *)field->ret_ip,
			(void *)field->func);

> +	for (i = 0; i < field->nargs; i++)
> +		if (!trace_seq_printf(s, " 0x%lx", field->args[i]))
> +			goto partial;
> +
> +	if (!trace_seq_puts(s, "\n"))
> +		goto partial;
> +
> +	return TRACE_TYPE_HANDLED;
> +partial:
> +	return TRACE_TYPE_PARTIAL_LINE;
> +}

  reply	other threads:[~2009-07-10  7:13 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-07-09 20:22 [PATCH -tip -v11 00/11] tracing: kprobe-based event tracer and x86 instruction decoder Masami Hiramatsu
2009-07-09 20:22 ` Masami Hiramatsu
2009-07-09 20:22 ` [PATCH -tip -v11 01/11] x86: instruction decoder API Masami Hiramatsu
2009-07-09 20:22   ` Masami Hiramatsu
2009-07-09 20:22 ` [PATCH -tip -v11 02/11] x86: x86 instruction decoder build-time selftest Masami Hiramatsu
2009-07-09 20:22   ` Masami Hiramatsu
2009-07-09 20:22 ` [PATCH -tip -v11 03/11] kprobes: checks probe address is instruction boudary on x86 Masami Hiramatsu
2009-07-09 20:22 ` [PATCH -tip -v11 04/11] kprobes: cleanup fix_riprel() using insn decoder " Masami Hiramatsu
2009-07-09 20:22   ` Masami Hiramatsu
2009-07-09 20:22 ` [PATCH -tip -v11 05/11] x86: add pt_regs register and stack access APIs Masami Hiramatsu
2009-07-09 20:22   ` Masami Hiramatsu
2009-07-09 20:22   ` Masami Hiramatsu
2009-07-09 20:22   ` Masami Hiramatsu
2009-07-09 20:22 ` [PATCH -tip -v11 06/11] tracing: ftrace dynamic ftrace_event_call support Masami Hiramatsu
2009-07-09 20:23 ` [PATCH -tip -v11 07/11] tracing: Introduce TRACE_FIELD_ZERO() macro Masami Hiramatsu
2009-07-09 20:23 ` [PATCH -tip -v11 08/11] tracing: add kprobe-based event tracer Masami Hiramatsu
2009-07-09 20:23   ` Masami Hiramatsu
2009-07-10  7:13   ` Li Zefan [this message]
2009-07-10 20:33     ` Masami Hiramatsu
2009-07-10 20:33       ` Masami Hiramatsu
2009-07-09 20:23 ` [PATCH -tip -v11 09/11] tracing: Kprobe-tracer supports more than 6 arguments Masami Hiramatsu
2009-07-09 20:23   ` Masami Hiramatsu
2009-07-09 20:23 ` [PATCH -tip -v11 10/11] tracing: Generate names for each kprobe event automatically Masami Hiramatsu
2009-07-09 20:23   ` Masami Hiramatsu
2009-07-09 20:23 ` [PATCH -tip -v11 11/11] tracing: Add kprobes event profiling interface Masami Hiramatsu
2009-07-09 20:23   ` Masami Hiramatsu
2009-07-10  5:17   ` Ananth N Mavinakayanahalli
2009-07-10  6:46   ` Li Zefan
2009-07-10  6:46     ` Li Zefan
2009-07-10 19:59     ` Masami Hiramatsu
2009-07-10 19:59       ` Masami Hiramatsu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A56EA17.8000508@cn.fujitsu.com \
    --to=lizf@cn.fujitsu.com \
    --cc=ananth@in.ibm.com \
    --cc=dle-develop@lists.sourceforge.net \
    --cc=fweisbec@gmail.com \
    --cc=hch@infradead.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhiramat@redhat.com \
    --cc=mingo@elte.hu \
    --cc=rostedt@goodmis.org \
    --cc=systemtap@sources.redhat.com \
    --cc=tzanussi@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.