This contains a few fixes and a clean up.
- A bad merge caused an "endif" to go in the wrong place in scripts/Makefile.build - Softirq tracing fix for tracing that corrupts lockdep and causes a false splat - Histogram documentation typo fixes - Fix a bad memory reference when passing in no filter to the filter code - Simplify code by using the swap macro instead of open coding the swap -----BEGIN PGP SIGNATURE----- iIkEABYIADIWIQRRSw7ePDh/lE+zeZMp5XQQmuv6qgUCWy2gMBQccm9zdGVkdEBn b29kbWlzLm9yZwAKCRAp5XQQmuv6qsqWAPdmoudDVf9Wi+THEJzlZL7ZhfYSDQyi A5Y3mc3iKoZeAQCq7PD7uH4Q1IMaVbAKG8OxvGVb69ijkMsSL4XxD33sAQ== =U1V7 -----END PGP SIGNATURE----- Merge tag 'trace-v4.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace Pull tracing fixes from Steven Rostedt: "This contains a few fixes and a clean up. - a bad merge caused an "endif" to go in the wrong place in scripts/Makefile.build - softirq tracing fix for tracing that corrupts lockdep and causes a false splat - histogram documentation typo fixes - fix a bad memory reference when passing in no filter to the filter code - simplify code by using the swap macro instead of open coding the swap" * tag 'trace-v4.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: tracing: Fix SKIP_STACK_VALIDATION=1 build due to bad merge with -mrecord-mcount tracing: Fix some errors in histogram documentation tracing: Use swap macro in update_max_tr softirq: Reorder trace_softirqs_on to prevent lockdep splat tracing: Check for no filter when processing event filters
This commit is contained in:
commit
81f9c4e417
|
@ -1729,35 +1729,35 @@ If a variable isn't a key variable or prefixed with 'vals=', the
|
||||||
associated event field will be saved in a variable but won't be summed
|
associated event field will be saved in a variable but won't be summed
|
||||||
as a value:
|
as a value:
|
||||||
|
|
||||||
# echo 'hist:keys=next_pid:ts1=common_timestamp ... >> event/trigger
|
# echo 'hist:keys=next_pid:ts1=common_timestamp ...' >> event/trigger
|
||||||
|
|
||||||
Multiple variables can be assigned at the same time. The below would
|
Multiple variables can be assigned at the same time. The below would
|
||||||
result in both ts0 and b being created as variables, with both
|
result in both ts0 and b being created as variables, with both
|
||||||
common_timestamp and field1 additionally being summed as values:
|
common_timestamp and field1 additionally being summed as values:
|
||||||
|
|
||||||
# echo 'hist:keys=pid:vals=$ts0,$b:ts0=common_timestamp,b=field1 ... >> \
|
# echo 'hist:keys=pid:vals=$ts0,$b:ts0=common_timestamp,b=field1 ...' >> \
|
||||||
event/trigger
|
event/trigger
|
||||||
|
|
||||||
Note that variable assignments can appear either preceding or
|
Note that variable assignments can appear either preceding or
|
||||||
following their use. The command below behaves identically to the
|
following their use. The command below behaves identically to the
|
||||||
command above:
|
command above:
|
||||||
|
|
||||||
# echo 'hist:keys=pid:ts0=common_timestamp,b=field1:vals=$ts0,$b ... >> \
|
# echo 'hist:keys=pid:ts0=common_timestamp,b=field1:vals=$ts0,$b ...' >> \
|
||||||
event/trigger
|
event/trigger
|
||||||
|
|
||||||
Any number of variables not bound to a 'vals=' prefix can also be
|
Any number of variables not bound to a 'vals=' prefix can also be
|
||||||
assigned by simply separating them with colons. Below is the same
|
assigned by simply separating them with colons. Below is the same
|
||||||
thing but without the values being summed in the histogram:
|
thing but without the values being summed in the histogram:
|
||||||
|
|
||||||
# echo 'hist:keys=pid:ts0=common_timestamp:b=field1 ... >> event/trigger
|
# echo 'hist:keys=pid:ts0=common_timestamp:b=field1 ...' >> event/trigger
|
||||||
|
|
||||||
Variables set as above can be referenced and used in expressions on
|
Variables set as above can be referenced and used in expressions on
|
||||||
another event.
|
another event.
|
||||||
|
|
||||||
For example, here's how a latency can be calculated:
|
For example, here's how a latency can be calculated:
|
||||||
|
|
||||||
# echo 'hist:keys=pid,prio:ts0=common_timestamp ... >> event1/trigger
|
# echo 'hist:keys=pid,prio:ts0=common_timestamp ...' >> event1/trigger
|
||||||
# echo 'hist:keys=next_pid:wakeup_lat=common_timestamp-$ts0 ... >> event2/trigger
|
# echo 'hist:keys=next_pid:wakeup_lat=common_timestamp-$ts0 ...' >> event2/trigger
|
||||||
|
|
||||||
In the first line above, the event's timetamp is saved into the
|
In the first line above, the event's timetamp is saved into the
|
||||||
variable ts0. In the next line, ts0 is subtracted from the second
|
variable ts0. In the next line, ts0 is subtracted from the second
|
||||||
|
@ -1766,7 +1766,7 @@ yet another variable, 'wakeup_lat'. The hist trigger below in turn
|
||||||
makes use of the wakeup_lat variable to compute a combined latency
|
makes use of the wakeup_lat variable to compute a combined latency
|
||||||
using the same key and variable from yet another event:
|
using the same key and variable from yet another event:
|
||||||
|
|
||||||
# echo 'hist:key=pid:wakeupswitch_lat=$wakeup_lat+$switchtime_lat ... >> event3/trigger
|
# echo 'hist:key=pid:wakeupswitch_lat=$wakeup_lat+$switchtime_lat ...' >> event3/trigger
|
||||||
|
|
||||||
2.2.2 Synthetic Events
|
2.2.2 Synthetic Events
|
||||||
----------------------
|
----------------------
|
||||||
|
@ -1807,10 +1807,11 @@ the command that defined it with a '!':
|
||||||
At this point, there isn't yet an actual 'wakeup_latency' event
|
At this point, there isn't yet an actual 'wakeup_latency' event
|
||||||
instantiated in the event subsytem - for this to happen, a 'hist
|
instantiated in the event subsytem - for this to happen, a 'hist
|
||||||
trigger action' needs to be instantiated and bound to actual fields
|
trigger action' needs to be instantiated and bound to actual fields
|
||||||
and variables defined on other events (see Section 6.3.3 below).
|
and variables defined on other events (see Section 2.2.3 below on
|
||||||
|
how that is done using hist trigger 'onmatch' action). Once that is
|
||||||
|
done, the 'wakeup_latency' synthetic event instance is created.
|
||||||
|
|
||||||
Once that is done, an event instance is created, and a histogram can
|
A histogram can now be defined for the new synthetic event:
|
||||||
be defined using it:
|
|
||||||
|
|
||||||
# echo 'hist:keys=pid,prio,lat.log2:sort=pid,lat' >> \
|
# echo 'hist:keys=pid,prio,lat.log2:sort=pid,lat' >> \
|
||||||
/sys/kernel/debug/tracing/events/synthetic/wakeup_latency/trigger
|
/sys/kernel/debug/tracing/events/synthetic/wakeup_latency/trigger
|
||||||
|
@ -1960,7 +1961,7 @@ hist trigger specification.
|
||||||
back to that pid, the timestamp difference is calculated. If the
|
back to that pid, the timestamp difference is calculated. If the
|
||||||
resulting latency, stored in wakeup_lat, exceeds the current
|
resulting latency, stored in wakeup_lat, exceeds the current
|
||||||
maximum latency, the values specified in the save() fields are
|
maximum latency, the values specified in the save() fields are
|
||||||
recoreded:
|
recorded:
|
||||||
|
|
||||||
# echo 'hist:keys=pid:ts0=common_timestamp.usecs \
|
# echo 'hist:keys=pid:ts0=common_timestamp.usecs \
|
||||||
if comm=="cyclictest"' >> \
|
if comm=="cyclictest"' >> \
|
||||||
|
|
|
@ -139,9 +139,13 @@ static void __local_bh_enable(unsigned int cnt)
|
||||||
{
|
{
|
||||||
lockdep_assert_irqs_disabled();
|
lockdep_assert_irqs_disabled();
|
||||||
|
|
||||||
|
if (preempt_count() == cnt)
|
||||||
|
trace_preempt_on(CALLER_ADDR0, get_lock_parent_ip());
|
||||||
|
|
||||||
if (softirq_count() == (cnt & SOFTIRQ_MASK))
|
if (softirq_count() == (cnt & SOFTIRQ_MASK))
|
||||||
trace_softirqs_on(_RET_IP_);
|
trace_softirqs_on(_RET_IP_);
|
||||||
preempt_count_sub(cnt);
|
|
||||||
|
__preempt_count_sub(cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1360,8 +1360,6 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
|
||||||
void
|
void
|
||||||
update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
|
update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
|
||||||
{
|
{
|
||||||
struct ring_buffer *buf;
|
|
||||||
|
|
||||||
if (tr->stop_count)
|
if (tr->stop_count)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1375,9 +1373,7 @@ update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
|
||||||
|
|
||||||
arch_spin_lock(&tr->max_lock);
|
arch_spin_lock(&tr->max_lock);
|
||||||
|
|
||||||
buf = tr->trace_buffer.buffer;
|
swap(tr->trace_buffer.buffer, tr->max_buffer.buffer);
|
||||||
tr->trace_buffer.buffer = tr->max_buffer.buffer;
|
|
||||||
tr->max_buffer.buffer = buf;
|
|
||||||
|
|
||||||
__update_max_tr(tr, tsk, cpu);
|
__update_max_tr(tr, tsk, cpu);
|
||||||
arch_spin_unlock(&tr->max_lock);
|
arch_spin_unlock(&tr->max_lock);
|
||||||
|
|
|
@ -78,7 +78,8 @@ static const char * ops[] = { OPS };
|
||||||
C(TOO_MANY_PREDS, "Too many terms in predicate expression"), \
|
C(TOO_MANY_PREDS, "Too many terms in predicate expression"), \
|
||||||
C(INVALID_FILTER, "Meaningless filter expression"), \
|
C(INVALID_FILTER, "Meaningless filter expression"), \
|
||||||
C(IP_FIELD_ONLY, "Only 'ip' field is supported for function trace"), \
|
C(IP_FIELD_ONLY, "Only 'ip' field is supported for function trace"), \
|
||||||
C(INVALID_VALUE, "Invalid value (did you forget quotes)?"),
|
C(INVALID_VALUE, "Invalid value (did you forget quotes)?"), \
|
||||||
|
C(NO_FILTER, "No filter found"),
|
||||||
|
|
||||||
#undef C
|
#undef C
|
||||||
#define C(a, b) FILT_ERR_##a
|
#define C(a, b) FILT_ERR_##a
|
||||||
|
@ -550,6 +551,13 @@ predicate_parse(const char *str, int nr_parens, int nr_preds,
|
||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!N) {
|
||||||
|
/* No program? */
|
||||||
|
ret = -EINVAL;
|
||||||
|
parse_error(pe, FILT_ERR_NO_FILTER, ptr - str);
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
|
||||||
prog[N].pred = NULL; /* #13 */
|
prog[N].pred = NULL; /* #13 */
|
||||||
prog[N].target = 1; /* TRUE */
|
prog[N].target = 1; /* TRUE */
|
||||||
prog[N+1].pred = NULL;
|
prog[N+1].pred = NULL;
|
||||||
|
|
|
@ -239,6 +239,7 @@ cmd_record_mcount = \
|
||||||
"$(CC_FLAGS_FTRACE)" ]; then \
|
"$(CC_FLAGS_FTRACE)" ]; then \
|
||||||
$(sub_cmd_record_mcount) \
|
$(sub_cmd_record_mcount) \
|
||||||
fi;
|
fi;
|
||||||
|
endif # -record-mcount
|
||||||
endif # CONFIG_FTRACE_MCOUNT_RECORD
|
endif # CONFIG_FTRACE_MCOUNT_RECORD
|
||||||
|
|
||||||
ifdef CONFIG_STACK_VALIDATION
|
ifdef CONFIG_STACK_VALIDATION
|
||||||
|
@ -263,7 +264,6 @@ ifneq ($(RETPOLINE_CFLAGS),)
|
||||||
objtool_args += --retpoline
|
objtool_args += --retpoline
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
ifdef CONFIG_MODVERSIONS
|
ifdef CONFIG_MODVERSIONS
|
||||||
|
|
Loading…
Reference in New Issue