Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1339738 > unrolled thread

[PATCH 0/4] Tracepoints for deadline scheduler

Started byDaniel Bristot de Oliveira <bristot@redhat.com>
First post2016-02-22 18:10 +0100
Last post2016-02-22 18:20 +0100
Articles 7 — 4 participants

Back to article view | Back to linux.kernel


Contents

  [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

#1339738 — [PATCH 0/4] Tracepoints for deadline scheduler

FromDaniel Bristot de Oliveira <bristot@redhat.com>
Date2016-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]


#1339739 — [PATCH 4/4] tools lib traceevent: Implements '%' operation

FromDaniel Bristot de Oliveira <bristot@redhat.com>
Date2016-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]


#1339894 — Re: [PATCH 4/4] tools lib traceevent: Implements '%' operation

FromSteven Rostedt <rostedt@goodmis.org>
Date2016-02-22 21:30 +0100
SubjectRe: [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]


#1340715 — Re: [PATCH 4/4] tools lib traceevent: Implements '%' operation

FromArnaldo Carvalho de Melo <acme@redhat.com>
Date2016-02-23 15:40 +0100
SubjectRe: [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]


#1340718 — Re: [PATCH 4/4] tools lib traceevent: Implements '%' operation

FromArnaldo Carvalho de Melo <acme@redhat.com>
Date2016-02-23 15:50 +0100
SubjectRe: [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]


#1342874 — [tip:perf/core] tools lib traceevent: Implement '%' operation

Fromtip-bot for Daniel Bristot de Oliveira <tipbot@zytor.com>
Date2016-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]


#1339744 — [PATCH 1/4] tracing: Add __print_ns_to_secs() and __print_ns_without_secs() helpers

FromDaniel Bristot de Oliveira <bristot@redhat.com>
Date2016-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