Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1339738 > unrolled thread
| Started by | Daniel Bristot de Oliveira <bristot@redhat.com> |
|---|---|
| First post | 2016-02-22 18:10 +0100 |
| Last post | 2016-02-22 18:20 +0100 |
| Articles | 7 — 4 participants |
Back to article view | Back to linux.kernel
[PATCH 0/4] Tracepoints for deadline scheduler Daniel Bristot de Oliveira <bristot@redhat.com> - 2016-02-22 18:10 +0100
[PATCH 4/4] tools lib traceevent: Implements '%' operation Daniel Bristot de Oliveira <bristot@redhat.com> - 2016-02-22 18:10 +0100
Re: [PATCH 4/4] tools lib traceevent: Implements '%' operation Steven Rostedt <rostedt@goodmis.org> - 2016-02-22 21:30 +0100
Re: [PATCH 4/4] tools lib traceevent: Implements '%' operation Arnaldo Carvalho de Melo <acme@redhat.com> - 2016-02-23 15:40 +0100
Re: [PATCH 4/4] tools lib traceevent: Implements '%' operation Arnaldo Carvalho de Melo <acme@redhat.com> - 2016-02-23 15:50 +0100
[tip:perf/core] tools lib traceevent: Implement '%' operation tip-bot for Daniel Bristot de Oliveira <tipbot@zytor.com> - 2016-02-25 07:40 +0100
[PATCH 1/4] tracing: Add __print_ns_to_secs() and __print_ns_without_secs() helpers Daniel Bristot de Oliveira <bristot@redhat.com> - 2016-02-22 18:20 +0100
| From | Daniel Bristot de Oliveira <bristot@redhat.com> |
|---|---|
| Date | 2016-02-22 18:10 +0100 |
| Subject | [PATCH 0/4] Tracepoints for deadline scheduler |
| Message-ID | <r529I-AD-9@gated-at.bofh.it> |
Deadline tasks behave differently of other tasks because deadline
task's also depend on their period, deadline and runtime.
Hence, the well known sched:sched_wakeup and sched:sched_switch
tracepoints are not always enough to precisely explain the behavior of a
deadline task with respect to the task's period, deadline and runtime
consumption.
This patch series implements tracepoints for the following deadline
scheduler points of interest:
- sched:sched_deadline_replenish: Informs the periodic runtime
replenishment of a deadline task.
- sched:sched_deadline_yield: Informs that a deadline task called
sched_yield(), and will wait for the next period.
- sched:sched_deadline_throttle: Informs that a task consumed all its
available runtime and was throttled.
- sched:sched_deadline_block: Informs that a deadline task went to sleep
waiting to be awakened by another task.
Daniel Bristot de Oliveira (3):
sched: Move deadline container_of() helper functions into sched.h
sched/deadline: Tracepoints for deadline scheduler
tools lib traceevent: Implements '%' operation
Steven Rostedt (Red Hat) (1):
tracing: Add __print_ns_to_secs() and __print_ns_without_secs()
helpers
include/trace/events/sched.h | 87 ++++++++++++++++++++++++++++++++++++++
include/trace/trace_events.h | 25 +++++++++++
kernel/sched/deadline.c | 34 +++++++--------
kernel/sched/sched.h | 18 ++++++++
tools/lib/traceevent/event-parse.c | 4 ++
5 files changed, 149 insertions(+), 19 deletions(-)
--
2.5.0
[toc] | [next] | [standalone]
| From | Daniel Bristot de Oliveira <bristot@redhat.com> |
|---|---|
| Date | 2016-02-22 18:10 +0100 |
| Subject | [PATCH 4/4] tools lib traceevent: Implements '%' operation |
| Message-ID | <r529J-AD-27@gated-at.bofh.it> |
| In reply to | #1339738 |
The operation '%' is not implemented on event-parse.c, causing an error on the parse of events with '%' operation on its printk format. For example, # perf record -e sched:sched_deadline_yield ~/y Warning: [sched:sched_deadline_yield] unknown op '%' .... # perf script Warning: [sched:sched_deadline_yield] unknown op '%' y 1641 [006] 3364.109319: sched:sched_deadline_yield: \ [FAILED TO PARSE] now=3364109314595 \ deadline=3364139295135 runtime=19975597 This patch implements the '%' operation. With this patch, we see the correct output: # perf record -e sched:sched_deadline_yield ~/y No Warning # perf script y 4005 [001] 4623.650978: sched:sched_deadline_yield: \ now=4623.650974050 \ deadline=4623.680957364 remaining_runtime=19979611 Signed-off-by: Daniel Bristot de Oliveira <bristot@redhat.com> --- tools/lib/traceevent/event-parse.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index c3bd294..575e751 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c @@ -1951,6 +1951,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok) strcmp(token, "*") == 0 || strcmp(token, "^") == 0 || strcmp(token, "/") == 0 || + strcmp(token, "%") == 0 || strcmp(token, "<") == 0 || strcmp(token, ">") == 0 || strcmp(token, "<=") == 0 || @@ -3689,6 +3690,9 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg case '/': val = left / right; break; + case '%': + val = left % right; + break; case '*': val = left * right; break; -- 2.5.0
[toc] | [prev] | [next] | [standalone]
| From | Steven Rostedt <rostedt@goodmis.org> |
|---|---|
| Date | 2016-02-22 21:30 +0100 |
| Subject | Re: [PATCH 4/4] tools lib traceevent: Implements '%' operation |
| Message-ID | <r55hg-2Mm-3@gated-at.bofh.it> |
| In reply to | #1339739 |
On Mon, 22 Feb 2016 14:08:22 -0300 Daniel Bristot de Oliveira <bristot@redhat.com> wrote: > The operation '%' is not implemented on event-parse.c, causing > an error on the parse of events with '%' operation on its > printk format. For example, > > # perf record -e sched:sched_deadline_yield ~/y > Warning: [sched:sched_deadline_yield] unknown op '%' > .... > # perf script > Warning: [sched:sched_deadline_yield] unknown op '%' > y 1641 [006] 3364.109319: sched:sched_deadline_yield: \ > [FAILED TO PARSE] now=3364109314595 \ > deadline=3364139295135 runtime=19975597 > > This patch implements the '%' operation. With this patch, we see the > correct output: > > # perf record -e sched:sched_deadline_yield ~/y > No Warning > > # perf script > y 4005 [001] 4623.650978: sched:sched_deadline_yield: \ > now=4623.650974050 \ > deadline=4623.680957364 remaining_runtime=19979611 > > Signed-off-by: Daniel Bristot de Oliveira <bristot@redhat.com> Arnaldo, This patch is not dependent on the rest of the series and looks like a good general fix. Can you pull this one into your tree, and please add my: Reviewed-by: Steven Rostedt <rsotedt@goodmis.org> Thanks! -- Steve > --- > tools/lib/traceevent/event-parse.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c > index c3bd294..575e751 100644 > --- a/tools/lib/traceevent/event-parse.c > +++ b/tools/lib/traceevent/event-parse.c > @@ -1951,6 +1951,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok) > strcmp(token, "*") == 0 || > strcmp(token, "^") == 0 || > strcmp(token, "/") == 0 || > + strcmp(token, "%") == 0 || > strcmp(token, "<") == 0 || > strcmp(token, ">") == 0 || > strcmp(token, "<=") == 0 || > @@ -3689,6 +3690,9 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg > case '/': > val = left / right; > break; > + case '%': > + val = left % right; > + break; > case '*': > val = left * right; > break;
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@redhat.com> |
|---|---|
| Date | 2016-02-23 15:40 +0100 |
| Subject | Re: [PATCH 4/4] tools lib traceevent: Implements '%' operation |
| Message-ID | <r5mi8-6Kg-61@gated-at.bofh.it> |
| In reply to | #1339894 |
Em Mon, Feb 22, 2016 at 03:23:03PM -0500, Steven Rostedt escreveu: > On Mon, 22 Feb 2016 14:08:22 -0300 > Daniel Bristot de Oliveira <bristot@redhat.com> wrote: > > > The operation '%' is not implemented on event-parse.c, causing > > an error on the parse of events with '%' operation on its > > printk format. For example, > > > > # perf record -e sched:sched_deadline_yield ~/y > > Warning: [sched:sched_deadline_yield] unknown op '%' > > .... > > # perf script > > Warning: [sched:sched_deadline_yield] unknown op '%' > > y 1641 [006] 3364.109319: sched:sched_deadline_yield: \ > > [FAILED TO PARSE] now=3364109314595 \ > > deadline=3364139295135 runtime=19975597 > > > > This patch implements the '%' operation. With this patch, we see the > > correct output: > > > > # perf record -e sched:sched_deadline_yield ~/y > > No Warning > > > > # perf script > > y 4005 [001] 4623.650978: sched:sched_deadline_yield: \ > > now=4623.650974050 \ > > deadline=4623.680957364 remaining_runtime=19979611 > > > > Signed-off-by: Daniel Bristot de Oliveira <bristot@redhat.com> > > Arnaldo, > > This patch is not dependent on the rest of the series and looks like a > good general fix. > > Can you pull this one into your tree, and please add my: > > Reviewed-by: Steven Rostedt <rsotedt@goodmis.org> Done, thanks. - Arnaldo
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@redhat.com> |
|---|---|
| Date | 2016-02-23 15:50 +0100 |
| Subject | Re: [PATCH 4/4] tools lib traceevent: Implements '%' operation |
| Message-ID | <r5mrM-6NG-7@gated-at.bofh.it> |
| In reply to | #1340715 |
Em Tue, Feb 23, 2016 at 11:38:19AM -0300, Arnaldo Carvalho de Melo escreveu: > Em Mon, Feb 22, 2016 at 03:23:03PM -0500, Steven Rostedt escreveu: > > On Mon, 22 Feb 2016 14:08:22 -0300 > > Daniel Bristot de Oliveira <bristot@redhat.com> wrote: > > > > > The operation '%' is not implemented on event-parse.c, causing > > > an error on the parse of events with '%' operation on its > > > printk format. For example, > > > > > > # perf record -e sched:sched_deadline_yield ~/y > > > Warning: [sched:sched_deadline_yield] unknown op '%' > > > .... > > > # perf script Daniel, please add two spaces before examples, specially examples with the '#' root prompt. Had I not done that when applying this patch, those lines would have been removed by git-am, as it would interpret those as comments. Thanks, - Arnaldo
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Daniel Bristot de Oliveira <tipbot@zytor.com> |
|---|---|
| Date | 2016-02-25 07:40 +0100 |
| Subject | [tip:perf/core] tools lib traceevent: Implement '%' operation |
| Message-ID | <r5XKG-8ej-17@gated-at.bofh.it> |
| In reply to | #1339739 |
Commit-ID: 0e47b38dcd24c78d0699b42f28d5986154d2aa11
Gitweb: http://git.kernel.org/tip/0e47b38dcd24c78d0699b42f28d5986154d2aa11
Author: Daniel Bristot de Oliveira <bristot@redhat.com>
AuthorDate: Mon, 22 Feb 2016 14:08:22 -0300
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 23 Feb 2016 11:40:51 -0300
tools lib traceevent: Implement '%' operation
The operation '%' is not implemented on event-parse.c, causing an error
when parsing events with '%' the operation in its printk format. For
example,
# perf record -e sched:sched_deadline_yield ~/yield-test
Warning: [sched:sched_deadline_yield] unknown op '%'
....
# perf script
Warning: [sched:sched_deadline_yield] unknown op '%'
test 1641 [006] 3364.109319: sched:sched_deadline_yield: \
[FAILED TO PARSE] now=3364109314595 \
deadline=3364139295135 runtime=19975597
This patch implements the '%' operation. With this patch, we see the
correct output:
# perf record -e sched:sched_deadline_yield ~/yield-test
No Warning
# perf script
yield-test 4005 [001] 4623.650978: sched:sched_deadline_yield: \
now=4623.650974050 \
deadline=4623.680957364 remaining_runtime=19979611
Signed-off-by: Daniel Bristot de Oliveira <bristot@redhat.com>
Reviewed-by: Steven Rostedt <rostedt@goodmis.org>
Cc: Juri Lelli <juri.lelli@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-rt-users <linux-rt-users@vger.kernel.org>
Link: http://lkml.kernel.org/r/5c96a395c56cea6d3d13d949051bdece86cc26e0.1456157869.git.bristot@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/lib/traceevent/event-parse.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
index c3bd294..575e751 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -1951,6 +1951,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok)
strcmp(token, "*") == 0 ||
strcmp(token, "^") == 0 ||
strcmp(token, "/") == 0 ||
+ strcmp(token, "%") == 0 ||
strcmp(token, "<") == 0 ||
strcmp(token, ">") == 0 ||
strcmp(token, "<=") == 0 ||
@@ -3689,6 +3690,9 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
case '/':
val = left / right;
break;
+ case '%':
+ val = left % right;
+ break;
case '*':
val = left * right;
break;
[toc] | [prev] | [next] | [standalone]
| From | Daniel Bristot de Oliveira <bristot@redhat.com> |
|---|---|
| Date | 2016-02-22 18:20 +0100 |
| Subject | [PATCH 1/4] tracing: Add __print_ns_to_secs() and __print_ns_without_secs() helpers |
| Message-ID | <r52jo-FX-13@gated-at.bofh.it> |
| In reply to | #1339738 |
From: "Steven Rostedt (Red Hat)" <rostedt@goodmis.org>
To have nanosecond output displayed in a more human readable format, its
nicer to convert it to a seconds format (XXX.YYYYYYYYY). The problem is that
to do so, the numbers must be divided by NSEC_PER_SEC, and moded too. But as
these numbers are 64 bit, this can not be done simply with '/' and '%'
operators, but must use do_div() instead.
Instead of performing the expensive do_div() in the hot path of the
tracepoint, it is more efficient to perform it during the output phase. But
passing in do_div() can confuse the parser, and do_div() doesn't work
exactly like a normal C function. It modifies the number in place, and we
don't want to modify the actual values in the ring buffer.
Two helper functions are now created:
__print_ns_to_secs() and __print_ns_without_secs()
They both take a value of nanoseconds, and the former will return that
number divided by NSEC_PER_SEC, and the latter will mod it with NSEC_PER_SEC
giving a way to print a nice human readable format:
__print_fmt("time=%llu.%09u",
__print_ns_to_secs(REC->nsec_val),
__print_ns_without_secs(REC->nsec_val))
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
include/trace/trace_events.h | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/include/trace/trace_events.h b/include/trace/trace_events.h
index 170c93b..23a5822 100644
--- a/include/trace/trace_events.h
+++ b/include/trace/trace_events.h
@@ -283,6 +283,21 @@ TRACE_MAKE_SYSTEM_STR();
trace_print_symbols_seq(p, value, symbols); \
})
+#undef __print_ns_to_secs
+#define __print_ns_to_secs(value) \
+ ({ \
+ u64 ____val = (u64)value; \
+ do_div(____val, NSEC_PER_SEC); \
+ ____val; \
+ })
+
+#undef __print_ns_without_secs
+#define __print_ns_without_secs(value) \
+ ({ \
+ u64 ____val = (u64)value; \
+ do_div(____val, NSEC_PER_SEC); \
+ })
+
#undef __print_symbolic_u64
#if BITS_PER_LONG == 32
#define __print_symbolic_u64(value, symbol_array...) \
@@ -720,6 +735,16 @@ static inline void ftrace_test_probe_##call(void) \
#undef __get_bitmask
#undef __print_array
+/*
+ * The below is not executed in the kernel. It is only what is
+ * displayed in the print format for userspace to parse.
+ */
+#undef __print_ns_to_secs
+#define __print_ns_to_secs(val) val / 1000000000UL
+
+#undef __print_ns_without_secs
+#define __print_ns_without_secs(val) val % 1000000000UL
+
#undef TP_printk
#define TP_printk(fmt, args...) "\"" fmt "\", " __stringify(args)
--
2.5.0
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web