tracing: Some more updates for 4.15
Subsystems (3)
Steven Rostedt
maintainercover tracing: Some more updates for 4.15
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
for-next
Head SHA1: a96a5037ed0f52e2d86739f4a1ef985bd036e575
Peter Zijlstra (4):
perf/ftrace: Revert ("perf/ftrace: Fix double traces of perf on ftrace:function") perf/ftrace: Fix function trace events
perf/ftrace: Small cleanup
ftrace: Kill FTRACE_OPS_FL_PER_CPU
Steven Rostedt (VMware) (3):
tracing, dma-buf: Remove unused trace event dma_fence_annotate_wait_on tracing, thermal: Hide devfreq trace events when not in use tracing, thermal: Hide cpu cooling trace events when not in use
----
drivers/dma-buf/dma-fence.c | 1 - include/linux/ftrace.h | 83 +++++++--------------------------------- include/linux/perf_event.h | 2 +- include/linux/trace_events.h | 9 ++++- include/trace/events/dma_fence.h | 40 ------------------- include/trace/events/thermal.h | 4 ++ kernel/events/core.c | 13 ++----- kernel/trace/ftrace.c | 55 +++----------------------- kernel/trace/trace_event_perf.c | 82 +++++++++++++++++++++++---------------- kernel/trace/trace_kprobe.c | 4 +- kernel/trace/trace_syscalls.c | 4 +- kernel/trace/trace_uprobe.c | 2 +- 12 files changed, 90 insertions(+), 209 deletions(-)
Steven Rostedt
maintainerPATCH 2/7 perf/ftrace: Revert ("perf/ftrace: Fix double traces of perf on ftrace:function")
From: Peter Zijlstra <[email protected]>
Revert commit:
75e8387685f6 ("perf/ftrace: Fix double traces of perf on ftrace:function")
The reason I instantly stumbled on that patch is that it only addresses the ftrace situation and doesn't mention the other _5_ places that use this interface. It doesn't explain why those don't have the problem and if not, why their solution doesn't work for ftrace.
It doesn't, but this is just putting more duct tape on.
--- include/linux/perf_event.h | 2 +- include/linux/trace_events.h | 4 ++-- kernel/events/core.c | 13 ++++--------- kernel/trace/trace_event_perf.c | 4 +--- kernel/trace/trace_kprobe.c | 4 ++-- kernel/trace/trace_syscalls.c | 4 ++-- kernel/trace/trace_uprobe.c | 2 +- 7 files changed, 13 insertions(+), 20 deletions(-)
include/linux/perf_event.h +1 -1
@@ -1184,7 +1184,7 @@ extern void perf_event_init(void);extern void perf_tp_event (u16 event_type,u64 count,void *record,int entry_size,struct pt_regs *regs,struct hlist_head *head,int rctx, -struct task_struct *task,struct perf_event *event); +struct task_struct *task);extern void perf_bp_event (struct perf_event *event,void *data);#ifndef perf_misc_flags
include/linux/trace_events.h +2 -2
@@ -507,9 +507,9 @@ void perf_trace_run_bpf_submit(void *raw_data, int size, int rctx,static inline void perf_trace_buf_submit (void *raw_data,int size,int rctx,u16 type,u64 count,struct pt_regs *regs,void *head, -struct task_struct *task,struct perf_event *event) +struct task_struct *task) { -perf_tp_event (type, count, raw_data, size, regs, head, rctx, task, event); +perf_tp_event (type, count, raw_data, size, regs, head, rctx, task); }#endif
kernel/events/core.c +4 -9
@@ -7954,15 +7954,16 @@ void perf_trace_run_bpf_submit(void *raw_data, int size, int rctx, } }perf_tp_event (call->event.type, count, raw_data, size, regs, head, - rctx, task,NULL ); + rctx, task); }EXPORT_SYMBOL_GPL (perf_trace_run_bpf_submit);void perf_tp_event (u16 event_type,u64 count,void *record,int entry_size,struct pt_regs *regs,struct hlist_head *head,int rctx, -struct task_struct *task,struct perf_event *event) +struct task_struct *task) {struct perf_sample_data data; +struct perf_event *event;struct perf_raw_record raw = { .frag = {
@@ -7976,15 +7977,9 @@ void perf_tp_event(u16 event_type, u64 count, void *record, int entry_size,perf_trace_buf_update (record, event_type); -/* Use the given event instead of the hlist */ -if (event) { +hlist_for_each_entry_rcu (event, head, hlist_entry) {if (perf_tp_event_match (event, &data, regs))perf_swevent_event (event, count, &data, regs); - }else { -hlist_for_each_entry_rcu (event, head, hlist_entry) { -if (perf_tp_event_match (event, &data, regs)) -perf_swevent_event (event, count, &data, regs); - } }/*
kernel/trace/trace_event_perf.c +1 -3
@@ -306,7 +306,6 @@ static void perf_ftrace_function_call(unsigned long ip, unsigned long parent_ip, struct ftrace_ops *ops, struct pt_regs *pt_regs) { - struct perf_event *event; struct ftrace_entry *entry;struct hlist_head *head;struct pt_regs regs;
@@ -330,9 +329,8 @@ perf_ftrace_function_call(unsigned long ip, unsigned long parent_ip, entry->ip = ip; entry->parent_ip = parent_ip; - event = container_of(ops, struct perf_event, ftrace_ops);perf_trace_buf_submit (entry,ENTRY_SIZE , rctx,TRACE_FN , -1 , ®s, head,NULL , event); +1 , ®s, head,NULL );#undef ENTRY_SIZE }
kernel/trace/trace_kprobe.c +2 -2
@@ -1200,7 +1200,7 @@ kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs)memset (&entry[1 ],0 , dsize);store_trace_args (sizeof (*entry), &tk->tp, regs, (u8 *)&entry[1 ], dsize);perf_trace_buf_submit (entry, size, rctx, call->event.type,1 , regs, - head,NULL ,NULL ); + head,NULL ); }NOKPROBE_SYMBOL (kprobe_perf_func);
@@ -1236,7 +1236,7 @@ kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri, entry->ret_ip = (unsigned long )ri->ret_addr;store_trace_args (sizeof (*entry), &tk->tp, regs, (u8 *)&entry[1 ], dsize);perf_trace_buf_submit (entry, size, rctx, call->event.type,1 , regs, - head, NULL, NULL); + head, NULL); }NOKPROBE_SYMBOL (kretprobe_perf_func);#endif /* CONFIG_PERF_EVENTS */
kernel/trace/trace_syscalls.c +2 -2
@@ -622,7 +622,7 @@ static void perf_syscall_enter(void *ignore, struct pt_regs *regs, long id)perf_trace_buf_submit (rec, size, rctx, sys_data->enter_event->event.type,1 , regs, - head,NULL ,NULL ); + head,NULL ); }static int perf_sysenter_enable (struct trace_event_call *call)
@@ -716,7 +716,7 @@ static void perf_syscall_exit(void *ignore, struct pt_regs *regs, long ret) }perf_trace_buf_submit (rec, size, rctx, sys_data->exit_event->event.type, -1 , regs, head,NULL ,NULL ); +1 , regs, head,NULL ); }static int perf_sysexit_enable (struct trace_event_call *call)
kernel/trace/trace_uprobe.c +1 -1
@@ -1156,7 +1156,7 @@ static void __uprobe_perf_func(struct trace_uprobe *tu, }perf_trace_buf_submit (entry, size, rctx, call->event.type,1 , regs, - head,NULL ,NULL ); + head,NULL ); out:preempt_enable (); }
Signature · 1 line
2.13.2
Steven Rostedt
maintainerPATCH 3/7 perf/ftrace: Fix function trace events
In reply to Steven RostedtFrom: Peter Zijlstra <[email protected]>
The function-trace <-> perf interface is a tad messed up. Where all the other trace <-> perf interfaces use a single trace hook registration and use per-cpu RCU based hlist to iterate the events, function-trace actually needs multiple hook registrations in order to minimize function entry patching when filters are present.
The end result is that we iterate events both on the trace hook and on the hlist, which results in reporting events multiple times.
Since function-trace cannot use the regular scheme, fix it the other way around, use singleton hlists.
--- include/linux/trace_events.h | 5 +++ kernel/trace/trace_event_perf.c | 80 +++++++++++++++++++++++++---------------- 2 files changed, 54 insertions(+), 31 deletions(-)
include/linux/trace_events.h +5 -0
@@ -173,6 +173,11 @@ enum trace_reg {TRACE_REG_PERF_UNREGISTER ,TRACE_REG_PERF_OPEN ,TRACE_REG_PERF_CLOSE , +/* +* These (ADD/DEL) use a 'boolean' return value, where 1 (true) means a +* custom action was taken and the default action is not to be +* performed. +*/ TRACE_REG_PERF_ADD , TRACE_REG_PERF_DEL, #endif
kernel/trace/trace_event_perf.c +49 -31
135 lines not on this page · raw message
Signature · 1 line
2.13.2
Steven Rostedt
maintainerPATCH 4/7 perf/ftrace: Small cleanup
In reply to Steven RostedtFrom: Peter Zijlstra <[email protected]>
ops->flags _should_ be 0 at this point, so setting the flag using bitwise or is a bit daft.
--- kernel/trace/trace_event_perf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/trace_event_perf.c +1 -1
@@ -363,7 +363,7 @@ static int perf_ftrace_function_register(struct perf_event *event) {struct ftrace_ops *ops = &event->ftrace_ops; - ops->flags |=FTRACE_OPS_FL_RCU ; + ops->flags =FTRACE_OPS_FL_RCU ; ops->func = perf_ftrace_function_call; ops->private = (void *)(unsigned long )nr_cpu_ids;
Signature · 1 line
2.13.2
Steven Rostedt
maintainerPATCH 5/7 ftrace: Kill FTRACE_OPS_FL_PER_CPU
In reply to Steven RostedtFrom: Peter Zijlstra <[email protected]>
The one and only user of FTRACE_OPS_FL_PER_CPU is gone, remove the lot.
--- include/linux/ftrace.h | 83 +++++++++----------------------------------------- kernel/trace/ftrace.c | 55 ++++----------------------------- 2 files changed, 20 insertions(+), 118 deletions(-)
include/linux/ftrace.h +14 -69
@@ -102,10 +102,6 @@ ftrace_func_t ftrace_ops_get_func(struct ftrace_ops *ops);* ENABLED - set/unset when ftrace_ops is registered/unregistered * DYNAMIC - set when ftrace_ops is registered to denote dynamically * allocated ftrace_ops which need special care -* PER_CPU - set manualy by ftrace_ops user to denote the ftrace_ops -* could be controlled by following calls: -* ftrace_function_local_enable -* ftrace_function_local_disable * SAVE_REGS - The ftrace_ops wants regs saved at each function called * and passed to the callback. If this flag is set, but the * architecture does not support passing regs
@@ -149,21 +145,20 @@ ftrace_func_t ftrace_ops_get_func(struct ftrace_ops *ops);enum {FTRACE_OPS_FL_ENABLED =1 <<0 ,FTRACE_OPS_FL_DYNAMIC =1 <<1 , -FTRACE_OPS_FL_PER_CPU =1 <<2 , -FTRACE_OPS_FL_SAVE_REGS =1 <<3 , -FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED =1 <<4 , -FTRACE_OPS_FL_RECURSION_SAFE =1 <<5 , -FTRACE_OPS_FL_STUB =1 <<6 , -FTRACE_OPS_FL_INITIALIZED =1 <<7 , -FTRACE_OPS_FL_DELETED =1 <<8 , -FTRACE_OPS_FL_ADDING =1 <<9 , -FTRACE_OPS_FL_REMOVING =1 <<10 , -FTRACE_OPS_FL_MODIFYING =1 <<11 , -FTRACE_OPS_FL_ALLOC_TRAMP =1 <<12 , -FTRACE_OPS_FL_IPMODIFY =1 <<13 , -FTRACE_OPS_FL_PID =1 <<14 , -FTRACE_OPS_FL_RCU =1 <<15 , -FTRACE_OPS_FL_TRACE_ARRAY =1 <<16 , +FTRACE_OPS_FL_SAVE_REGS =1 <<2 , +FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED =1 <<3 , +FTRACE_OPS_FL_RECURSION_SAFE =1 <<4 , +FTRACE_OPS_FL_STUB =1 <<5 , +FTRACE_OPS_FL_INITIALIZED =1 <<6 , +FTRACE_OPS_FL_DELETED =1 <<7 , +FTRACE_OPS_FL_ADDING =1 <<8 , +FTRACE_OPS_FL_REMOVING =1 <<9 , +FTRACE_OPS_FL_MODIFYING =1 <<10 , +FTRACE_OPS_FL_ALLOC_TRAMP =1 <<11 , +FTRACE_OPS_FL_IPMODIFY =1 <<12 , +FTRACE_OPS_FL_PID =1 <<13 , +FTRACE_OPS_FL_RCU =1 <<14 , +FTRACE_OPS_FL_TRACE_ARRAY =1 <<15 , };#ifdef CONFIG_DYNAMIC_FTRACE
@@ -198,7 +193,6 @@ struct ftrace_ops {unsigned long flags;void *private;ftrace_func_t saved_func; -int __percpu *disabled;#ifdef CONFIG_DYNAMIC_FTRACE struct ftrace_ops_hash local_hash;struct ftrace_ops_hash *func_hash;
@@ -230,55 +224,6 @@ int register_ftrace_function(struct ftrace_ops *ops);int unregister_ftrace_function (struct ftrace_ops *ops);void clear_ftrace_function (void ); -/** -* ftrace_function_local_enable - enable ftrace_ops on current cpu -* -* This function enables tracing on current cpu by decreasing -* the per cpu control variable. -* It must be called with preemption disabled and only on ftrace_ops -* registered with FTRACE_OPS_FL_PER_CPU. If called without preemption -* disabled, this_cpu_ptr will complain when CONFIG_DEBUG_PREEMPT is enabled. -*/ -static inline void ftrace_function_local_enable (struct ftrace_ops *ops) -{ -if (WARN_ON_ONCE (!(ops->flags &FTRACE_OPS_FL_PER_CPU ))) -return ; - - (*this_cpu_ptr (ops->disabled))--; -} - -/** -* ftrace_function_local_disable - disable ftrace_ops on current cpu -* -* This function disables tracing on current cpu by increasing -* the per cpu control variable. -* It must be called with preemption disabled and only on ftrace_ops -* registered with FTRACE_OPS_FL_PER_CPU. If called without preemption -* disabled, this_cpu_ptr will complain when CONFIG_DEBUG_PREEMPT is enabled. -*/ -static inline void ftrace_function_local_disable (struct ftrace_ops *ops) -{ -if (WARN_ON_ONCE (!(ops->flags &FTRACE_OPS_FL_PER_CPU ))) -return ; - - (*this_cpu_ptr (ops->disabled))++; -} - -/** -* ftrace_function_local_disabled - returns ftrace_ops disabled value -* on current cpu -* -* This function returns value of ftrace_ops::disabled on current cpu. -* It must be called with preemption disabled and only on ftrace_ops -* registered with FTRACE_OPS_FL_PER_CPU. If called without preemption -* disabled, this_cpu_ptr will complain when CONFIG_DEBUG_PREEMPT is enabled. -*/ -static inline int ftrace_function_local_disabled (struct ftrace_ops *ops) -{ -WARN_ON_ONCE (!(ops->flags &FTRACE_OPS_FL_PER_CPU )); -return *this_cpu_ptr (ops->disabled); -} -extern void ftrace_stub (unsigned long a0,unsigned long a1,struct ftrace_ops *op,struct pt_regs *regs);
kernel/trace/ftrace.c +6 -49
116 lines not on this page · raw message
Signature · 1 line
2.13.2
Steven Rostedt
maintainerPATCH 6/7 tracing, thermal: Hide devfreq trace events when not in use
In reply to Steven RostedtFrom: "Steven Rostedt (VMware)" <[email protected]>
As trace events when defined create data structures and functions to process them, defining trace events when not using them is a waste of memory.
The trace events thermal_power_devfreq_get_power and thermal_power_devfreq_limit are only used when CONFIG_DEVFREQ_THERMAL is set. Make those events only defined when that is set as well.
--- include/trace/events/thermal.h | 2 ++ 1 file changed, 2 insertions(+)
include/trace/events/thermal.h +2 -0
@@ -148,6 +148,7 @@ TRACE_EVENT(thermal_power_cpu_limit, __entry->power) ); +#ifdef CONFIG_DEVFREQ_THERMAL TRACE_EVENT(thermal_power_devfreq_get_power, TP_PROTO(struct thermal_cooling_device *cdev, struct devfreq_dev_status *status, unsigned long freq,
@@ -203,6 +204,7 @@ TRACE_EVENT(thermal_power_devfreq_limit,__get_str (type), __entry->freq, __entry->cdev_state, __entry->power) ); +#endif /* CONFIG_DEVFREQ_THERMAL */ #endif /* _TRACE_THERMAL_H */ /* This part must be outside protection */
Signature · 1 line
2.13.2
Steven Rostedt
maintainerPATCH 7/7 tracing, thermal: Hide cpu cooling trace events when not in use
In reply to Steven RostedtFrom: "Steven Rostedt (VMware)" <[email protected]>
As trace events when defined create data structures and functions to process them, defining trace events when not using them is a waste of memory.
The trace events thermal_power_cpu_get_power and thermal_power_cpu_limit are only used when CONFIG_CPU_THERMAL is set. Make those events only defined when that is set as well.
--- include/trace/events/thermal.h | 2 ++ 1 file changed, 2 insertions(+)
include/trace/events/thermal.h +2 -0
@@ -90,6 +90,7 @@ TRACE_EVENT(thermal_zone_trip, show_tzt_type(__entry->trip_type)) ); +#ifdef CONFIG_CPU_THERMAL TRACE_EVENT(thermal_power_cpu_get_power, TP_PROTO(const struct cpumask *cpus, unsigned long freq, u32 *load, size_t load_len, u32 dynamic_power, u32 static_power),
@@ -147,6 +148,7 @@ TRACE_EVENT(thermal_power_cpu_limit,__get_bitmask (cpumask), __entry->freq, __entry->cdev_state, __entry->power) ); +#endif /* CONFIG_CPU_THERMAL */ #ifdef CONFIG_DEVFREQ_THERMAL TRACE_EVENT(thermal_power_devfreq_get_power,
Signature · 1 line
2.13.2
A message that is not in the archive (sent off-list or not yet received): [email protected]
Steven Rostedt
maintainerRe: [for-next][PATCH 1/7] tracing, dma-buf: Remove unused trace event dma_fence_annotate_wait_on
Quoted 9 lines · On Wed, 18 Oct 2017 09:28:08 -0400 Steven Rostedt <[email protected]> wrote:
From: "Steven Rostedt (VMware)" <[email protected]>
Commit
e941759c74("fence: dma-buf cross-device synchronization") added trace eventfence_annotate_wait_on, but never used it. It was renamed todma_fence_annotate_wait_onby commitf54d186700("dma-buf: Rename struct fence todma_fence") but still not used. As defined trace events have data structures and functions created for them, it is a waste of memory if they are not used. Remove the unused trace event.
Quoted 3 lines
Reviewed-by Christian König <[email protected]>
Hmm, quilt mail screws up the encoding of non ASCII characters, and lkml rejected it. (I just fixed it here).
-- Steve
Quoted 70 lines
Acked-by Sumit Semwal <[email protected]>Signed-off-by Steven Rostedt (VMware) <[email protected]>--- drivers/dma-buf/dma-fence.c | 1 - include/trace/events/dma_fence.h | 40 ---------------------------------------- 2 files changed, 41 deletions(-)drivers/dma-buf/dma-fence.c +0
-1@@ -27,7 +27,6 @@#define CREATE_TRACE_POINTS #include <trace/events/dma_fence.h> -EXPORT_TRACEPOINT_SYMBOL (dma_fence_annotate_wait_on);EXPORT_TRACEPOINT_SYMBOL (dma_fence_emit);EXPORT_TRACEPOINT_SYMBOL (dma_fence_enable_signal);include/trace/events/dma_fence.h +0
-40@@ -8,46 +8,6 @@struct dma_fence ; -TRACE_EVENT (dma_fence_annotate_wait_on, - -/* fence: the fence waiting on f1, f1: the fence to be waited on. */ - TP_PROTO(struct dma_fence *fence, struct dma_fence *f1), - -TP_ARGS (fence, f1), - -TP_STRUCT__entry ( - __string(driver, fence->ops->get_driver_name(fence)) - __string(timeline, fence->ops->get_timeline_name(fence)) - __field(unsigned int, context) - __field(unsigned int, seqno) - - __string(waiting_driver, f1->ops->get_driver_name(f1)) - __string(waiting_timeline, f1->ops->get_timeline_name(f1)) - __field(unsigned int, waiting_context) - __field(unsigned int, waiting_seqno) - ), - -TP_fast_assign ( - __assign_str(driver, fence->ops->get_driver_name(fence)) - __assign_str(timeline, fence->ops->get_timeline_name(fence)) - __entry->context = fence->context; - __entry->seqno = fence->seqno; - - __assign_str(waiting_driver, f1->ops->get_driver_name(f1)) - __assign_str(waiting_timeline, f1->ops->get_timeline_name(f1)) - __entry->waiting_context = f1->context; - __entry->waiting_seqno = f1->seqno; - - ), - -TP_printk ("driver=%s timeline=%s context=%u seqno=%u " \ -"waits on driver=%s timeline=%s context=%u seqno=%u" , -__get_str (driver),__get_str (timeline), __entry->context, - __entry->seqno, -__get_str (waiting_driver),__get_str (waiting_timeline), - __entry->waiting_context, __entry->waiting_seqno) -); - DECLARE_EVENT_CLASS(dma_fence, TP_PROTO(struct dma_fence *fence),