Re: [PATCH v2] tracing/uprobes: Support ftrace_event_file base multibuffer

From: zhangwei(Jovi)
Date: Mon Jun 24 2013 - 23:25:18 EST


On 2013/6/25 2:05, Oleg Nesterov wrote:
> Hi Jovi,
>
> I'll try to read this patch carefully tomorrow.
>
> Looks fine at first glance, but some nits below.
>
> On 06/24, zhangwei(Jovi) wrote:
>>
>> static int uprobe_trace_func(struct trace_uprobe *tu, struct pt_regs *regs)
>> {
>> - if (!is_ret_probe(tu))
>> - uprobe_trace_print(tu, 0, regs);
>> + struct event_file_link *link;
>> +
>> + if (is_ret_probe(tu))
>> + return 0;
>> +
>> + rcu_read_lock();
>> +
>> + list_for_each_entry(link, &tu->files, list)
>> + uprobe_trace_print(tu, 0, regs, link->file);
>> +
>> + rcu_read_unlock();
>
> Purely cosmetic and I won't argue, but why the empty lines around
> list_for_each_entry() ?
>
>> static int
>> -probe_event_enable(struct trace_uprobe *tu, int flag, filter_func_t filter)
>> +probe_event_enable(struct trace_uprobe *tu, struct ftrace_event_file *file,
>> + filter_func_t filter)
>> {
>> + int enabled = 0;
>> int ret = 0;
>>
>> - if (is_trace_uprobe_enabled(tu))
>> + /*
>> + * Currently TP_FLAG_TRACE/TP_FLAG_PROFILE are mutually exclusive
>> + * for uprobe(filter argument issue), this need to fix in future.
>> + */
>> + if ((file && (tu->flags & TP_FLAG_PROFILE)) ||
>> + (!file && (tu->flags & TP_FLAG_TRACE)))
>> return -EINTR;
>
> Well, this looks confusing and overcomplicated, see below.
>
>> + /* Currently we cannot call uprobe_register twice for same tu */
>> + if (is_trace_uprobe_enabled(tu))
>> + enabled = 1;
>
> The comment is wrong. It is not that we can't do this "Currently".
>
> We must not do uprobe_register(..., consumer) twice, consumer/uprobe
> are linked together.
>
>> + if (file) {
>> + struct event_file_link *link;
>> +
>
> Just add
> if (TP_FLAG_PROFILE)
> return -EINTR;
>
> here and kill the complicated check below. Same for the "else" branch.
>
>> +static void
>> +probe_event_disable(struct trace_uprobe *tu, struct ftrace_event_file *file)
>> +{
>> + if (file) {
>> + struct event_file_link *link;
>> +
>> + link = find_event_file_link(tu, file);
>> + if (!link)
>> + return;
>> +
>> + list_del_rcu(&link->list);
>> + /* synchronize with uprobe_trace_func/uretprobe_trace_func */
>> + synchronize_sched();
>> + kfree(link);
>> +
>> + if (!list_empty(&tu->files))
>> + return;
>> +
>> + tu->flags &= ~TP_FLAG_TRACE;
>> + } else
>> + tu->flags &= ~TP_FLAG_PROFILE;
>> +
>>
>> WARN_ON(!uprobe_filter_is_empty(&tu->filter));
>>
>> - uprobe_unregister(tu->inode, tu->offset, &tu->consumer);
>> - tu->flags &= ~flag;
>> + if (!is_trace_uprobe_enabled(tu))
>> + uprobe_unregister(tu->inode, tu->offset, &tu->consumer);
>
> Well, this is not exactly right... Currently this is fine, but still.
>
> It would be better to clear TP_FLAG_TRACE/TP_FLAG_PROFILE after
> uprobe_unregister(), when we can't race with the running handler
> which can check ->flags.
>
> And I'd suggest you to send the soft-enable/disable change in a
> separate (and trivial) patch.
>
> Oleg.
Thanks Oleg, you are right, please check v3 patch.

.jovi


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