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
5 changed files with 28 additions and 19 deletions
|
@ -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
|
||||
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
|
||||
result in both ts0 and b being created as variables, with both
|
||||
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
|
||||
|
||||
Note that variable assignments can appear either preceding or
|
||||
following their use. The command below behaves identically to the
|
||||
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
|
||||
|
||||
Any number of variables not bound to a 'vals=' prefix can also be
|
||||
assigned by simply separating them with colons. Below is the same
|
||||
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
|
||||
another event.
|
||||
|
||||
For example, here's how a latency can be calculated:
|
||||
|
||||
# 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=pid,prio:ts0=common_timestamp ...' >> event1/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
|
||||
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
|
||||
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
|
||||
----------------------
|
||||
|
@ -1807,10 +1807,11 @@ the command that defined it with a '!':
|
|||
At this point, there isn't yet an actual 'wakeup_latency' event
|
||||
instantiated in the event subsytem - for this to happen, a 'hist
|
||||
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
|
||||
be defined using it:
|
||||
A histogram can now be defined for the new synthetic event:
|
||||
|
||||
# echo 'hist:keys=pid,prio,lat.log2:sort=pid,lat' >> \
|
||||
/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
|
||||
resulting latency, stored in wakeup_lat, exceeds the current
|
||||
maximum latency, the values specified in the save() fields are
|
||||
recoreded:
|
||||
recorded:
|
||||
|
||||
# echo 'hist:keys=pid:ts0=common_timestamp.usecs \
|
||||
if comm=="cyclictest"' >> \
|
||||
|
|
|
@ -139,9 +139,13 @@ static void __local_bh_enable(unsigned int cnt)
|
|||
{
|
||||
lockdep_assert_irqs_disabled();
|
||||
|
||||
if (preempt_count() == cnt)
|
||||
trace_preempt_on(CALLER_ADDR0, get_lock_parent_ip());
|
||||
|
||||
if (softirq_count() == (cnt & SOFTIRQ_MASK))
|
||||
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
|
||||
update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
|
||||
{
|
||||
struct ring_buffer *buf;
|
||||
|
||||
if (tr->stop_count)
|
||||
return;
|
||||
|
||||
|
@ -1375,9 +1373,7 @@ update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
|
|||
|
||||
arch_spin_lock(&tr->max_lock);
|
||||
|
||||
buf = tr->trace_buffer.buffer;
|
||||
tr->trace_buffer.buffer = tr->max_buffer.buffer;
|
||||
tr->max_buffer.buffer = buf;
|
||||
swap(tr->trace_buffer.buffer, tr->max_buffer.buffer);
|
||||
|
||||
__update_max_tr(tr, tsk, cpu);
|
||||
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(INVALID_FILTER, "Meaningless filter expression"), \
|
||||
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
|
||||
#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;
|
||||
}
|
||||
|
||||
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].target = 1; /* TRUE */
|
||||
prog[N+1].pred = NULL;
|
||||
|
|
|
@ -239,6 +239,7 @@ cmd_record_mcount = \
|
|||
"$(CC_FLAGS_FTRACE)" ]; then \
|
||||
$(sub_cmd_record_mcount) \
|
||||
fi;
|
||||
endif # -record-mcount
|
||||
endif # CONFIG_FTRACE_MCOUNT_RECORD
|
||||
|
||||
ifdef CONFIG_STACK_VALIDATION
|
||||
|
@ -263,7 +264,6 @@ ifneq ($(RETPOLINE_CFLAGS),)
|
|||
objtool_args += --retpoline
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
ifdef CONFIG_MODVERSIONS
|
||||
|
|
Loading…
Reference in a new issue