[rt] Update to 4.14.1-rt3

This commit is contained in:
Ben Hutchings 2017-11-29 23:05:39 +00:00
parent b0a4fbf1cd
commit fb72f17cab
378 changed files with 6262 additions and 1392 deletions

1
debian/changelog vendored
View File

@ -21,6 +21,7 @@ linux (4.14.2-1~exp1) UNRELEASED; urgency=medium
* SCSI: Enable SCSI_MQ_DEFAULT. This can be reverted using the kernel * SCSI: Enable SCSI_MQ_DEFAULT. This can be reverted using the kernel
parameter: scsi_mod.use_blk_mq=n parameter: scsi_mod.use_blk_mq=n
* [rt] Add new signing subkey for Steven Rostedt * [rt] Add new signing subkey for Steven Rostedt
* [rt] Update to 4.14.1-rt3
-- Ben Hutchings <ben@decadent.org.uk> Mon, 20 Nov 2017 14:16:28 +0000 -- Ben Hutchings <ben@decadent.org.uk> Mon, 20 Nov 2017 14:16:28 +0000

View File

@ -1,24 +1,28 @@
From: Thomas Gleixner <tglx@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de>
Date: Mon, 13 Nov 2017 20:23:44 +0100 Date: Thu, 23 Nov 2017 16:38:42 +0100
Subject: [PATCH 01/36] timers: Use static keys for migrate_enable and Subject: [PATCH 01/36] timers: Use static keys for migrate_enable/nohz_active
nohz_active Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz
The migration_enabled and nohz_active will be later moved into the bitfield. In The members migrate_enable and nohz_active in the timer/hrtimer per CPU
the bitfield a change to one bit causes RMW operation and without holding a bases have been introduced to avoid accessing global variables for these
lock it might happen that a concurrent change on a second CPU might cause the decisions.
loss of the an update.
To avoid that and since both fields are changed to static_branch. Still that results in a (cache hot) load and conditional branch, which can
be avoided by using static keys.
Implement it with static keys and optimize for the most critical case of
high performance networking which tends to disable the timer migration
functionality.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 4 - include/linux/hrtimer.h | 4 -
kernel/time/hrtimer.c | 17 ++------ kernel/time/hrtimer.c | 17 ++------
kernel/time/tick-internal.h | 21 +++++++--- kernel/time/tick-internal.h | 19 +++++----
kernel/time/tick-sched.c | 2 kernel/time/tick-sched.c | 2
kernel/time/timer.c | 91 ++++++++++++++++++++++---------------------- kernel/time/timer.c | 91 ++++++++++++++++++++++----------------------
5 files changed, 69 insertions(+), 66 deletions(-) 5 files changed, 65 insertions(+), 68 deletions(-)
--- a/include/linux/hrtimer.h --- a/include/linux/hrtimer.h
+++ b/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h
@ -81,34 +85,30 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
hrtimer_reprogram(timer, new_base); hrtimer_reprogram(timer, new_base);
--- a/kernel/time/tick-internal.h --- a/kernel/time/tick-internal.h
+++ b/kernel/time/tick-internal.h +++ b/kernel/time/tick-internal.h
@@ -150,14 +150,25 @@ static inline void tick_nohz_init(void) @@ -150,14 +150,19 @@ static inline void tick_nohz_init(void)
#ifdef CONFIG_NO_HZ_COMMON #ifdef CONFIG_NO_HZ_COMMON
extern unsigned long tick_nohz_active; extern unsigned long tick_nohz_active;
-#else
+extern void timers_update_nohz(void); +extern void timers_update_nohz(void);
+extern struct static_key_false timers_nohz_active; +extern struct static_key_false timers_nohz_active;
+
+static inline bool is_timers_nohz_active(void) +static inline bool is_timers_nohz_active(void)
+{ +{
+ return static_branch_unlikely(&timers_nohz_active); + return static_branch_unlikely(&timers_nohz_active);
+} +}
+ +# ifdef CONFIG_SMP
+#ifdef CONFIG_SMP
+extern struct static_key_false timers_migration_enabled; +extern struct static_key_false timers_migration_enabled;
+#endif +# endif
#else +#else /* CONFIG_NO_HZ_COMMON */
+static inline void timers_update_nohz(void) { } +static inline void timers_update_nohz(void) { }
#define tick_nohz_active (0) #define tick_nohz_active (0)
-#endif -#endif
-
-#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON) -#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON)
-extern void timers_update_migration(bool update_nohz); -extern void timers_update_migration(bool update_nohz);
-#else -#else
-static inline void timers_update_migration(bool update_nohz) { } -static inline void timers_update_migration(bool update_nohz) { }
+static inline bool is_timers_nohz_active(void) +static inline bool is_timers_nohz_active(void) { return false; }
+{
+ return false;
+}
#endif #endif
DECLARE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases); DECLARE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases);

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@ From: Steven Rostedt <rostedt@goodmis.org>
Date: Fri, 22 Sep 2017 14:58:15 -0500 Date: Fri, 22 Sep 2017 14:58:15 -0500
Subject: [PATCH 01/42] tracing: Steve's unofficial trace_recursive_lock() Subject: [PATCH 01/42] tracing: Steve's unofficial trace_recursive_lock()
patch patch
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
On Tue, 5 Sep 2017 16:57:52 -0500 On Tue, 5 Sep 2017 16:57:52 -0500
Tom Zanussi <tom.zanussi@linux.intel.com> wrote: Tom Zanussi <tom.zanussi@linux.intel.com> wrote:

View File

@ -1,7 +1,7 @@
From: Thomas Gleixner <tglx@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:39 +0200 Date: Thu, 23 Nov 2017 16:38:43 +0100
Subject: [PATCH 02/36] hrtimer: Correct blantanly wrong comment Subject: [PATCH 02/36] hrtimer: Correct blantanly wrong comment
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The protection of a hrtimer which runs its callback against migration to a The protection of a hrtimer which runs its callback against migration to a
different CPU has nothing to do with hard interrupt context. different CPU has nothing to do with hard interrupt context.
@ -14,7 +14,6 @@ callback is running.
Reported-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Reported-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 6 +++--- kernel/time/hrtimer.c | 6 +++---

View File

@ -0,0 +1,24 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 17 Nov 2017 14:32:41 -0600
Subject: [PATCH 02/37] tracing: Add Documentation for log2 modifier
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Add a line for the log2 modifier, to keep it aligned with
tracing/README.
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
Documentation/trace/histogram.txt | 1 +
1 file changed, 1 insertion(+)
--- a/Documentation/trace/histogram.txt
+++ b/Documentation/trace/histogram.txt
@@ -73,6 +73,7 @@
.sym-offset display an address as a symbol and offset
.syscall display a syscall id as a system call name
.execname display a common_pid as a program name
+ .log2 display log2 value rather than raw number
Note that in general the semantics of a given field aren't
interpreted when applying a modifier to it, but there are some

View File

@ -2,7 +2,7 @@ From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>
Date: Fri, 22 Sep 2017 14:58:16 -0500 Date: Fri, 22 Sep 2017 14:58:16 -0500
Subject: [PATCH 02/42] tracing: Reverse the order of trace_types_lock and Subject: [PATCH 02/42] tracing: Reverse the order of trace_types_lock and
event_mutex event_mutex
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
In order to make future changes where we need to call In order to make future changes where we need to call
tracing_set_clock() from within an event command, the order of tracing_set_clock() from within an event command, the order of

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:40 +0200 Date: Sun, 22 Oct 2017 23:39:40 +0200
Subject: [PATCH 03/36] hrtimer: Fix kerneldoc for struct hrtimer_cpu_base Subject: [PATCH 03/36] hrtimer: Fix kerneldoc for struct hrtimer_cpu_base
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The sequence '/**' marks the start of a struct description. Add the The sequence '/**' marks the start of a struct description. Add the
missing second asterisk. While at it adapt the ordering of the struct missing second asterisk. While at it adapt the ordering of the struct
@ -9,6 +9,7 @@ members to the struct definition and document the purpose of
expires_next more precisely. expires_next more precisely.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 8 ++++---- include/linux/hrtimer.h | 8 ++++----

View File

@ -1,7 +1,7 @@
From: Vedang Patel <vedang.patel@intel.com> From: Vedang Patel <vedang.patel@intel.com>
Date: Fri, 22 Sep 2017 14:59:41 -0500 Date: Fri, 17 Nov 2017 14:32:42 -0600
Subject: [PATCH 10/42] tracing: Add support to detect and avoid duplicates Subject: [PATCH 03/37] tracing: Add support to detect and avoid duplicates
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
A duplicate in the tracing_map hash table is when 2 different entries A duplicate in the tracing_map hash table is when 2 different entries
have the same key and, as a result, the key_hash. This is possible due have the same key and, as a result, the key_hash. This is possible due
@ -42,6 +42,7 @@ had the same key.
[1] http://lkml.kernel.org/r/cover.1498510759.git.tom.zanussi@linux.intel.com [1] http://lkml.kernel.org/r/cover.1498510759.git.tom.zanussi@linux.intel.com
Signed-off-by: Vedang Patel <vedang.patel@intel.com> Signed-off-by: Vedang Patel <vedang.patel@intel.com>
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/tracing_map.c | 41 ++++++++++++++++++++++++++++++++++++----- kernel/trace/tracing_map.c | 41 ++++++++++++++++++++++++++++++++++++-----

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:58:17 -0500 Date: Fri, 22 Sep 2017 14:58:17 -0500
Subject: [PATCH 03/42] tracing: Exclude 'generic fields' from histograms Subject: [PATCH 03/42] tracing: Exclude 'generic fields' from histograms
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
There are a small number of 'generic fields' (comm/COMM/cpu/CPU) that There are a small number of 'generic fields' (comm/COMM/cpu/CPU) that
are found by trace_find_event_field() but are only meant for are found by trace_find_event_field() but are only meant for

View File

@ -2,7 +2,7 @@ From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:41 +0200 Date: Sun, 22 Oct 2017 23:39:41 +0200
Subject: [PATCH 04/36] hrtimer: Cleanup clock argument in Subject: [PATCH 04/36] hrtimer: Cleanup clock argument in
schedule_hrtimeout_range_clock() schedule_hrtimeout_range_clock()
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
schedule_hrtimeout_range_clock() uses an integer for the clock id schedule_hrtimeout_range_clock() uses an integer for the clock id
instead of the predefined type "clockid_t". The ID of the clock is instead of the predefined type "clockid_t". The ID of the clock is
@ -17,6 +17,7 @@ schedule_hrtimeout_range_clock().
No functional change. No functional change.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 2 +- include/linux/hrtimer.h | 2 +-

View File

@ -1,7 +1,7 @@
From: Vedang Patel <vedang.patel@intel.com> From: Vedang Patel <vedang.patel@intel.com>
Date: Fri, 22 Sep 2017 14:59:42 -0500 Date: Fri, 17 Nov 2017 14:32:43 -0600
Subject: [PATCH 11/42] tracing: Remove code which merges duplicates Subject: [PATCH 04/37] tracing: Remove code which merges duplicates
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
We now have the logic to detect and remove duplicates in the We now have the logic to detect and remove duplicates in the
tracing_map hash table. The code which merges duplicates in the tracing_map hash table. The code which merges duplicates in the
@ -11,6 +11,7 @@ that any rare race condition which might cause duplicates does not go
unnoticed. unnoticed.
Signed-off-by: Vedang Patel <vedang.patel@intel.com> Signed-off-by: Vedang Patel <vedang.patel@intel.com>
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace_events_hist.c | 11 ----- kernel/trace/trace_events_hist.c | 11 -----

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:58:18 -0500 Date: Fri, 22 Sep 2017 14:58:18 -0500
Subject: [PATCH 04/42] tracing: Remove lookups from tracing_map hitcount Subject: [PATCH 04/42] tracing: Remove lookups from tracing_map hitcount
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Lookups inflate the hitcount, making it essentially useless. Only Lookups inflate the hitcount, making it essentially useless. Only
inserts and updates should really affect the hitcount anyway, so inserts and updates should really affect the hitcount anyway, so

View File

@ -1,13 +1,14 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:42 +0200 Date: Sun, 22 Oct 2017 23:39:42 +0200
Subject: [PATCH 05/36] hrtimer: Fix hrtimer function description Subject: [PATCH 05/36] hrtimer: Fix hrtimer function description
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The hrtimer_start[_range_ns]() starts a timer reliable on this CPU only The hrtimer_start[_range_ns]() starts a timer reliable on this CPU only
when HRTIMER_MODE_PINNED is set. Furthermore the HRTIMER_MODE_PINNED mode when HRTIMER_MODE_PINNED is set. Furthermore the HRTIMER_MODE_PINNED mode
is not considered, when a hrtimer is initialized. is not considered, when a hrtimer is initialized.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 6 +++--- include/linux/hrtimer.h | 6 +++---

View File

@ -1,16 +1,13 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:43 -0500 Date: Fri, 17 Nov 2017 14:32:44 -0600
Subject: [PATCH 12/42] ring-buffer: Add interface for setting absolute time Subject: [PATCH 05/37] ring-buffer: Add interface for setting absolute time
stamps stamps
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Define a new function, tracing_set_time_stamp_abs(), which can be used Define a new function, tracing_set_time_stamp_abs(), which can be used
to enable or disable the use of absolute timestamps rather than time to enable or disable the use of absolute timestamps rather than time
deltas for a trace array. deltas for a trace array.
This resets the buffer to prevent a mix of time deltas and absolute
timestamps.
Only the interface is added here; a subsequent patch will add the Only the interface is added here; a subsequent patch will add the
underlying implementation. underlying implementation.
@ -20,9 +17,9 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/ring_buffer.h | 2 ++ include/linux/ring_buffer.h | 2 ++
kernel/trace/ring_buffer.c | 11 +++++++++++ kernel/trace/ring_buffer.c | 11 +++++++++++
kernel/trace/trace.c | 40 +++++++++++++++++++++++++++++++++++++++- kernel/trace/trace.c | 33 ++++++++++++++++++++++++++++++++-
kernel/trace/trace.h | 3 +++ kernel/trace/trace.h | 3 +++
4 files changed, 55 insertions(+), 1 deletion(-) 4 files changed, 48 insertions(+), 1 deletion(-)
--- a/include/linux/ring_buffer.h --- a/include/linux/ring_buffer.h
+++ b/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h
@ -73,7 +70,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
(EVENT_FILE_FL_SOFT_DISABLED | EVENT_FILE_FL_FILTERED)) && (EVENT_FILE_FL_SOFT_DISABLED | EVENT_FILE_FL_FILTERED)) &&
(entry = this_cpu_read(trace_buffered_event))) { (entry = this_cpu_read(trace_buffered_event))) {
/* Try to use the per cpu buffer first */ /* Try to use the per cpu buffer first */
@@ -6297,6 +6297,44 @@ static int tracing_clock_open(struct ino @@ -6297,6 +6297,37 @@ static int tracing_clock_open(struct ino
return ret; return ret;
} }
@ -99,16 +96,9 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ ring_buffer_set_time_stamp_abs(tr->trace_buffer.buffer, abs); + ring_buffer_set_time_stamp_abs(tr->trace_buffer.buffer, abs);
+ +
+ /*
+ * New timestamps may not be consistent with the previous setting.
+ * Reset the buffer so that it doesn't have incomparable timestamps.
+ */
+ tracing_reset_online_cpus(&tr->trace_buffer);
+
+#ifdef CONFIG_TRACER_MAX_TRACE +#ifdef CONFIG_TRACER_MAX_TRACE
+ if (tr->max_buffer.buffer) + if (tr->max_buffer.buffer)
+ ring_buffer_set_time_stamp_abs(tr->max_buffer.buffer, abs); + ring_buffer_set_time_stamp_abs(tr->max_buffer.buffer, abs);
+ tracing_reset_online_cpus(&tr->max_buffer);
+#endif +#endif
+ out: + out:
+ mutex_unlock(&trace_types_lock); + mutex_unlock(&trace_types_lock);

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:58:19 -0500 Date: Fri, 22 Sep 2017 14:58:19 -0500
Subject: [PATCH 05/42] tracing: Increase tracing map KEYS_MAX size Subject: [PATCH 05/42] tracing: Increase tracing map KEYS_MAX size
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The current default for the number of subkeys in a compound key is 2, The current default for the number of subkeys in a compound key is 2,
which is too restrictive. Increase it to a more realistic value of 3. which is too restrictive. Increase it to a more realistic value of 3.

View File

@ -2,7 +2,7 @@ From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:43 +0200 Date: Sun, 22 Oct 2017 23:39:43 +0200
Subject: [PATCH 06/36] hrtimer: Ensure POSIX compliance (relative Subject: [PATCH 06/36] hrtimer: Ensure POSIX compliance (relative
CLOCK_REALTIME hrtimers) CLOCK_REALTIME hrtimers)
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
POSIX specification defines, that relative CLOCK_REALTIME timers are not POSIX specification defines, that relative CLOCK_REALTIME timers are not
affected by clock modifications. Those timers have to use CLOCK_MONOTONIC affected by clock modifications. Those timers have to use CLOCK_MONOTONIC
@ -17,8 +17,8 @@ Check whether the mode has the HRTIMER_MODE_REL bit set instead of
comparing with HRTIMER_MODE_ABS. comparing with HRTIMER_MODE_ABS.
Fixes: 597d0275736d ("timers: Framework for identifying pinned timers") Fixes: 597d0275736d ("timers: Framework for identifying pinned timers")
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 7 ++++++- kernel/time/hrtimer.c | 7 ++++++-

View File

@ -1,8 +1,8 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:44 -0500 Date: Fri, 17 Nov 2017 14:32:45 -0600
Subject: [PATCH 13/42] ring-buffer: Redefine the unimplemented Subject: [PATCH 06/37] ring-buffer: Redefine the unimplemented
RINGBUF_TIME_TIME_STAMP RINGBUF_TYPE_TIME_STAMP
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
RINGBUF_TYPE_TIME_STAMP is defined but not used, and from what I can RINGBUF_TYPE_TIME_STAMP is defined but not used, and from what I can
gather was reserved for something like an absolute timestamp feature gather was reserved for something like an absolute timestamp feature
@ -25,8 +25,8 @@ Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/ring_buffer.h | 12 ++--- include/linux/ring_buffer.h | 12 ++---
kernel/trace/ring_buffer.c | 105 +++++++++++++++++++++++++++++++------------- kernel/trace/ring_buffer.c | 104 ++++++++++++++++++++++++++++++++------------
2 files changed, 83 insertions(+), 34 deletions(-) 2 files changed, 83 insertions(+), 33 deletions(-)
--- a/include/linux/ring_buffer.h --- a/include/linux/ring_buffer.h
+++ b/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h
@ -144,13 +144,11 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
/* Flag when events were overwritten */ /* Flag when events were overwritten */
#define RB_MISSED_EVENTS (1 << 31) #define RB_MISSED_EVENTS (1 << 31)
/* Missed count stored at end */ /* Missed count stored at end */
@@ -2220,13 +2246,16 @@ rb_move_tail(struct ring_buffer_per_cpu @@ -2221,12 +2247,15 @@ rb_move_tail(struct ring_buffer_per_cpu
}
/* Slow path, do not inline */ /* Slow path, do not inline */
-static noinline struct ring_buffer_event * static noinline struct ring_buffer_event *
-rb_add_time_stamp(struct ring_buffer_event *event, u64 delta) -rb_add_time_stamp(struct ring_buffer_event *event, u64 delta)
+static struct noinline ring_buffer_event *
+rb_add_time_stamp(struct ring_buffer_event *event, u64 delta, bool abs) +rb_add_time_stamp(struct ring_buffer_event *event, u64 delta, bool abs)
{ {
- event->type_len = RINGBUF_TYPE_TIME_EXTEND; - event->type_len = RINGBUF_TYPE_TIME_EXTEND;
@ -186,18 +184,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
event = skip_time_extend(event); event = skip_time_extend(event);
/* array[0] holds the actual length for the discarded event */ /* array[0] holds the actual length for the discarded event */
@@ -2488,6 +2519,10 @@ rb_update_write_stamp(struct ring_buffer @@ -2501,10 +2532,11 @@ rb_update_write_stamp(struct ring_buffer
{
u64 delta;
+ /* In TIME_STAMP mode, write_stamp is unused, nothing to do */
+ if (event->type_len == RINGBUF_TYPE_TIME_STAMP)
+ return;
+
/*
* The event first in the commit queue updates the
* time stamp.
@@ -2501,9 +2536,7 @@ rb_update_write_stamp(struct ring_buffer
cpu_buffer->write_stamp = cpu_buffer->write_stamp =
cpu_buffer->commit_page->page->time_stamp; cpu_buffer->commit_page->page->time_stamp;
else if (event->type_len == RINGBUF_TYPE_TIME_EXTEND) { else if (event->type_len == RINGBUF_TYPE_TIME_EXTEND) {
@ -206,9 +193,13 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
- delta += event->time_delta; - delta += event->time_delta;
+ delta = ring_buffer_event_time_stamp(event); + delta = ring_buffer_event_time_stamp(event);
cpu_buffer->write_stamp += delta; cpu_buffer->write_stamp += delta;
+ } else if (event->type_len == RINGBUF_TYPE_TIME_STAMP) {
+ delta = ring_buffer_event_time_stamp(event);
+ cpu_buffer->write_stamp = delta;
} else } else
cpu_buffer->write_stamp += event->time_delta; cpu_buffer->write_stamp += event->time_delta;
@@ -2657,7 +2690,7 @@ static struct ring_buffer_event * }
@@ -2657,7 +2689,7 @@ static struct ring_buffer_event *
* If this is the first commit on the page, then it has the same * If this is the first commit on the page, then it has the same
* timestamp as the page itself. * timestamp as the page itself.
*/ */
@ -217,7 +208,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
info->delta = 0; info->delta = 0;
/* See if we shot pass the end of this buffer page */ /* See if we shot pass the end of this buffer page */
@@ -2735,8 +2768,11 @@ rb_reserve_next_event(struct ring_buffer @@ -2735,8 +2767,11 @@ rb_reserve_next_event(struct ring_buffer
/* make sure this diff is calculated here */ /* make sure this diff is calculated here */
barrier(); barrier();
@ -231,7 +222,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
info.delta = diff; info.delta = diff;
if (unlikely(test_time_stamp(info.delta))) if (unlikely(test_time_stamp(info.delta)))
rb_handle_timestamp(cpu_buffer, &info); rb_handle_timestamp(cpu_buffer, &info);
@@ -3418,14 +3454,12 @@ rb_update_read_stamp(struct ring_buffer_ @@ -3418,14 +3453,13 @@ rb_update_read_stamp(struct ring_buffer_
return; return;
case RINGBUF_TYPE_TIME_EXTEND: case RINGBUF_TYPE_TIME_EXTEND:
@ -244,11 +235,12 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
case RINGBUF_TYPE_TIME_STAMP: case RINGBUF_TYPE_TIME_STAMP:
- /* FIXME: not implemented */ - /* FIXME: not implemented */
+ /* In TIME_STAMP mode, write_stamp is unused, nothing to do */ + delta = ring_buffer_event_time_stamp(event);
+ cpu_buffer->read_stamp = delta;
return; return;
case RINGBUF_TYPE_DATA: case RINGBUF_TYPE_DATA:
@@ -3449,14 +3483,12 @@ rb_update_iter_read_stamp(struct ring_bu @@ -3449,14 +3483,13 @@ rb_update_iter_read_stamp(struct ring_bu
return; return;
case RINGBUF_TYPE_TIME_EXTEND: case RINGBUF_TYPE_TIME_EXTEND:
@ -261,11 +253,12 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
case RINGBUF_TYPE_TIME_STAMP: case RINGBUF_TYPE_TIME_STAMP:
- /* FIXME: not implemented */ - /* FIXME: not implemented */
+ /* In TIME_STAMP mode, write_stamp is unused, nothing to do */ + delta = ring_buffer_event_time_stamp(event);
+ iter->read_stamp = delta;
return; return;
case RINGBUF_TYPE_DATA: case RINGBUF_TYPE_DATA:
@@ -3680,6 +3712,8 @@ rb_buffer_peek(struct ring_buffer_per_cp @@ -3680,6 +3713,8 @@ rb_buffer_peek(struct ring_buffer_per_cp
struct buffer_page *reader; struct buffer_page *reader;
int nr_loops = 0; int nr_loops = 0;
@ -274,7 +267,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
again: again:
/* /*
* We repeat when a time extend is encountered. * We repeat when a time extend is encountered.
@@ -3716,12 +3750,17 @@ rb_buffer_peek(struct ring_buffer_per_cp @@ -3716,12 +3751,17 @@ rb_buffer_peek(struct ring_buffer_per_cp
goto again; goto again;
case RINGBUF_TYPE_TIME_STAMP: case RINGBUF_TYPE_TIME_STAMP:
@ -294,7 +287,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
*ts = cpu_buffer->read_stamp + event->time_delta; *ts = cpu_buffer->read_stamp + event->time_delta;
ring_buffer_normalize_time_stamp(cpu_buffer->buffer, ring_buffer_normalize_time_stamp(cpu_buffer->buffer,
cpu_buffer->cpu, ts); cpu_buffer->cpu, ts);
@@ -3746,6 +3785,9 @@ rb_iter_peek(struct ring_buffer_iter *it @@ -3746,6 +3786,9 @@ rb_iter_peek(struct ring_buffer_iter *it
struct ring_buffer_event *event; struct ring_buffer_event *event;
int nr_loops = 0; int nr_loops = 0;
@ -304,7 +297,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
cpu_buffer = iter->cpu_buffer; cpu_buffer = iter->cpu_buffer;
buffer = cpu_buffer->buffer; buffer = cpu_buffer->buffer;
@@ -3798,12 +3840,17 @@ rb_iter_peek(struct ring_buffer_iter *it @@ -3798,12 +3841,17 @@ rb_iter_peek(struct ring_buffer_iter *it
goto again; goto again;
case RINGBUF_TYPE_TIME_STAMP: case RINGBUF_TYPE_TIME_STAMP:

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:58:20 -0500 Date: Fri, 22 Sep 2017 14:58:20 -0500
Subject: [PATCH 06/42] tracing: Make traceprobe parsing code reusable Subject: [PATCH 06/42] tracing: Make traceprobe parsing code reusable
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
traceprobe_probes_write() and traceprobe_command() actually contain traceprobe_probes_write() and traceprobe_command() actually contain
nothing that ties them to kprobes - the code is generically useful for nothing that ties them to kprobes - the code is generically useful for

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:44 +0200 Date: Sun, 22 Oct 2017 23:39:44 +0200
Subject: [PATCH 07/36] hrtimer: Cleanup hrtimer_mode enum Subject: [PATCH 07/36] hrtimer: Cleanup hrtimer_mode enum
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
It's not obvious that the HRTIMER_MODE variants are bit combinations It's not obvious that the HRTIMER_MODE variants are bit combinations
because all modes are hard coded constants. because all modes are hard coded constants.
@ -12,6 +12,7 @@ modes which combine bits.
While at it get rid of the ugly tail comments. While at it get rid of the ugly tail comments.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 16 +++++++++++----- include/linux/hrtimer.h | 16 +++++++++++-----

View File

@ -0,0 +1,134 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 17 Nov 2017 14:32:46 -0600
Subject: [PATCH 07/37] tracing: Add timestamp_mode trace file
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Add a new option flag indicating whether or not the ring buffer is in
'absolute timestamp' mode.
Currently this is only set/unset by hist triggers that make use of a
$common_timestamp. As such, there's no reason to make this writeable
for users - its purpose is only to allow users to determine
unequivocally whether or not the ring buffer is in that mode (although
absolute timestamps can coexist with the normal delta timestamps, when
the ring buffer is in absolute mode, timestamps written while absolute
mode is in effect take up more space in the buffer, and are not as
efficient).
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
Documentation/trace/ftrace.txt | 24 ++++++++++++++++++++
kernel/trace/trace.c | 47 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 71 insertions(+)
--- a/Documentation/trace/ftrace.txt
+++ b/Documentation/trace/ftrace.txt
@@ -539,6 +539,30 @@ After mounting tracefs you will have acc
See events.txt for more information.
+ timestamp_mode:
+
+ Certain tracers may change the timestamp mode used when
+ logging trace events into the event buffer. Events with
+ different modes can coexist within a buffer but the mode in
+ effect when an event is logged determines which timestamp mode
+ is used for that event. The default timestamp mode is
+ 'delta'.
+
+ Usual timestamp modes for tracing:
+
+ # cat timestamp_mode
+ [delta] absolute
+
+ The timestamp mode with the square brackets around it is the
+ one in effect.
+
+ delta: Default timestamp mode - timestamp is a delta against
+ a per-buffer timestamp.
+
+ absolute: The timestamp is a full timestamp, not a delta
+ against some other value. As such it takes up more
+ space and is less efficient.
+
hwlat_detector:
Directory for the Hardware Latency Detector.
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -4531,6 +4531,9 @@ static const char readme_msg[] =
#ifdef CONFIG_X86_64
" x86-tsc: TSC cycle counter\n"
#endif
+ "\n timestamp_mode\t-view the mode used to timestamp events\n"
+ " delta: Delta difference against a buffer-wide timestamp\n"
+ " absolute: Absolute (standalone) timestamp\n"
"\n trace_marker\t\t- Writes into this file writes into the kernel buffer\n"
"\n trace_marker_raw\t\t- Writes into this file writes binary data into the kernel buffer\n"
" tracing_cpumask\t- Limit which CPUs to trace\n"
@@ -6298,6 +6301,40 @@ static int tracing_clock_open(struct ino
return ret;
}
+static int tracing_time_stamp_mode_show(struct seq_file *m, void *v)
+{
+ struct trace_array *tr = m->private;
+
+ mutex_lock(&trace_types_lock);
+
+ if (ring_buffer_time_stamp_abs(tr->trace_buffer.buffer))
+ seq_puts(m, "delta [absolute]\n");
+ else
+ seq_puts(m, "[delta] absolute\n");
+
+ mutex_unlock(&trace_types_lock);
+
+ return 0;
+}
+
+static int tracing_time_stamp_mode_open(struct inode *inode, struct file *file)
+{
+ struct trace_array *tr = inode->i_private;
+ int ret;
+
+ if (tracing_disabled)
+ return -ENODEV;
+
+ if (trace_array_get(tr))
+ return -ENODEV;
+
+ ret = single_open(file, tracing_time_stamp_mode_show, inode->i_private);
+ if (ret < 0)
+ trace_array_put(tr);
+
+ return ret;
+}
+
int tracing_set_time_stamp_abs(struct trace_array *tr, bool abs)
{
int ret = 0;
@@ -6576,6 +6613,13 @@ static const struct file_operations trac
.write = tracing_clock_write,
};
+static const struct file_operations trace_time_stamp_mode_fops = {
+ .open = tracing_time_stamp_mode_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = tracing_single_release_tr,
+};
+
#ifdef CONFIG_TRACER_SNAPSHOT
static const struct file_operations snapshot_fops = {
.open = tracing_snapshot_open,
@@ -7903,6 +7947,9 @@ init_tracer_tracefs(struct trace_array *
trace_create_file("tracing_on", 0644, d_tracer,
tr, &rb_simple_fops);
+ trace_create_file("timestamp_mode", 0444, d_tracer, tr,
+ &trace_time_stamp_mode_fops);
+
create_trace_options_dir(tr);
#if defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER)

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:58:21 -0500 Date: Fri, 22 Sep 2017 14:58:21 -0500
Subject: [PATCH 07/42] tracing: Clean up hist_field_flags enum Subject: [PATCH 07/42] tracing: Clean up hist_field_flags enum
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
As we add more flags, specifying explicit integers for the flag values As we add more flags, specifying explicit integers for the flag values
becomes more unwieldy and error-prone - switch them over to left-shift becomes more unwieldy and error-prone - switch them over to left-shift

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:58:22 -0500 Date: Fri, 22 Sep 2017 14:58:22 -0500
Subject: [PATCH 08/42] tracing: Add hist_field_name() accessor Subject: [PATCH 08/42] tracing: Add hist_field_name() accessor
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
In preparation for hist_fields that won't be strictly based on In preparation for hist_fields that won't be strictly based on
trace_event_fields, add a new hist_field_name() accessor to allow that trace_event_fields, add a new hist_field_name() accessor to allow that

View File

@ -1,8 +1,8 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:45 -0500 Date: Fri, 17 Nov 2017 14:32:47 -0600
Subject: [PATCH 14/42] tracing: Give event triggers access to Subject: [PATCH 08/37] tracing: Give event triggers access to
ring_buffer_event ring_buffer_event
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The ring_buffer event can provide a timestamp that may be useful to The ring_buffer event can provide a timestamp that may be useful to
various triggers - pass it into the handlers for that purpose. various triggers - pass it into the handlers for that purpose.

View File

@ -1,8 +1,8 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:45 +0200 Date: Sun, 22 Oct 2017 23:39:45 +0200
Subject: [PATCH 08/36] tracing: hrtimer: Take all clock bases and modes into Subject: [PATCH 08/36] tracing/hrtimer: Take all clock bases and modes into
account account
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
So far only CLOCK_MONOTONIC and CLOCK_REALTIME were taken into account as So far only CLOCK_MONOTONIC and CLOCK_REALTIME were taken into account as
well as HRTIMER_MODE_ABS/REL in hrtimer_init tracepoint. The query for well as HRTIMER_MODE_ABS/REL in hrtimer_init tracepoint. The query for
@ -13,6 +13,7 @@ HRTIMER_MODE_PINNED is not evaluated in hrtimer_init() call. But for the
sake of completeness print all given modes. sake of completeness print all given modes.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/trace/events/timer.h | 20 ++++++++++++++++---- include/trace/events/timer.h | 20 ++++++++++++++++----

View File

@ -1,8 +1,8 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:46 -0500 Date: Fri, 17 Nov 2017 14:32:48 -0600
Subject: [PATCH 15/42] tracing: Add ring buffer event param to hist field Subject: [PATCH 09/37] tracing: Add ring buffer event param to hist field
functions functions
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Some events such as timestamps require access to a ring_buffer_event Some events such as timestamps require access to a ring_buffer_event
struct; add a param so that hist field functions can access that. struct; add a param so that hist field functions can access that.

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:58:23 -0500 Date: Fri, 22 Sep 2017 14:58:23 -0500
Subject: [PATCH 09/42] tracing: Reimplement log2 Subject: [PATCH 09/42] tracing: Reimplement log2
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
log2 as currently implemented applies only to u64 trace_event_field log2 as currently implemented applies only to u64 trace_event_field
derived fields, and assumes that anything it's applied to is a u64 derived fields, and assumes that anything it's applied to is a u64

View File

@ -1,8 +1,8 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:46 +0200 Date: Sun, 22 Oct 2017 23:39:46 +0200
Subject: [PATCH 09/36] tracing: hrtimer: Print hrtimer mode in hrtimer_start Subject: [PATCH 09/36] tracing/hrtimer: Print hrtimer mode in hrtimer_start
tracepoint tracepoint
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The hrtimer_start tracepoint lacks the mode information. The mode is The hrtimer_start tracepoint lacks the mode information. The mode is
important because consecutive starts can switch from ABS to REL or from important because consecutive starts can switch from ABS to REL or from
@ -11,6 +11,7 @@ PINNED to non PINNED.
Add the mode information. Add the mode information.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/trace/events/timer.h | 13 ++++++++----- include/trace/events/timer.h | 13 ++++++++-----

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:47 +0200 Date: Sun, 22 Oct 2017 23:39:47 +0200
Subject: [PATCH 10/36] hrtimer: Switch for loop to _ffs() evaluation Subject: [PATCH 10/36] hrtimer: Switch for loop to _ffs() evaluation
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Looping over all clock bases to find active bits is suboptimal if not all Looping over all clock bases to find active bits is suboptimal if not all
bases are active. bases are active.
@ -12,6 +12,7 @@ Peter Zijlstra.
Suggested-by: Peter Zijlstra <peterz@infradead.org> Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 31 +++++++++++++++++++++---------- kernel/time/hrtimer.c | 31 +++++++++++++++++++++----------
@ -19,8 +20,8 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- a/kernel/time/hrtimer.c --- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c
@@ -457,20 +457,34 @@ static inline void hrtimer_update_next_t @@ -448,6 +448,23 @@ static inline void debug_deactivate(stru
#endif trace_hrtimer_cancel(timer);
} }
+static struct hrtimer_clock_base * +static struct hrtimer_clock_base *
@ -40,6 +41,11 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+#define for_each_active_base(base, cpu_base, active) \ +#define for_each_active_base(base, cpu_base, active) \
+ while ((base = __next_base((cpu_base), &(active)))) + while ((base = __next_base((cpu_base), &(active))))
+ +
#if defined(CONFIG_NO_HZ_COMMON) || defined(CONFIG_HIGH_RES_TIMERS)
static inline void hrtimer_update_next_timer(struct hrtimer_cpu_base *cpu_base,
struct hrtimer *timer)
@@ -459,18 +476,15 @@ static inline void hrtimer_update_next_t
static ktime_t __hrtimer_get_next_event(struct hrtimer_cpu_base *cpu_base) static ktime_t __hrtimer_get_next_event(struct hrtimer_cpu_base *cpu_base)
{ {
- struct hrtimer_clock_base *base = cpu_base->clock_base; - struct hrtimer_clock_base *base = cpu_base->clock_base;

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:47 -0500 Date: Fri, 17 Nov 2017 14:32:49 -0600
Subject: [PATCH 16/42] tracing: Break out hist trigger assignment parsing Subject: [PATCH 10/37] tracing: Break out hist trigger assignment parsing
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
This will make it easier to add variables, and makes the parsing code This will make it easier to add variables, and makes the parsing code
cleaner regardless. cleaner regardless.

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:48 +0200 Date: Sun, 22 Oct 2017 23:39:48 +0200
Subject: [PATCH 11/36] hrtimer: Store running timer in hrtimer_clock_base Subject: [PATCH 11/36] hrtimer: Store running timer in hrtimer_clock_base
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The pointer to the currently running timer is stored in hrtimer_cpu_base The pointer to the currently running timer is stored in hrtimer_cpu_base
before the base lock is dropped and the callback is invoked. before the base lock is dropped and the callback is invoked.
@ -27,6 +27,7 @@ looking at the number of cache lines involved for the frequently used
clocks. clocks.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 20 +++++++++----------- include/linux/hrtimer.h | 20 +++++++++-----------

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:48 -0500 Date: Fri, 17 Nov 2017 14:32:50 -0600
Subject: [PATCH 17/42] tracing: Add hist trigger timestamp support Subject: [PATCH 11/37] tracing: Add hist trigger timestamp support
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Add support for a timestamp event field. This is actually a 'pseudo-' Add support for a timestamp event field. This is actually a 'pseudo-'
event field in that it behaves like it's part of the event record, but event field in that it behaves like it's part of the event record, but
@ -12,12 +12,12 @@ To make use of the timestamp field, users can specify
doesn't make much sense on its own either as either a key or value, doesn't make much sense on its own either as either a key or value,
but needs to be supported even so, since follow-on patches will add but needs to be supported even so, since follow-on patches will add
support for making use of this field in time deltas. The '$' is used support for making use of this field in time deltas. The '$' is used
as a prefix on the variable name to indicate that it's not an bonafide as a prefix on the variable name to indicate that it's not a bona fide
event field - so you won't find it in the event description - but event field - so you won't find it in the event description - but
rather it's a synthetic field that can be used like a real field). rather it's a synthetic field that can be used like a real field).
Note that the use of this field requires the ring buffer be put into Note that the use of this field requires the ring buffer be put into
TIME_EXTEND_ABS mode, which saves the complete timestamp for each 'absolute timestamp' mode, which saves the complete timestamp for each
event rather than an offset. This mode will be enabled if and only if event rather than an offset. This mode will be enabled if and only if
a histogram makes use of the "$common_timestamp" field. a histogram makes use of the "$common_timestamp" field.
@ -25,8 +25,8 @@ Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Baohong Liu <baohong.liu@intel.com> Signed-off-by: Baohong Liu <baohong.liu@intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace_events_hist.c | 90 +++++++++++++++++++++++++++++---------- kernel/trace/trace_events_hist.c | 94 +++++++++++++++++++++++++++++----------
1 file changed, 67 insertions(+), 23 deletions(-) 1 file changed, 71 insertions(+), 23 deletions(-)
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@ -212,7 +212,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (trace_event_trigger_enable_disable(file, 1) < 0) { if (trace_event_trigger_enable_disable(file, 1) < 0) {
list_del_rcu(&data->list); list_del_rcu(&data->list);
update_cond_flag(file); update_cond_flag(file);
@@ -1572,6 +1611,11 @@ static void hist_unregister_trigger(char @@ -1572,19 +1611,28 @@ static void hist_unregister_trigger(char
if (unregistered && test->ops->free) if (unregistered && test->ops->free)
test->ops->free(test->ops, test); test->ops->free(test->ops, test);
@ -224,3 +224,20 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} }
static void hist_unreg_all(struct trace_event_file *file) static void hist_unreg_all(struct trace_event_file *file)
{
struct event_trigger_data *test, *n;
+ struct hist_trigger_data *hist_data;
list_for_each_entry_safe(test, n, &file->triggers, list) {
if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
+ hist_data = test->private_data;
list_del_rcu(&test->list);
trace_event_trigger_enable_disable(file, 0);
update_cond_flag(file);
if (test->ops->free)
test->ops->free(test->ops, test);
+ if (hist_data->enable_timestamps)
+ tracing_set_time_stamp_abs(file->tr, false);
}
}
}

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:50 +0200 Date: Sun, 22 Oct 2017 23:39:50 +0200
Subject: [PATCH 12/36] hrtimer: Make room in struct hrtimer_cpu_base Subject: [PATCH 12/36] hrtimer: Make room in struct hrtimer_cpu_base
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The upcoming softirq based hrtimers support requires an additional field in The upcoming softirq based hrtimers support requires an additional field in
the hrtimer_cpu_base struct, which would grow the struct size beyond a the hrtimer_cpu_base struct, which would grow the struct size beyond a
@ -14,6 +14,7 @@ Make them unsigned short to create room for the new struct member. No
functional change. functional change.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 4 ++-- include/linux/hrtimer.h | 4 ++--

View File

@ -1,8 +1,8 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:49 -0500 Date: Fri, 17 Nov 2017 14:32:51 -0600
Subject: [PATCH 18/42] tracing: Add per-element variable support to Subject: [PATCH 12/37] tracing: Add per-element variable support to
tracing_map tracing_map
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
In order to allow information to be passed between trace events, add In order to allow information to be passed between trace events, add
support for per-element variables to tracing_map. This provides a support for per-element variables to tracing_map. This provides a

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:51 +0200 Date: Sun, 22 Oct 2017 23:39:51 +0200
Subject: [PATCH 13/36] hrtimer: Reduce conditional code (hres_active) Subject: [PATCH 13/36] hrtimer: Reduce conditional code (hres_active)
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The hrtimer_cpu_base struct has the CONFIG_HIGH_RES_TIMERS conditional The hrtimer_cpu_base struct has the CONFIG_HIGH_RES_TIMERS conditional
struct member hres_active. All related functions to this member are struct member hres_active. All related functions to this member are
@ -16,6 +16,7 @@ conditionals into common functions, which ensures dead code elimination.
Suggested-by: Thomas Gleixner <tglx@linutronix.de> Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 20 ++++++++------------ include/linux/hrtimer.h | 20 ++++++++------------

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:50 -0500 Date: Fri, 17 Nov 2017 14:32:52 -0600
Subject: [PATCH 19/42] tracing: Add hist_data member to hist_field Subject: [PATCH 13/37] tracing: Add hist_data member to hist_field
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Allow hist_data access via hist_field. Some users of hist_fields Allow hist_data access via hist_field. Some users of hist_fields
require or will require more access to the associated hist_data. require or will require more access to the associated hist_data.

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:52 +0200 Date: Sun, 22 Oct 2017 23:39:52 +0200
Subject: [PATCH 14/36] hrtimer: Use accesor functions instead of direct access Subject: [PATCH 14/36] hrtimer: Use accesor functions instead of direct access
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
__hrtimer_hres_active() is now available unconditionally. Replace the __hrtimer_hres_active() is now available unconditionally. Replace the
direct access to hrtimer_cpu_base.hres_active. direct access to hrtimer_cpu_base.hres_active.
@ -9,6 +9,7 @@ direct access to hrtimer_cpu_base.hres_active.
No functional change. No functional change.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 4 ++-- kernel/time/hrtimer.c | 4 ++--

View File

@ -1,9 +1,9 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:51 -0500 Date: Fri, 17 Nov 2017 14:32:53 -0600
Subject: [PATCH 20/42] tracing: Add usecs modifier for hist trigger timestamps Subject: [PATCH 14/37] tracing: Add usecs modifier for hist trigger timestamps
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Appending .usecs onto a common_timestamp field will cause the Appending .usecs onto a $common_timestamp field will cause the
timestamp value to be in microseconds instead of the default timestamp value to be in microseconds instead of the default
nanoseconds. A typical latency histogram using usecs would look like nanoseconds. A typical latency histogram using usecs would look like
this: this:
@ -17,11 +17,22 @@ timestamp conversion.
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace.c | 8 ++++++++ Documentation/trace/histogram.txt | 1 +
kernel/trace/trace.h | 2 ++ kernel/trace/trace.c | 13 +++++++++++--
kernel/trace/trace_events_hist.c | 28 ++++++++++++++++++++++------ kernel/trace/trace.h | 2 ++
3 files changed, 32 insertions(+), 6 deletions(-) kernel/trace/trace_events_hist.c | 28 ++++++++++++++++++++++------
4 files changed, 36 insertions(+), 8 deletions(-)
--- a/Documentation/trace/histogram.txt
+++ b/Documentation/trace/histogram.txt
@@ -74,6 +74,7 @@
.syscall display a syscall id as a system call name
.execname display a common_pid as a program name
.log2 display log2 value rather than raw number
+ .usecs display a $common_timestamp in microseconds
Note that in general the semantics of a given field aren't
interpreted when applying a modifier to it, but there are some
--- a/kernel/trace/trace.c --- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c +++ b/kernel/trace/trace.c
@@ -1170,6 +1170,14 @@ static struct { @@ -1170,6 +1170,14 @@ static struct {
@ -39,6 +50,18 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
/* /*
* trace_parser_get_init - gets the buffer for trace parser * trace_parser_get_init - gets the buffer for trace parser
*/ */
@@ -4710,8 +4718,9 @@ static const char readme_msg[] =
"\t .sym display an address as a symbol\n"
"\t .sym-offset display an address as a symbol and offset\n"
"\t .execname display a common_pid as a program name\n"
- "\t .syscall display a syscall id as a syscall name\n\n"
- "\t .log2 display log2 value rather than raw number\n\n"
+ "\t .syscall display a syscall id as a syscall name\n"
+ "\t .log2 display log2 value rather than raw number\n"
+ "\t .usecs display a $common_timestamp in microseconds\n\n"
"\t The 'pause' parameter can be used to pause an existing hist\n"
"\t trigger or to start a hist trigger but not log any events\n"
"\t until told to do so. 'continue' can be used to start or\n"
--- a/kernel/trace/trace.h --- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h +++ b/kernel/trace/trace.h
@@ -289,6 +289,8 @@ extern void trace_array_put(struct trace @@ -289,6 +289,8 @@ extern void trace_array_put(struct trace

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:53 +0200 Date: Sun, 22 Oct 2017 23:39:53 +0200
Subject: [PATCH 15/36] hrtimer: Make the remote enqueue check unconditional Subject: [PATCH 15/36] hrtimer: Make the remote enqueue check unconditional
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
hrtimer_cpu_base.expires_next is used to cache the next event armed in the hrtimer_cpu_base.expires_next is used to cache the next event armed in the
timer hardware. The value is used to check whether an hrtimer can be timer hardware. The value is used to check whether an hrtimer can be
@ -22,6 +22,7 @@ hrtimer_cpu_base.expires_next yet. This will be changed with later patches
which further reduce the #ifdef zoo in this code. which further reduce the #ifdef zoo in this code.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 6 +++--- include/linux/hrtimer.h | 6 +++---

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:52 -0500 Date: Fri, 17 Nov 2017 14:32:54 -0600
Subject: [PATCH 21/42] tracing: Add variable support to hist triggers Subject: [PATCH 15/37] tracing: Add variable support to hist triggers
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Add support for saving the value of a current event's event field by Add support for saving the value of a current event's event field by
assigning it to a variable that can be read by a subsequent event. assigning it to a variable that can be read by a subsequent event.
@ -12,23 +12,23 @@ to any event field.
Both keys and values can be saved and retrieved in this way: Both keys and values can be saved and retrieved in this way:
# echo 'hist:keys=next_pid:vals=$ts0:ts0=common_timestamp ... # echo 'hist:keys=next_pid:vals=$ts0:ts0=$common_timestamp ...
# echo 'hist:timer_pid=common_pid:key=$timer_pid ...' # echo 'hist:timer_pid=common_pid:key=$timer_pid ...'
If a variable isn't a key variable or prefixed with 'vals=', the 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:... # echo 'hist:keys=next_pid:ts1=$common_timestamp:...
Multiple variables can be assigned at the same time: Multiple variables can be assigned at the same time:
# echo 'hist:keys=pid:vals=$ts0,$b,field2:ts0=common_timestamp,b=field1 ... # echo 'hist:keys=pid:vals=$ts0,$b,field2:ts0=$common_timestamp,b=field1 ...
Multiple (or single) variables can also be assigned at the same time Multiple (or single) variables can also be assigned at the same time
using separate assignments: using separate assignments:
# echo 'hist:keys=pid:vals=$ts0:ts0=common_timestamp:b=field1:c=field2 ... # echo 'hist:keys=pid:vals=$ts0:ts0=$common_timestamp:b=field1:c=field2 ...
Variables set as above can be used by being referenced from another Variables set as above can be used by being referenced from another
event, as described in a subsequent patch. event, as described in a subsequent patch.
@ -37,8 +37,8 @@ Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Baohong Liu <baohong.liu@intel.com> Signed-off-by: Baohong Liu <baohong.liu@intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace_events_hist.c | 374 ++++++++++++++++++++++++++++++++++----- kernel/trace/trace_events_hist.c | 372 ++++++++++++++++++++++++++++++++++-----
1 file changed, 334 insertions(+), 40 deletions(-) 1 file changed, 332 insertions(+), 40 deletions(-)
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@ -64,12 +64,11 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
}; };
static u64 hist_field_none(struct hist_field *field, void *event, static u64 hist_field_none(struct hist_field *field, void *event,
@@ -138,6 +146,14 @@ enum hist_field_flags { @@ -138,6 +146,13 @@ enum hist_field_flags {
HIST_FIELD_FL_LOG2 = 1 << 9, HIST_FIELD_FL_LOG2 = 1 << 9,
HIST_FIELD_FL_TIMESTAMP = 1 << 10, HIST_FIELD_FL_TIMESTAMP = 1 << 10,
HIST_FIELD_FL_TIMESTAMP_USECS = 1 << 11, HIST_FIELD_FL_TIMESTAMP_USECS = 1 << 11,
+ HIST_FIELD_FL_VAR = 1 << 12, + HIST_FIELD_FL_VAR = 1 << 12,
+ HIST_FIELD_FL_VAR_ONLY = 1 << 13,
+}; +};
+ +
+struct var_defs { +struct var_defs {
@ -79,7 +78,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
}; };
struct hist_trigger_attrs { struct hist_trigger_attrs {
@@ -150,13 +166,20 @@ struct hist_trigger_attrs { @@ -150,13 +165,19 @@ struct hist_trigger_attrs {
bool clear; bool clear;
bool ts_in_usecs; bool ts_in_usecs;
unsigned int map_bits; unsigned int map_bits;
@ -97,11 +96,10 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
unsigned int n_keys; unsigned int n_keys;
unsigned int n_fields; unsigned int n_fields;
+ unsigned int n_vars; + unsigned int n_vars;
+ unsigned int n_var_only;
unsigned int key_size; unsigned int key_size;
struct tracing_map_sort_key sort_keys[TRACING_MAP_SORT_KEYS_MAX]; struct tracing_map_sort_key sort_keys[TRACING_MAP_SORT_KEYS_MAX];
unsigned int n_sort_keys; unsigned int n_sort_keys;
@@ -164,6 +187,7 @@ struct hist_trigger_data { @@ -164,6 +185,7 @@ struct hist_trigger_data {
struct hist_trigger_attrs *attrs; struct hist_trigger_attrs *attrs;
struct tracing_map *map; struct tracing_map *map;
bool enable_timestamps; bool enable_timestamps;
@ -109,7 +107,56 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
}; };
static u64 hist_field_timestamp(struct hist_field *hist_field, void *event, static u64 hist_field_timestamp(struct hist_field *hist_field, void *event,
@@ -262,9 +286,14 @@ static int parse_map_size(char *str) @@ -180,6 +202,48 @@ static u64 hist_field_timestamp(struct h
return ts;
}
+static struct hist_field *find_var_field(struct hist_trigger_data *hist_data,
+ const char *var_name)
+{
+ struct hist_field *hist_field, *found = NULL;
+ int i;
+
+ for_each_hist_field(i, hist_data) {
+ hist_field = hist_data->fields[i];
+ if (hist_field && hist_field->flags & HIST_FIELD_FL_VAR &&
+ strcmp(hist_field->var.name, var_name) == 0) {
+ found = hist_field;
+ break;
+ }
+ }
+
+ return found;
+}
+
+static struct hist_field *find_var(struct hist_trigger_data *hist_data,
+ struct trace_event_file *file,
+ const char *var_name)
+{
+ struct hist_trigger_data *test_data;
+ struct event_trigger_data *test;
+ struct hist_field *hist_field;
+
+ hist_field = find_var_field(hist_data, var_name);
+ if (hist_field)
+ return hist_field;
+
+ list_for_each_entry_rcu(test, &file->triggers, list) {
+ if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
+ test_data = test->private_data;
+ hist_field = find_var_field(test_data, var_name);
+ if (hist_field)
+ return hist_field;
+ }
+ }
+
+ return NULL;
+}
+
static const char *hist_field_name(struct hist_field *field,
unsigned int level)
{
@@ -262,9 +326,14 @@ static int parse_map_size(char *str)
static void destroy_hist_trigger_attrs(struct hist_trigger_attrs *attrs) static void destroy_hist_trigger_attrs(struct hist_trigger_attrs *attrs)
{ {
@ -124,7 +171,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
kfree(attrs->name); kfree(attrs->name);
kfree(attrs->sort_key_str); kfree(attrs->sort_key_str);
kfree(attrs->keys_str); kfree(attrs->keys_str);
@@ -311,8 +340,22 @@ static int parse_assignment(char *str, s @@ -311,8 +380,22 @@ static int parse_assignment(char *str, s
goto out; goto out;
} }
attrs->map_bits = map_bits; attrs->map_bits = map_bits;
@ -149,7 +196,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
out: out:
return ret; return ret;
} }
@@ -428,12 +471,15 @@ static void destroy_hist_field(struct hi @@ -428,12 +511,15 @@ static void destroy_hist_field(struct hi
for (i = 0; i < HIST_FIELD_OPERANDS_MAX; i++) for (i = 0; i < HIST_FIELD_OPERANDS_MAX; i++)
destroy_hist_field(hist_field->operands[i], level + 1); destroy_hist_field(hist_field->operands[i], level + 1);
@ -166,7 +213,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
{ {
struct hist_field *hist_field; struct hist_field *hist_field;
@@ -459,7 +505,7 @@ static struct hist_field *create_hist_fi @@ -459,7 +545,7 @@ static struct hist_field *create_hist_fi
if (flags & HIST_FIELD_FL_LOG2) { if (flags & HIST_FIELD_FL_LOG2) {
unsigned long fl = flags & ~HIST_FIELD_FL_LOG2; unsigned long fl = flags & ~HIST_FIELD_FL_LOG2;
hist_field->fn = hist_field_log2; hist_field->fn = hist_field_log2;
@ -175,7 +222,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
hist_field->size = hist_field->operands[0]->size; hist_field->size = hist_field->operands[0]->size;
goto out; goto out;
} }
@@ -494,14 +540,23 @@ static struct hist_field *create_hist_fi @@ -494,14 +580,23 @@ static struct hist_field *create_hist_fi
hist_field->field = field; hist_field->field = field;
hist_field->flags = flags; hist_field->flags = flags;
@ -200,7 +247,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (hist_data->fields[i]) { if (hist_data->fields[i]) {
destroy_hist_field(hist_data->fields[i], 0); destroy_hist_field(hist_data->fields[i], 0);
hist_data->fields[i] = NULL; hist_data->fields[i] = NULL;
@@ -512,11 +567,12 @@ static void destroy_hist_fields(struct h @@ -512,11 +607,12 @@ static void destroy_hist_fields(struct h
static int create_hitcount_val(struct hist_trigger_data *hist_data) static int create_hitcount_val(struct hist_trigger_data *hist_data)
{ {
hist_data->fields[HITCOUNT_IDX] = hist_data->fields[HITCOUNT_IDX] =
@ -214,7 +261,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX)) if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX))
return -EINVAL; return -EINVAL;
@@ -524,19 +580,53 @@ static int create_hitcount_val(struct hi @@ -524,19 +620,16 @@ static int create_hitcount_val(struct hi
return 0; return 0;
} }
@ -222,43 +269,6 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
- unsigned int val_idx, - unsigned int val_idx,
- struct trace_event_file *file, - struct trace_event_file *file,
- char *field_str) - char *field_str)
+static struct hist_field *find_var_field(struct hist_trigger_data *hist_data,
+ const char *var_name)
+{
+ struct hist_field *hist_field, *found = NULL;
+ int i;
+
+ for_each_hist_field(i, hist_data) {
+ hist_field = hist_data->fields[i];
+ if (hist_field && hist_field->flags & HIST_FIELD_FL_VAR &&
+ strcmp(hist_field->var.name, var_name) == 0) {
+ found = hist_field;
+ break;
+ }
+ }
+
+ return found;
+}
+
+static struct hist_field *find_var(struct trace_event_file *file,
+ const char *var_name)
+{
+ struct hist_trigger_data *hist_data;
+ struct event_trigger_data *test;
+ struct hist_field *hist_field;
+
+ list_for_each_entry_rcu(test, &file->triggers, list) {
+ if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
+ hist_data = test->private_data;
+ hist_field = find_var_field(hist_data, var_name);
+ if (hist_field)
+ return hist_field;
+ }
+ }
+
+ return NULL;
+}
+
+static int __create_val_field(struct hist_trigger_data *hist_data, +static int __create_val_field(struct hist_trigger_data *hist_data,
+ unsigned int val_idx, + unsigned int val_idx,
+ struct trace_event_file *file, + struct trace_event_file *file,
@ -276,7 +286,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
field_name = strsep(&field_str, "."); field_name = strsep(&field_str, ".");
if (field_str) { if (field_str) {
if (strcmp(field_str, "hex") == 0) if (strcmp(field_str, "hex") == 0)
@@ -558,25 +648,65 @@ static int create_val_field(struct hist_ @@ -558,25 +651,58 @@ static int create_val_field(struct hist_
} }
} }
@ -291,9 +301,6 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ ++hist_data->n_fields; + ++hist_data->n_fields;
- if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX)) - if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX))
+ if (hist_data->fields[val_idx]->flags & HIST_FIELD_FL_VAR_ONLY)
+ hist_data->n_var_only++;
+
+ if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX)) + if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX))
ret = -EINVAL; ret = -EINVAL;
out: out:
@ -320,18 +327,14 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ if (WARN_ON(val_idx >= TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX)) + if (WARN_ON(val_idx >= TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX))
+ return -EINVAL; + return -EINVAL;
+ + if (find_var(hist_data, file, var_name) && !hist_data->remove) {
+ if (find_var(file, var_name) && !hist_data->remove) {
+ return -EINVAL; + return -EINVAL;
+ } + }
+ +
+ flags |= HIST_FIELD_FL_VAR; + flags |= HIST_FIELD_FL_VAR;
+ hist_data->n_vars++; + hist_data->n_vars++;
+ if (hist_data->n_vars > TRACING_MAP_VARS_MAX) { + if (WARN_ON(hist_data->n_vars > TRACING_MAP_VARS_MAX))
+ return -EINVAL; + return -EINVAL;
+ }
+
+ flags |= HIST_FIELD_FL_VAR_ONLY;
+ +
+ return __create_val_field(hist_data, val_idx, file, var_name, expr_str, flags); + return __create_val_field(hist_data, val_idx, file, var_name, expr_str, flags);
+} +}
@ -345,7 +348,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
int ret; int ret;
ret = create_hitcount_val(hist_data); ret = create_hitcount_val(hist_data);
@@ -596,12 +726,15 @@ static int create_val_fields(struct hist @@ -596,12 +722,15 @@ static int create_val_fields(struct hist
field_str = strsep(&fields_str, ","); field_str = strsep(&fields_str, ",");
if (!field_str) if (!field_str)
break; break;
@ -361,7 +364,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (fields_str && (strcmp(fields_str, "hitcount") != 0)) if (fields_str && (strcmp(fields_str, "hitcount") != 0))
ret = -EINVAL; ret = -EINVAL;
out: out:
@@ -615,11 +748,12 @@ static int create_key_field(struct hist_ @@ -615,11 +744,12 @@ static int create_key_field(struct hist_
char *field_str) char *field_str)
{ {
struct ftrace_event_field *field = NULL; struct ftrace_event_field *field = NULL;
@ -375,7 +378,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
return -EINVAL; return -EINVAL;
flags |= HIST_FIELD_FL_KEY; flags |= HIST_FIELD_FL_KEY;
@@ -627,6 +761,7 @@ static int create_key_field(struct hist_ @@ -627,6 +757,7 @@ static int create_key_field(struct hist_
if (strcmp(field_str, "stacktrace") == 0) { if (strcmp(field_str, "stacktrace") == 0) {
flags |= HIST_FIELD_FL_STACKTRACE; flags |= HIST_FIELD_FL_STACKTRACE;
key_size = sizeof(unsigned long) * HIST_STACKTRACE_DEPTH; key_size = sizeof(unsigned long) * HIST_STACKTRACE_DEPTH;
@ -383,7 +386,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} else { } else {
char *field_name = strsep(&field_str, "."); char *field_name = strsep(&field_str, ".");
@@ -672,7 +807,7 @@ static int create_key_field(struct hist_ @@ -672,7 +803,7 @@ static int create_key_field(struct hist_
} }
} }
@ -392,7 +395,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (!hist_data->fields[key_idx]) { if (!hist_data->fields[key_idx]) {
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
@@ -688,6 +823,7 @@ static int create_key_field(struct hist_ @@ -688,6 +819,7 @@ static int create_key_field(struct hist_
} }
hist_data->n_keys++; hist_data->n_keys++;
@ -400,7 +403,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (WARN_ON(hist_data->n_keys > TRACING_MAP_KEYS_MAX)) if (WARN_ON(hist_data->n_keys > TRACING_MAP_KEYS_MAX))
return -EINVAL; return -EINVAL;
@@ -731,21 +867,108 @@ static int create_key_fields(struct hist @@ -731,21 +863,111 @@ static int create_key_fields(struct hist
return ret; return ret;
} }
@ -455,6 +458,11 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ goto free; + goto free;
+ } + }
+ +
+ if (n_vars == TRACING_MAP_VARS_MAX) {
+ ret = -EINVAL;
+ goto free;
+ }
+
+ s = kstrdup(var_name, GFP_KERNEL); + s = kstrdup(var_name, GFP_KERNEL);
+ if (!s) { + if (!s) {
+ ret = -ENOMEM; + ret = -ENOMEM;
@ -464,15 +472,13 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ s = kstrdup(field_str, GFP_KERNEL); + s = kstrdup(field_str, GFP_KERNEL);
+ if (!s) { + if (!s) {
+ kfree(hist_data->attrs->var_defs.name[n_vars]);
+ ret = -ENOMEM; + ret = -ENOMEM;
+ goto free; + goto free;
+ } + }
+ hist_data->attrs->var_defs.expr[n_vars++] = s; + hist_data->attrs->var_defs.expr[n_vars++] = s;
+ +
+ hist_data->attrs->var_defs.n_vars = n_vars; + hist_data->attrs->var_defs.n_vars = n_vars;
+
+ if (n_vars == TRACING_MAP_VARS_MAX)
+ goto free;
+ } + }
+ } + }
+ +
@ -511,7 +517,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
return ret; return ret;
} }
@@ -768,7 +991,7 @@ static int create_sort_keys(struct hist_ @@ -768,7 +990,7 @@ static int create_sort_keys(struct hist_
char *fields_str = hist_data->attrs->sort_key_str; char *fields_str = hist_data->attrs->sort_key_str;
struct tracing_map_sort_key *sort_key; struct tracing_map_sort_key *sort_key;
int descending, ret = 0; int descending, ret = 0;
@ -520,7 +526,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
hist_data->n_sort_keys = 1; /* we always have at least one, hitcount */ hist_data->n_sort_keys = 1; /* we always have at least one, hitcount */
@@ -816,12 +1039,19 @@ static int create_sort_keys(struct hist_ @@ -816,12 +1038,19 @@ static int create_sort_keys(struct hist_
continue; continue;
} }
@ -529,7 +535,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ unsigned int idx; + unsigned int idx;
+ +
hist_field = hist_data->fields[j]; hist_field = hist_data->fields[j];
+ if (hist_field->flags & HIST_FIELD_FL_VAR_ONLY) + if (hist_field->flags & HIST_FIELD_FL_VAR)
+ continue; + continue;
+ +
+ idx = k++; + idx = k++;
@ -542,7 +548,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
descending = is_descending(field_str); descending = is_descending(field_str);
if (descending < 0) { if (descending < 0) {
ret = descending; ret = descending;
@@ -836,6 +1066,7 @@ static int create_sort_keys(struct hist_ @@ -836,6 +1065,7 @@ static int create_sort_keys(struct hist_
break; break;
} }
} }
@ -550,7 +556,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
hist_data->n_sort_keys = i; hist_data->n_sort_keys = i;
out: out:
return ret; return ret;
@@ -876,12 +1107,19 @@ static int create_tracing_map_fields(str @@ -876,12 +1106,19 @@ static int create_tracing_map_fields(str
idx = tracing_map_add_key_field(map, idx = tracing_map_add_key_field(map,
hist_field->offset, hist_field->offset,
cmp_fn); cmp_fn);
@ -572,7 +578,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} }
return 0; return 0;
@@ -905,7 +1143,8 @@ static bool need_tracing_map_ops(struct @@ -905,7 +1142,8 @@ static bool need_tracing_map_ops(struct
static struct hist_trigger_data * static struct hist_trigger_data *
create_hist_data(unsigned int map_bits, create_hist_data(unsigned int map_bits,
struct hist_trigger_attrs *attrs, struct hist_trigger_attrs *attrs,
@ -582,7 +588,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
{ {
const struct tracing_map_ops *map_ops = NULL; const struct tracing_map_ops *map_ops = NULL;
struct hist_trigger_data *hist_data; struct hist_trigger_data *hist_data;
@@ -916,6 +1155,7 @@ create_hist_data(unsigned int map_bits, @@ -916,6 +1154,7 @@ create_hist_data(unsigned int map_bits,
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
hist_data->attrs = attrs; hist_data->attrs = attrs;
@ -590,7 +596,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
ret = create_hist_fields(hist_data, file); ret = create_hist_fields(hist_data, file);
if (ret) if (ret)
@@ -962,14 +1202,29 @@ static void hist_trigger_elt_update(stru @@ -962,14 +1201,28 @@ static void hist_trigger_elt_update(stru
struct ring_buffer_event *rbe) struct ring_buffer_event *rbe)
{ {
struct hist_field *hist_field; struct hist_field *hist_field;
@ -605,8 +611,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ if (hist_field->flags & HIST_FIELD_FL_VAR) { + if (hist_field->flags & HIST_FIELD_FL_VAR) {
+ var_idx = hist_field->var.idx; + var_idx = hist_field->var.idx;
+ tracing_map_set_var(elt, var_idx, hist_val); + tracing_map_set_var(elt, var_idx, hist_val);
+ if (hist_field->flags & HIST_FIELD_FL_VAR_ONLY) + continue;
+ continue;
+ } + }
tracing_map_update_sum(elt, i, hist_val); tracing_map_update_sum(elt, i, hist_val);
} }
@ -622,7 +627,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} }
static inline void add_to_key(char *compound_key, void *key, static inline void add_to_key(char *compound_key, void *key,
@@ -1144,6 +1399,9 @@ hist_trigger_entry_print(struct seq_file @@ -1144,6 +1397,9 @@ hist_trigger_entry_print(struct seq_file
for (i = 1; i < hist_data->n_vals; i++) { for (i = 1; i < hist_data->n_vals; i++) {
field_name = hist_field_name(hist_data->fields[i], 0); field_name = hist_field_name(hist_data->fields[i], 0);
@ -632,7 +637,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (hist_data->fields[i]->flags & HIST_FIELD_FL_HEX) { if (hist_data->fields[i]->flags & HIST_FIELD_FL_HEX) {
seq_printf(m, " %s: %10llx", field_name, seq_printf(m, " %s: %10llx", field_name,
tracing_map_read_sum(elt, i)); tracing_map_read_sum(elt, i));
@@ -1267,6 +1525,9 @@ static void hist_field_print(struct seq_ @@ -1267,6 +1523,9 @@ static void hist_field_print(struct seq_
{ {
const char *field_name = hist_field_name(hist_field, 0); const char *field_name = hist_field_name(hist_field, 0);
@ -642,17 +647,17 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (hist_field->flags & HIST_FIELD_FL_TIMESTAMP) if (hist_field->flags & HIST_FIELD_FL_TIMESTAMP)
seq_puts(m, "$common_timestamp"); seq_puts(m, "$common_timestamp");
else if (field_name) else if (field_name)
@@ -1285,7 +1546,8 @@ static int event_hist_trigger_print(stru @@ -1285,7 +1544,8 @@ static int event_hist_trigger_print(stru
struct event_trigger_data *data) struct event_trigger_data *data)
{ {
struct hist_trigger_data *hist_data = data->private_data; struct hist_trigger_data *hist_data = data->private_data;
- struct hist_field *key_field; - struct hist_field *key_field;
+ bool have_var_only = false;
+ struct hist_field *field; + struct hist_field *field;
+ bool have_var = false;
unsigned int i; unsigned int i;
seq_puts(m, "hist:"); seq_puts(m, "hist:");
@@ -1296,25 +1558,47 @@ static int event_hist_trigger_print(stru @@ -1296,25 +1556,47 @@ static int event_hist_trigger_print(stru
seq_puts(m, "keys="); seq_puts(m, "keys=");
for_each_hist_key_field(i, hist_data) { for_each_hist_key_field(i, hist_data) {
@ -674,8 +679,8 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
for_each_hist_val_field(i, hist_data) { for_each_hist_val_field(i, hist_data) {
+ field = hist_data->fields[i]; + field = hist_data->fields[i];
+ if (field->flags & HIST_FIELD_FL_VAR_ONLY) { + if (field->flags & HIST_FIELD_FL_VAR) {
+ have_var_only = true; + have_var = true;
+ continue; + continue;
+ } + }
+ +
@ -688,7 +693,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ } + }
+ } + }
+ +
+ if (have_var_only) { + if (have_var) {
+ unsigned int n = 0; + unsigned int n = 0;
+ +
+ seq_puts(m, ":"); + seq_puts(m, ":");
@ -696,7 +701,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ for_each_hist_val_field(i, hist_data) { + for_each_hist_val_field(i, hist_data) {
+ field = hist_data->fields[i]; + field = hist_data->fields[i];
+ +
+ if (field->flags & HIST_FIELD_FL_VAR_ONLY) { + if (field->flags & HIST_FIELD_FL_VAR) {
+ if (n++) + if (n++)
+ seq_puts(m, ","); + seq_puts(m, ",");
+ hist_field_print(m, field); + hist_field_print(m, field);
@ -704,32 +709,32 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} }
} }
@@ -1322,7 +1606,10 @@ static int event_hist_trigger_print(stru @@ -1322,7 +1604,10 @@ static int event_hist_trigger_print(stru
for (i = 0; i < hist_data->n_sort_keys; i++) { for (i = 0; i < hist_data->n_sort_keys; i++) {
struct tracing_map_sort_key *sort_key; struct tracing_map_sort_key *sort_key;
- unsigned int idx; - unsigned int idx;
+ unsigned int idx, first_key_idx; + unsigned int idx, first_key_idx;
+ +
+ /* skip VAR_ONLY vals */ + /* skip VAR vals */
+ first_key_idx = hist_data->n_vals - hist_data->n_var_only; + first_key_idx = hist_data->n_vals - hist_data->n_vars;
sort_key = &hist_data->sort_keys[i]; sort_key = &hist_data->sort_keys[i];
idx = sort_key->field_idx; idx = sort_key->field_idx;
@@ -1335,8 +1622,11 @@ static int event_hist_trigger_print(stru @@ -1335,8 +1620,11 @@ static int event_hist_trigger_print(stru
if (idx == HITCOUNT_IDX) if (idx == HITCOUNT_IDX)
seq_puts(m, "hitcount"); seq_puts(m, "hitcount");
- else - else
+ else { + else {
+ if (idx >= first_key_idx) + if (idx >= first_key_idx)
+ idx += hist_data->n_var_only; + idx += hist_data->n_vars;
hist_field_print(m, hist_data->fields[idx]); hist_field_print(m, hist_data->fields[idx]);
+ } + }
if (sort_key->descending) if (sort_key->descending)
seq_puts(m, ".descending"); seq_puts(m, ".descending");
@@ -1633,7 +1923,7 @@ static void hist_unregister_trigger(char @@ -1633,7 +1921,7 @@ static void hist_unregister_trigger(char
test->ops->free(test->ops, test); test->ops->free(test->ops, test);
if (hist_data->enable_timestamps) { if (hist_data->enable_timestamps) {
@ -738,7 +743,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
tracing_set_time_stamp_abs(file->tr, false); tracing_set_time_stamp_abs(file->tr, false);
} }
} }
@@ -1662,12 +1952,16 @@ static int event_hist_trigger_func(struc @@ -1666,12 +1954,16 @@ static int event_hist_trigger_func(struc
struct hist_trigger_attrs *attrs; struct hist_trigger_attrs *attrs;
struct event_trigger_ops *trigger_ops; struct event_trigger_ops *trigger_ops;
struct hist_trigger_data *hist_data; struct hist_trigger_data *hist_data;
@ -755,7 +760,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
/* separate the trigger from the filter (k:v [if filter]) */ /* separate the trigger from the filter (k:v [if filter]) */
trigger = strsep(&param, " \t"); trigger = strsep(&param, " \t");
if (!trigger) if (!trigger)
@@ -1680,7 +1974,7 @@ static int event_hist_trigger_func(struc @@ -1684,7 +1976,7 @@ static int event_hist_trigger_func(struc
if (attrs->map_bits) if (attrs->map_bits)
hist_trigger_bits = attrs->map_bits; hist_trigger_bits = attrs->map_bits;
@ -764,7 +769,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (IS_ERR(hist_data)) { if (IS_ERR(hist_data)) {
destroy_hist_trigger_attrs(attrs); destroy_hist_trigger_attrs(attrs);
return PTR_ERR(hist_data); return PTR_ERR(hist_data);
@@ -1709,7 +2003,7 @@ static int event_hist_trigger_func(struc @@ -1713,7 +2005,7 @@ static int event_hist_trigger_func(struc
goto out_free; goto out_free;
} }

View File

@ -2,7 +2,7 @@ From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:54 +0200 Date: Sun, 22 Oct 2017 23:39:54 +0200
Subject: [PATCH 16/36] hrtimer: Make hrtimer_cpu_base.next_timer handling Subject: [PATCH 16/36] hrtimer: Make hrtimer_cpu_base.next_timer handling
unconditional unconditional
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
hrtimer_cpu_base.next_timer stores the pointer to the next expiring timer hrtimer_cpu_base.next_timer stores the pointer to the next expiring timer
in a cpu base. in a cpu base.
@ -24,6 +24,7 @@ marginal as it's just a store on an already dirtied cacheline.
No functional change. No functional change.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 4 ++-- include/linux/hrtimer.h | 4 ++--
@ -64,8 +65,8 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- a/kernel/time/hrtimer.c --- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c
@@ -442,14 +442,6 @@ static inline void debug_deactivate(stru @@ -459,21 +459,13 @@ static struct hrtimer_clock_base *
} while ((base = __next_base((cpu_base), &(active))))
#if defined(CONFIG_NO_HZ_COMMON) || defined(CONFIG_HIGH_RES_TIMERS) #if defined(CONFIG_NO_HZ_COMMON) || defined(CONFIG_HIGH_RES_TIMERS)
-static inline void hrtimer_update_next_timer(struct hrtimer_cpu_base *cpu_base, -static inline void hrtimer_update_next_timer(struct hrtimer_cpu_base *cpu_base,
@ -76,10 +77,9 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
-#endif -#endif
-} -}
- -
static struct hrtimer_clock_base * static ktime_t __hrtimer_get_next_event(struct hrtimer_cpu_base *cpu_base)
__next_base(struct hrtimer_cpu_base *cpu_base, unsigned int *active)
{ {
@@ -473,7 +465,7 @@ static ktime_t __hrtimer_get_next_event( struct hrtimer_clock_base *base;
unsigned int active = cpu_base->active_bases; unsigned int active = cpu_base->active_bases;
ktime_t expires, expires_next = KTIME_MAX; ktime_t expires, expires_next = KTIME_MAX;

View File

@ -1,8 +1,8 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:53 -0500 Date: Fri, 17 Nov 2017 14:32:55 -0600
Subject: [PATCH 22/42] tracing: Account for variables in named trigger Subject: [PATCH 16/37] tracing: Account for variables in named trigger
compatibility compatibility
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Named triggers must also have the same set of variables in order to be Named triggers must also have the same set of variables in order to be
considered compatible - update the trigger match test to account for considered compatible - update the trigger match test to account for
@ -19,7 +19,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@@ -1614,7 +1614,7 @@ static int event_hist_trigger_print(stru @@ -1612,7 +1612,7 @@ static int event_hist_trigger_print(stru
sort_key = &hist_data->sort_keys[i]; sort_key = &hist_data->sort_keys[i];
idx = sort_key->field_idx; idx = sort_key->field_idx;
@ -28,7 +28,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
return -EINVAL; return -EINVAL;
if (i > 0) if (i > 0)
@@ -1802,6 +1802,11 @@ static bool hist_trigger_match(struct ev @@ -1800,6 +1800,11 @@ static bool hist_trigger_match(struct ev
return false; return false;
if (key_field->is_signed != key_field_test->is_signed) if (key_field->is_signed != key_field_test->is_signed)
return false; return false;

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:55 +0200 Date: Sun, 22 Oct 2017 23:39:55 +0200
Subject: [PATCH 17/36] hrtimer: Make hrtimer_reprogramm() unconditional Subject: [PATCH 17/36] hrtimer: Make hrtimer_reprogramm() unconditional
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
hrtimer_reprogram() needs to be available unconditionally for softirq based hrtimer_reprogram() needs to be available unconditionally for softirq based
hrtimers. Move the function and all required struct members out of the hrtimers. Move the function and all required struct members out of the
@ -13,6 +13,7 @@ increases the text size for the CONFIG_HIGH_RES_TIMERS=n case, but avoids
replication of that code for the upcoming softirq based hrtimers support. replication of that code for the upcoming softirq based hrtimers support.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 6 +- include/linux/hrtimer.h | 6 +-

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:54 -0500 Date: Fri, 17 Nov 2017 14:32:56 -0600
Subject: [PATCH 23/42] tracing: Move get_hist_field_flags() Subject: [PATCH 17/37] tracing: Move get_hist_field_flags()
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Move get_hist_field_flags() to make it more easily accessible for new Move get_hist_field_flags() to make it more easily accessible for new
code (and keep the move separate from new functionality). code (and keep the move separate from new functionality).
@ -14,7 +14,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@@ -457,6 +457,28 @@ static const struct tracing_map_ops hist @@ -497,6 +497,28 @@ static const struct tracing_map_ops hist
.elt_init = hist_trigger_elt_comm_init, .elt_init = hist_trigger_elt_comm_init,
}; };
@ -43,7 +43,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static void destroy_hist_field(struct hist_field *hist_field, static void destroy_hist_field(struct hist_field *hist_field,
unsigned int level) unsigned int level)
{ {
@@ -1499,28 +1521,6 @@ const struct file_operations event_hist_ @@ -1497,28 +1519,6 @@ const struct file_operations event_hist_
.release = single_release, .release = single_release,
}; };

View File

@ -1,22 +1,24 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:56 +0200 Date: Sun, 22 Oct 2017 23:39:56 +0200
Subject: [PATCH 18/36] hrtimer: Reduce conditional code and make Subject: [PATCH 18/36] hrtimer: Make hrtimer_force_reprogramm()
hrtimer_force_reprogramm() unconditional unconditionally available
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
hrtimer_force_reprogram() needs to be available unconditionally for softirq hrtimer_force_reprogram() needs to be available unconditionally for softirq
based hrtimers. Move the function and all required struct members out of based hrtimers. Move the function and all required struct members out of
the CONFIG_HIGH_RES_TIMERS #ifdef. the CONFIG_HIGH_RES_TIMERS #ifdef.
There is no functional change because hrtimer_force_reprogram() is There is no functional change because hrtimer_force_reprogram() is only
only invoked when hrtimer_cpu_base.hres_active is true and invoked when hrtimer_cpu_base.hres_active is true and
CONFIG_HIGH_RES_TIMERS=y. Making it unconditional increases the text CONFIG_HIGH_RES_TIMERS=y.
size for the CONFIG_HIGH_RES_TIMERS=n case slightly, but avoids
replication of that code for the upcoming softirq based hrtimers Making it unconditional increases the text size for the
support. Most of the code gets eliminated in the CONFIG_HIGH_RES_TIMERS=n case slightly, but avoids replication of that code
CONFIG_HIGH_RES_TIMERS=n case by the compiler. for the upcoming softirq based hrtimers support. Most of the code gets
eliminated in the CONFIG_HIGH_RES_TIMERS=n case by the compiler.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 58 ++++++++++++++++++++++++-------------------------- kernel/time/hrtimer.c | 58 ++++++++++++++++++++++++--------------------------

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:55 -0500 Date: Fri, 17 Nov 2017 14:32:57 -0600
Subject: [PATCH 24/42] tracing: Add simple expression support to hist triggers Subject: [PATCH 18/37] tracing: Add simple expression support to hist triggers
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Add support for simple addition, subtraction, and unary expressions Add support for simple addition, subtraction, and unary expressions
(-(expr) and expr, where expr = b-a, a+b, a+b+c) to hist triggers, in (-(expr) and expr, where expr = b-a, a+b, a+b+c) to hist triggers, in
@ -17,8 +17,8 @@ parsing.
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace_events_hist.c | 514 +++++++++++++++++++++++++++++++++------ kernel/trace/trace_events_hist.c | 513 +++++++++++++++++++++++++++++++++------
1 file changed, 440 insertions(+), 74 deletions(-) 1 file changed, 440 insertions(+), 73 deletions(-)
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@ -87,15 +87,15 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
#define DEFINE_HIST_FIELD_FN(type) \ #define DEFINE_HIST_FIELD_FN(type) \
static u64 hist_field_##type(struct hist_field *hist_field, \ static u64 hist_field_##type(struct hist_field *hist_field, \
void *event, \ void *event, \
@@ -148,6 +192,7 @@ enum hist_field_flags { @@ -147,6 +191,7 @@ enum hist_field_flags {
HIST_FIELD_FL_TIMESTAMP = 1 << 10,
HIST_FIELD_FL_TIMESTAMP_USECS = 1 << 11, HIST_FIELD_FL_TIMESTAMP_USECS = 1 << 11,
HIST_FIELD_FL_VAR = 1 << 12, HIST_FIELD_FL_VAR = 1 << 12,
HIST_FIELD_FL_VAR_ONLY = 1 << 13, + HIST_FIELD_FL_EXPR = 1 << 13,
+ HIST_FIELD_FL_EXPR = 1 << 14,
}; };
struct var_defs { struct var_defs {
@@ -218,6 +263,8 @@ static const char *hist_field_name(struc @@ -258,6 +303,8 @@ static const char *hist_field_name(struc
field_name = hist_field_name(field->operands[0], ++level); field_name = hist_field_name(field->operands[0], ++level);
else if (field->flags & HIST_FIELD_FL_TIMESTAMP) else if (field->flags & HIST_FIELD_FL_TIMESTAMP)
field_name = "$common_timestamp"; field_name = "$common_timestamp";
@ -104,7 +104,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (field_name == NULL) if (field_name == NULL)
field_name = ""; field_name = "";
@@ -479,6 +526,93 @@ static const char *get_hist_field_flags( @@ -519,6 +566,93 @@ static const char *get_hist_field_flags(
return flags_str; return flags_str;
} }
@ -198,7 +198,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static void destroy_hist_field(struct hist_field *hist_field, static void destroy_hist_field(struct hist_field *hist_field,
unsigned int level) unsigned int level)
{ {
@@ -494,6 +628,7 @@ static void destroy_hist_field(struct hi @@ -534,6 +668,7 @@ static void destroy_hist_field(struct hi
destroy_hist_field(hist_field->operands[i], level + 1); destroy_hist_field(hist_field->operands[i], level + 1);
kfree(hist_field->var.name); kfree(hist_field->var.name);
@ -206,7 +206,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
kfree(hist_field); kfree(hist_field);
} }
@@ -514,6 +649,9 @@ static struct hist_field *create_hist_fi @@ -554,6 +689,9 @@ static struct hist_field *create_hist_fi
hist_field->hist_data = hist_data; hist_field->hist_data = hist_data;
@ -216,19 +216,28 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (flags & HIST_FIELD_FL_HITCOUNT) { if (flags & HIST_FIELD_FL_HITCOUNT) {
hist_field->fn = hist_field_counter; hist_field->fn = hist_field_counter;
goto out; goto out;
@@ -586,6 +724,289 @@ static void destroy_hist_fields(struct h @@ -626,59 +764,323 @@ static void destroy_hist_fields(struct h
} }
} }
-static int create_hitcount_val(struct hist_trigger_data *hist_data)
+static char *field_name_from_var(struct hist_trigger_data *hist_data, +static char *field_name_from_var(struct hist_trigger_data *hist_data,
+ char *var_name) + char *var_name)
+{ {
- hist_data->fields[HITCOUNT_IDX] =
- create_hist_field(hist_data, NULL, HIST_FIELD_FL_HITCOUNT, NULL);
- if (!hist_data->fields[HITCOUNT_IDX])
- return -ENOMEM;
+ char *name, *field; + char *name, *field;
+ unsigned int i; + unsigned int i;
+
- hist_data->n_vals++;
- hist_data->n_fields++;
+ for (i = 0; i < hist_data->attrs->var_defs.n_vars; i++) { + for (i = 0; i < hist_data->attrs->var_defs.n_vars; i++) {
+ name = hist_data->attrs->var_defs.name[i]; + name = hist_data->attrs->var_defs.name[i];
+
- if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX))
- return -EINVAL;
+ if (strcmp(var_name, name) == 0) { + if (strcmp(var_name, name) == 0) {
+ field = hist_data->attrs->var_defs.expr[i]; + field = hist_data->attrs->var_defs.expr[i];
+ if (contains_operator(field)) + if (contains_operator(field))
@ -236,10 +245,16 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ return field; + return field;
+ } + }
+ } + }
+
- return 0;
+ return NULL; + return NULL;
+} }
+
-static int __create_val_field(struct hist_trigger_data *hist_data,
- unsigned int val_idx,
- struct trace_event_file *file,
- char *var_name, char *field_str,
- unsigned long flags)
+static char *local_field_var_ref(struct hist_trigger_data *hist_data, +static char *local_field_var_ref(struct hist_trigger_data *hist_data,
+ char *var_name) + char *var_name)
+{ +{
@ -251,10 +266,16 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+static struct ftrace_event_field * +static struct ftrace_event_field *
+parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file, +parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file,
+ char *field_str, unsigned long *flags) + char *field_str, unsigned long *flags)
+{ {
+ struct ftrace_event_field *field = NULL; struct ftrace_event_field *field = NULL;
- char *field_name;
- int ret = 0;
+ char *field_name, *modifier, *str; + char *field_name, *modifier, *str;
+
- field_name = strsep(&field_str, ".");
- if (field_str) {
- if (strcmp(field_str, "hex") == 0)
- flags |= HIST_FIELD_FL_HEX;
+ modifier = str = kstrdup(field_str, GFP_KERNEL); + modifier = str = kstrdup(field_str, GFP_KERNEL);
+ if (!modifier) + if (!modifier)
+ return ERR_PTR(-ENOMEM); + return ERR_PTR(-ENOMEM);
@ -276,24 +297,27 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ *flags |= HIST_FIELD_FL_LOG2; + *flags |= HIST_FIELD_FL_LOG2;
+ else if (strcmp(modifier, "usecs") == 0) + else if (strcmp(modifier, "usecs") == 0)
+ *flags |= HIST_FIELD_FL_TIMESTAMP_USECS; + *flags |= HIST_FIELD_FL_TIMESTAMP_USECS;
+ else { else {
- ret = -EINVAL;
+ field = ERR_PTR(-EINVAL); + field = ERR_PTR(-EINVAL);
+ goto out; goto out;
+ } }
+ } }
+
+ if (strcmp(field_name, "$common_timestamp") == 0) { if (strcmp(field_name, "$common_timestamp") == 0) {
- flags |= HIST_FIELD_FL_TIMESTAMP;
+ *flags |= HIST_FIELD_FL_TIMESTAMP; + *flags |= HIST_FIELD_FL_TIMESTAMP;
+ hist_data->enable_timestamps = true; hist_data->enable_timestamps = true;
+ if (*flags & HIST_FIELD_FL_TIMESTAMP_USECS) + if (*flags & HIST_FIELD_FL_TIMESTAMP_USECS)
+ hist_data->attrs->ts_in_usecs = true; + hist_data->attrs->ts_in_usecs = true;
+ } else { } else {
+ field = trace_find_event_field(file->event_call, field_name); field = trace_find_event_field(file->event_call, field_name);
+ if (!field || !field->size) { if (!field || !field->size) {
- ret = -EINVAL;
+ field = ERR_PTR(-EINVAL); + field = ERR_PTR(-EINVAL);
+ goto out; goto out;
+ } }
+ } }
+ out: + out:
+ kfree(str); + kfree(str);
+ +
@ -318,13 +342,15 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ ret = PTR_ERR(field); + ret = PTR_ERR(field);
+ goto out; + goto out;
+ } + }
+
- hist_data->fields[val_idx] = create_hist_field(hist_data, field, flags, var_name);
- if (!hist_data->fields[val_idx]) {
+ hist_field = create_hist_field(hist_data, field, *flags, var_name); + hist_field = create_hist_field(hist_data, field, *flags, var_name);
+ if (!hist_field) { + if (!hist_field) {
+ ret = -ENOMEM; ret = -ENOMEM;
+ goto out; goto out;
+ } }
+
+ return hist_field; + return hist_field;
+ out: + out:
+ return ERR_PTR(ret); + return ERR_PTR(ret);
@ -397,6 +423,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ return expr; + return expr;
+ free: + free:
+ destroy_hist_field(expr, 0);
+ return ERR_PTR(ret); + return ERR_PTR(ret);
+} +}
+ +
@ -503,59 +530,43 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ return ERR_PTR(ret); + return ERR_PTR(ret);
+} +}
+ +
static int create_hitcount_val(struct hist_trigger_data *hist_data) +static int create_hitcount_val(struct hist_trigger_data *hist_data)
{ +{
hist_data->fields[HITCOUNT_IDX] = + hist_data->fields[HITCOUNT_IDX] =
@@ -645,41 +1066,21 @@ static int __create_val_field(struct his + create_hist_field(hist_data, NULL, HIST_FIELD_FL_HITCOUNT, NULL);
char *var_name, char *field_str, + if (!hist_data->fields[HITCOUNT_IDX])
unsigned long flags) + return -ENOMEM;
{ +
- struct ftrace_event_field *field = NULL; + hist_data->n_vals++;
- char *field_name; + hist_data->n_fields++;
+
+ if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX))
+ return -EINVAL;
+
+ return 0;
+}
+
+static int __create_val_field(struct hist_trigger_data *hist_data,
+ unsigned int val_idx,
+ struct trace_event_file *file,
+ char *var_name, char *field_str,
+ unsigned long flags)
+{
+ struct hist_field *hist_field; + struct hist_field *hist_field;
int ret = 0; + int ret = 0;
+
- field_name = strsep(&field_str, ".");
- if (field_str) {
- if (strcmp(field_str, "hex") == 0)
- flags |= HIST_FIELD_FL_HEX;
- else {
- ret = -EINVAL;
- goto out;
- }
- }
-
- if (strcmp(field_name, "$common_timestamp") == 0) {
- flags |= HIST_FIELD_FL_TIMESTAMP;
- hist_data->enable_timestamps = true;
- } else {
- field = trace_find_event_field(file->event_call, field_name);
- if (!field || !field->size) {
- ret = -EINVAL;
- goto out;
- }
- }
-
- hist_data->fields[val_idx] = create_hist_field(hist_data, field, flags, var_name);
- if (!hist_data->fields[val_idx]) {
- ret = -ENOMEM;
+ hist_field = parse_expr(hist_data, file, field_str, flags, var_name, 0); + hist_field = parse_expr(hist_data, file, field_str, flags, var_name, 0);
+ if (IS_ERR(hist_field)) { + if (IS_ERR(hist_field)) {
+ ret = PTR_ERR(hist_field); + ret = PTR_ERR(hist_field);
goto out; + goto out;
} + }
+
+ hist_data->fields[val_idx] = hist_field; + hist_data->fields[val_idx] = hist_field;
+ +
++hist_data->n_vals; ++hist_data->n_vals;
++hist_data->n_fields; ++hist_data->n_fields;
- if (hist_data->fields[val_idx]->flags & HIST_FIELD_FL_VAR_ONLY) @@ -765,8 +1167,8 @@ static int create_key_field(struct hist_
+ if (hist_field->flags & HIST_FIELD_FL_VAR_ONLY)
hist_data->n_var_only++;
if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX))
@@ -769,8 +1170,8 @@ static int create_key_field(struct hist_
struct trace_event_file *file, struct trace_event_file *file,
char *field_str) char *field_str)
{ {
@ -565,7 +576,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
unsigned long flags = 0; unsigned long flags = 0;
unsigned int key_size; unsigned int key_size;
int ret = 0; int ret = 0;
@@ -785,60 +1186,24 @@ static int create_key_field(struct hist_ @@ -781,60 +1183,24 @@ static int create_key_field(struct hist_
key_size = sizeof(unsigned long) * HIST_STACKTRACE_DEPTH; key_size = sizeof(unsigned long) * HIST_STACKTRACE_DEPTH;
hist_field = create_hist_field(hist_data, NULL, flags, NULL); hist_field = create_hist_field(hist_data, NULL, flags, NULL);
} else { } else {
@ -635,7 +646,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (hist_data->key_size > HIST_KEY_SIZE_MAX) { if (hist_data->key_size > HIST_KEY_SIZE_MAX) {
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
@@ -1421,7 +1786,8 @@ hist_trigger_entry_print(struct seq_file @@ -1419,7 +1785,8 @@ hist_trigger_entry_print(struct seq_file
for (i = 1; i < hist_data->n_vals; i++) { for (i = 1; i < hist_data->n_vals; i++) {
field_name = hist_field_name(hist_data->fields[i], 0); field_name = hist_field_name(hist_data->fields[i], 0);

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:57 +0200 Date: Sun, 22 Oct 2017 23:39:57 +0200
Subject: [PATCH 19/36] hrtimer: Unify handling of hrtimer remove Subject: [PATCH 19/36] hrtimer: Unify handling of hrtimer remove
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
When the first hrtimer on the current CPU is removed, When the first hrtimer on the current CPU is removed,
hrtimer_force_reprogram() is invoked but only when hrtimer_force_reprogram() is invoked but only when
@ -35,6 +35,7 @@ except the effective reprogramming part, which gets eliminated by the
compiler in the CONFIG_HIGH_RES_TIMERS=n case. compiler in the CONFIG_HIGH_RES_TIMERS=n case.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 10 ++++------ kernel/time/hrtimer.c | 10 ++++------

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:56 -0500 Date: Fri, 17 Nov 2017 14:32:58 -0600
Subject: [PATCH 25/42] tracing: Generalize per-element hist trigger data Subject: [PATCH 19/37] tracing: Generalize per-element hist trigger data
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Up until now, hist triggers only needed per-element support for saving Up until now, hist triggers only needed per-element support for saving
'comm' data, which was saved directly as a private data pointer. 'comm' data, which was saved directly as a private data pointer.
@ -13,13 +13,13 @@ new hist_elt_data struct for the purpose, and switch the current
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace_events_hist.c | 71 ++++++++++++++++++++------------------- kernel/trace/trace_events_hist.c | 76 ++++++++++++++++++++++-----------------
1 file changed, 38 insertions(+), 33 deletions(-) 1 file changed, 43 insertions(+), 33 deletions(-)
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@@ -249,6 +249,10 @@ static u64 hist_field_timestamp(struct h @@ -289,6 +289,10 @@ static struct hist_field *find_var(struc
return ts; return NULL;
} }
+struct hist_elt_data { +struct hist_elt_data {
@ -29,7 +29,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static const char *hist_field_name(struct hist_field *field, static const char *hist_field_name(struct hist_field *field,
unsigned int level) unsigned int level)
{ {
@@ -463,45 +467,61 @@ static inline void save_comm(char *comm, @@ -503,45 +507,61 @@ static inline void save_comm(char *comm,
memcpy(comm, task->comm, TASK_COMM_LEN); memcpy(comm, task->comm, TASK_COMM_LEN);
} }
@ -138,13 +138,18 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
hist_data->map = tracing_map_create(map_bits, hist_data->key_size, hist_data->map = tracing_map_create(map_bits, hist_data->key_size,
map_ops, hist_data); map_ops, hist_data);
@@ -1742,7 +1746,8 @@ hist_trigger_entry_print(struct seq_file @@ -1741,7 +1745,13 @@ hist_trigger_entry_print(struct seq_file
seq_printf(m, "%s: [%llx] %-55s", field_name, seq_printf(m, "%s: [%llx] %-55s", field_name,
uval, str); uval, str);
} else if (key_field->flags & HIST_FIELD_FL_EXECNAME) { } else if (key_field->flags & HIST_FIELD_FL_EXECNAME) {
- char *comm = elt->private_data; - char *comm = elt->private_data;
+ struct hist_elt_data *elt_data = elt->private_data; + struct hist_elt_data *elt_data = elt->private_data;
+ char *comm = elt_data->comm; + char *comm;
+
+ if (WARN_ON_ONCE(!elt_data))
+ return;
+
+ comm = elt_data->comm;
uval = *(u64 *)(key + key_field->offset); uval = *(u64 *)(key + key_field->offset);
seq_printf(m, "%s: %-16s[%10llu]", field_name, seq_printf(m, "%s: %-16s[%10llu]", field_name,

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:58 +0200 Date: Sun, 22 Oct 2017 23:39:58 +0200
Subject: [PATCH 20/36] hrtimer: Unify handling of remote enqueue Subject: [PATCH 20/36] hrtimer: Unify handling of remote enqueue
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
hrtimer_reprogram() is conditionally invoked from hrtimer_start_range_ns() hrtimer_reprogram() is conditionally invoked from hrtimer_start_range_ns()
when hrtimer_cpu_base.hres_active is true. when hrtimer_cpu_base.hres_active is true.
@ -43,13 +43,17 @@ To unify this the following changes are required:
3) Remove the remote wakeup special case for the !high_res && nohz_active 3) Remove the remote wakeup special case for the !high_res && nohz_active
case. case.
Confine the timers_nohz_active static key to timer.c which is the only user
now.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 18 ++++++------------ kernel/time/hrtimer.c | 18 ++++++------------
kernel/time/tick-internal.h | 11 ----------- kernel/time/tick-internal.h | 6 ------
kernel/time/timer.c | 15 ++++++++++++++- kernel/time/timer.c | 9 ++++++++-
3 files changed, 20 insertions(+), 24 deletions(-) 3 files changed, 14 insertions(+), 19 deletions(-)
--- a/kernel/time/hrtimer.c --- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c
@ -100,28 +104,22 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} }
--- a/kernel/time/tick-internal.h --- a/kernel/time/tick-internal.h
+++ b/kernel/time/tick-internal.h +++ b/kernel/time/tick-internal.h
@@ -151,12 +151,6 @@ static inline void tick_nohz_init(void) @@ -151,18 +151,12 @@ static inline void tick_nohz_init(void)
#ifdef CONFIG_NO_HZ_COMMON #ifdef CONFIG_NO_HZ_COMMON
extern unsigned long tick_nohz_active; extern unsigned long tick_nohz_active;
extern void timers_update_nohz(void); extern void timers_update_nohz(void);
-extern struct static_key_false timers_nohz_active; -extern struct static_key_false timers_nohz_active;
-
-static inline bool is_timers_nohz_active(void) -static inline bool is_timers_nohz_active(void)
-{ -{
- return static_branch_unlikely(&timers_nohz_active); - return static_branch_unlikely(&timers_nohz_active);
-} -}
# ifdef CONFIG_SMP
#ifdef CONFIG_SMP
extern struct static_key_false timers_migration_enabled; extern struct static_key_false timers_migration_enabled;
@@ -164,11 +158,6 @@ extern struct static_key_false timers_mi # endif
#else #else /* CONFIG_NO_HZ_COMMON */
static inline void timers_update_nohz(void) { } static inline void timers_update_nohz(void) { }
#define tick_nohz_active (0) #define tick_nohz_active (0)
- -static inline bool is_timers_nohz_active(void) { return false; }
-static inline bool is_timers_nohz_active(void)
-{
- return false;
-}
#endif #endif
DECLARE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases); DECLARE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases);
@ -136,7 +134,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static DEFINE_MUTEX(timer_keys_mutex); static DEFINE_MUTEX(timer_keys_mutex);
static void timer_update_keys(struct work_struct *work); static void timer_update_keys(struct work_struct *work);
@@ -260,6 +260,19 @@ int timer_migration_handler(struct ctl_t @@ -260,6 +260,13 @@ int timer_migration_handler(struct ctl_t
mutex_unlock(&timer_keys_mutex); mutex_unlock(&timer_keys_mutex);
return ret; return ret;
} }
@ -145,14 +143,8 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+{ +{
+ return static_branch_unlikely(&timers_nohz_active); + return static_branch_unlikely(&timers_nohz_active);
+} +}
+
+#else +#else
+ +static inline bool is_timers_nohz_active(void) { return false; }
+static inline bool is_timers_nohz_active(void)
+{
+ return false;
+}
+
#endif /* NO_HZ_COMMON */ #endif /* NO_HZ_COMMON */
static unsigned long round_jiffies_common(unsigned long j, int cpu, static unsigned long round_jiffies_common(unsigned long j, int cpu,

View File

@ -1,8 +1,8 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:57 -0500 Date: Fri, 17 Nov 2017 14:32:59 -0600
Subject: [PATCH 26/42] tracing: Pass tracing_map_elt to hist_field accessor Subject: [PATCH 20/37] tracing: Pass tracing_map_elt to hist_field accessor
functions functions
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Some accessor functions, such as for variable references, require Some accessor functions, such as for variable references, require
access to a corrsponding tracing_map_elt. access to a corrsponding tracing_map_elt.
@ -169,7 +169,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
{ \ { \
type *addr = (type *)(event + hist_field->field->offset); \ type *addr = (type *)(event + hist_field->field->offset); \
\ \
@@ -235,8 +256,10 @@ struct hist_trigger_data { @@ -233,8 +254,10 @@ struct hist_trigger_data {
bool remove; bool remove;
}; };
@ -191,7 +191,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (hist_field->flags & HIST_FIELD_FL_VAR) { if (hist_field->flags & HIST_FIELD_FL_VAR) {
var_idx = hist_field->var.idx; var_idx = hist_field->var.idx;
tracing_map_set_var(elt, var_idx, hist_val); tracing_map_set_var(elt, var_idx, hist_val);
@@ -1611,7 +1634,7 @@ static void hist_trigger_elt_update(stru @@ -1610,7 +1633,7 @@ static void hist_trigger_elt_update(stru
for_each_hist_key_field(i, hist_data) { for_each_hist_key_field(i, hist_data) {
hist_field = hist_data->fields[i]; hist_field = hist_data->fields[i];
if (hist_field->flags & HIST_FIELD_FL_VAR) { if (hist_field->flags & HIST_FIELD_FL_VAR) {
@ -200,7 +200,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
var_idx = hist_field->var.idx; var_idx = hist_field->var.idx;
tracing_map_set_var(elt, var_idx, hist_val); tracing_map_set_var(elt, var_idx, hist_val);
} }
@@ -1649,9 +1672,9 @@ static void event_hist_trigger(struct ev @@ -1648,9 +1671,9 @@ static void event_hist_trigger(struct ev
bool use_compound_key = (hist_data->n_keys > 1); bool use_compound_key = (hist_data->n_keys > 1);
unsigned long entries[HIST_STACKTRACE_DEPTH]; unsigned long entries[HIST_STACKTRACE_DEPTH];
char compound_key[HIST_KEY_SIZE_MAX]; char compound_key[HIST_KEY_SIZE_MAX];
@ -211,7 +211,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
u64 field_contents; u64 field_contents;
void *key = NULL; void *key = NULL;
unsigned int i; unsigned int i;
@@ -1672,7 +1695,7 @@ static void event_hist_trigger(struct ev @@ -1671,7 +1694,7 @@ static void event_hist_trigger(struct ev
key = entries; key = entries;
} else { } else {

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:39:59 +0200 Date: Sun, 22 Oct 2017 23:39:59 +0200
Subject: [PATCH 21/36] hrtimer: Make remote enqueue decision less restrictive Subject: [PATCH 21/36] hrtimer: Make remote enqueue decision less restrictive
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The current decision whether a timer can be queued on a remote CPU checks The current decision whether a timer can be queued on a remote CPU checks
for timer->expiry <= remote_cpu_base.expires_next. for timer->expiry <= remote_cpu_base.expires_next.
@ -14,6 +14,7 @@ So its safe to allow enqueuing timers with the same expiry time as the
first expiring timer on a remote CPU base. first expiring timer on a remote CPU base.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 2 +- kernel/time/hrtimer.c | 2 +-

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:58 -0500 Date: Fri, 17 Nov 2017 14:33:00 -0600
Subject: [PATCH 27/42] tracing: Add hist_field 'type' field Subject: [PATCH 21/37] tracing: Add hist_field 'type' field
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Future support for synthetic events requires hist_field 'type' Future support for synthetic events requires hist_field 'type'
information, so add a field for that. information, so add a field for that.
@ -25,7 +25,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
struct hist_field *operands[HIST_FIELD_OPERANDS_MAX]; struct hist_field *operands[HIST_FIELD_OPERANDS_MAX];
struct hist_trigger_data *hist_data; struct hist_trigger_data *hist_data;
struct hist_var var; struct hist_var var;
@@ -672,6 +673,7 @@ static void destroy_hist_field(struct hi @@ -712,6 +713,7 @@ static void destroy_hist_field(struct hi
kfree(hist_field->var.name); kfree(hist_field->var.name);
kfree(hist_field->name); kfree(hist_field->name);
@ -33,7 +33,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
kfree(hist_field); kfree(hist_field);
} }
@@ -697,6 +699,10 @@ static struct hist_field *create_hist_fi @@ -737,6 +739,10 @@ static struct hist_field *create_hist_fi
if (flags & HIST_FIELD_FL_HITCOUNT) { if (flags & HIST_FIELD_FL_HITCOUNT) {
hist_field->fn = hist_field_counter; hist_field->fn = hist_field_counter;
@ -44,7 +44,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
goto out; goto out;
} }
@@ -710,12 +716,18 @@ static struct hist_field *create_hist_fi @@ -750,12 +756,18 @@ static struct hist_field *create_hist_fi
hist_field->fn = hist_field_log2; hist_field->fn = hist_field_log2;
hist_field->operands[0] = create_hist_field(hist_data, field, fl, NULL); hist_field->operands[0] = create_hist_field(hist_data, field, fl, NULL);
hist_field->size = hist_field->operands[0]->size; hist_field->size = hist_field->operands[0]->size;
@ -63,7 +63,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
goto out; goto out;
} }
@@ -725,6 +737,11 @@ static struct hist_field *create_hist_fi @@ -765,6 +777,11 @@ static struct hist_field *create_hist_fi
if (is_string_field(field)) { if (is_string_field(field)) {
flags |= HIST_FIELD_FL_STRING; flags |= HIST_FIELD_FL_STRING;
@ -75,7 +75,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (field->filter_type == FILTER_STATIC_STRING) if (field->filter_type == FILTER_STATIC_STRING)
hist_field->fn = hist_field_string; hist_field->fn = hist_field_string;
else if (field->filter_type == FILTER_DYN_STRING) else if (field->filter_type == FILTER_DYN_STRING)
@@ -732,6 +749,12 @@ static struct hist_field *create_hist_fi @@ -772,6 +789,12 @@ static struct hist_field *create_hist_fi
else else
hist_field->fn = hist_field_pstring; hist_field->fn = hist_field_pstring;
} else { } else {
@ -88,7 +88,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
hist_field->fn = select_value_fn(field->size, hist_field->fn = select_value_fn(field->size,
field->is_signed); field->is_signed);
if (!hist_field->fn) { if (!hist_field->fn) {
@@ -941,6 +964,11 @@ static struct hist_field *parse_unary(st @@ -981,6 +1004,11 @@ static struct hist_field *parse_unary(st
expr->operands[0] = operand1; expr->operands[0] = operand1;
expr->operator = FIELD_OP_UNARY_MINUS; expr->operator = FIELD_OP_UNARY_MINUS;
expr->name = expr_str(expr, 0); expr->name = expr_str(expr, 0);
@ -100,7 +100,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
return expr; return expr;
free: free:
@@ -1029,6 +1057,11 @@ static struct hist_field *parse_expr(str @@ -1070,6 +1098,11 @@ static struct hist_field *parse_expr(str
expr->operands[1] = operand2; expr->operands[1] = operand2;
expr->operator = field_op; expr->operator = field_op;
expr->name = expr_str(expr, 0); expr->name = expr_str(expr, 0);

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:00 +0200 Date: Sun, 22 Oct 2017 23:40:00 +0200
Subject: [PATCH 22/36] hrtimer: Remove base argument from hrtimer_reprogram() Subject: [PATCH 22/36] hrtimer: Remove base argument from hrtimer_reprogram()
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
hrtimer_reprogram() must have access to the hrtimer_clock_base of the new hrtimer_reprogram() must have access to the hrtimer_clock_base of the new
first expiring timer to access hrtimer_clock_base.offset for adjusting the first expiring timer to access hrtimer_clock_base.offset for adjusting the
@ -19,6 +19,7 @@ Instead of handing in timer and timer->base as an argument remove the base
argument from hrtimer_reprogram() and retrieve the clock base internally. argument from hrtimer_reprogram() and retrieve the clock base internally.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 6 +++--- kernel/time/hrtimer.c | 6 +++---

View File

@ -1,8 +1,8 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 14:59:59 -0500 Date: Fri, 17 Nov 2017 14:33:01 -0600
Subject: [PATCH 28/42] tracing: Add variable reference handling to hist Subject: [PATCH 22/37] tracing: Add variable reference handling to hist
triggers triggers
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Add the necessary infrastructure to allow the variables defined on one Add the necessary infrastructure to allow the variables defined on one
event to be referenced in another. This allows variables set by a event to be referenced in another. This allows variables set by a
@ -11,8 +11,8 @@ variable values saved by that previous event and the event fields of
the current event. For example, here's how a latency can be the current event. For example, here's how a latency can be
calculated and saved into yet another variable named 'wakeup_lat': calculated and saved into yet another variable named 'wakeup_lat':
# echo 'hist:keys=pid,prio:ts0=common_timestamp ... # echo 'hist:keys=pid,prio:ts0=$common_timestamp ...
# echo 'hist:keys=next_pid:wakeup_lat=common_timestamp-$ts0 ... # echo 'hist:keys=next_pid:wakeup_lat=$common_timestamp-$ts0 ...
In the first event, the event's timetamp is saved into the variable In the first event, the event's timetamp is saved into the variable
ts0. In the next line, ts0 is subtracted from the second event's ts0. In the next line, ts0 is subtracted from the second event's
@ -27,13 +27,13 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace.c | 2 kernel/trace/trace.c | 2
kernel/trace/trace.h | 3 kernel/trace/trace.h | 3
kernel/trace/trace_events_hist.c | 613 ++++++++++++++++++++++++++++++++---- kernel/trace/trace_events_hist.c | 632 ++++++++++++++++++++++++++++++++++--
kernel/trace/trace_events_trigger.c | 6 kernel/trace/trace_events_trigger.c | 6
4 files changed, 568 insertions(+), 56 deletions(-) 4 files changed, 623 insertions(+), 20 deletions(-)
--- a/kernel/trace/trace.c --- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c +++ b/kernel/trace/trace.c
@@ -7766,6 +7766,7 @@ static int instance_mkdir(const char *na @@ -7804,6 +7804,7 @@ static int instance_mkdir(const char *na
INIT_LIST_HEAD(&tr->systems); INIT_LIST_HEAD(&tr->systems);
INIT_LIST_HEAD(&tr->events); INIT_LIST_HEAD(&tr->events);
@ -41,7 +41,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (allocate_trace_buffers(tr, trace_buf_size) < 0) if (allocate_trace_buffers(tr, trace_buf_size) < 0)
goto out_free_tr; goto out_free_tr;
@@ -8513,6 +8514,7 @@ ssize_t trace_parse_run_command(struct f @@ -8554,6 +8555,7 @@ ssize_t trace_parse_run_command(struct f
INIT_LIST_HEAD(&global_trace.systems); INIT_LIST_HEAD(&global_trace.systems);
INIT_LIST_HEAD(&global_trace.events); INIT_LIST_HEAD(&global_trace.events);
@ -70,9 +70,12 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
extern int register_trigger_hist_enable_disable_cmds(void); extern int register_trigger_hist_enable_disable_cmds(void);
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@@ -60,6 +60,9 @@ struct hist_field { @@ -59,7 +59,12 @@ struct hist_field {
struct hist_trigger_data *hist_data;
struct hist_var var; struct hist_var var;
enum field_op_id operator; enum field_op_id operator;
+ char *system;
+ char *event_name;
char *name; char *name;
+ unsigned int var_idx; + unsigned int var_idx;
+ unsigned int var_ref_idx; + unsigned int var_ref_idx;
@ -80,15 +83,15 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
}; };
static u64 hist_field_none(struct hist_field *field, static u64 hist_field_none(struct hist_field *field,
@@ -215,6 +218,7 @@ enum hist_field_flags { @@ -214,6 +219,7 @@ enum hist_field_flags {
HIST_FIELD_FL_TIMESTAMP_USECS = 1 << 11,
HIST_FIELD_FL_VAR = 1 << 12, HIST_FIELD_FL_VAR = 1 << 12,
HIST_FIELD_FL_VAR_ONLY = 1 << 13, HIST_FIELD_FL_EXPR = 1 << 13,
HIST_FIELD_FL_EXPR = 1 << 14, + HIST_FIELD_FL_VAR_REF = 1 << 14,
+ HIST_FIELD_FL_VAR_REF = 1 << 15,
}; };
struct var_defs { struct var_defs {
@@ -255,6 +259,8 @@ struct hist_trigger_data { @@ -253,6 +259,8 @@ struct hist_trigger_data {
struct tracing_map *map; struct tracing_map *map;
bool enable_timestamps; bool enable_timestamps;
bool remove; bool remove;
@ -97,7 +100,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
}; };
static u64 hist_field_timestamp(struct hist_field *hist_field, static u64 hist_field_timestamp(struct hist_field *hist_field,
@@ -273,10 +279,344 @@ static u64 hist_field_timestamp(struct h @@ -271,6 +279,216 @@ static u64 hist_field_timestamp(struct h
return ts; return ts;
} }
@ -106,9 +109,10 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ struct hist_trigger_data *hist_data; + struct hist_trigger_data *hist_data;
+}; +};
+ +
+static struct hist_field *check_var_ref(struct hist_field *hist_field, +static struct hist_field *
+ struct hist_trigger_data *var_data, +check_field_for_var_ref(struct hist_field *hist_field,
+ unsigned int var_idx) + struct hist_trigger_data *var_data,
+ unsigned int var_idx)
+{ +{
+ struct hist_field *found = NULL; + struct hist_field *found = NULL;
+ +
@ -122,27 +126,52 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ return found; + return found;
+} +}
+ +
+static struct hist_field *
+check_field_for_var_refs(struct hist_trigger_data *hist_data,
+ struct hist_field *hist_field,
+ struct hist_trigger_data *var_data,
+ unsigned int var_idx,
+ unsigned int level)
+{
+ struct hist_field *found = NULL;
+ unsigned int i;
+
+ if (level > 2)
+ return found;
+
+ if (!hist_field)
+ return found;
+
+ found = check_field_for_var_ref(hist_field, var_data, var_idx);
+ if (found)
+ return found;
+
+ for (i = 0; i < HIST_FIELD_OPERANDS_MAX; i++) {
+ struct hist_field *operand;
+
+ operand = hist_field->operands[i];
+ found = check_field_for_var_refs(hist_data, operand, var_data,
+ var_idx, level + 1);
+ if (found)
+ return found;
+ }
+
+ return found;
+}
+
+static struct hist_field *find_var_ref(struct hist_trigger_data *hist_data, +static struct hist_field *find_var_ref(struct hist_trigger_data *hist_data,
+ struct hist_trigger_data *var_data, + struct hist_trigger_data *var_data,
+ unsigned int var_idx) + unsigned int var_idx)
+{ +{
+ struct hist_field *hist_field, *found = NULL; + struct hist_field *hist_field, *found = NULL;
+ unsigned int i, j; + unsigned int i;
+ +
+ for_each_hist_field(i, hist_data) { + for_each_hist_field(i, hist_data) {
+ hist_field = hist_data->fields[i]; + hist_field = hist_data->fields[i];
+ found = check_var_ref(hist_field, var_data, var_idx); + found = check_field_for_var_refs(hist_data, hist_field,
+ var_data, var_idx, 0);
+ if (found) + if (found)
+ return found; + return found;
+
+ for (j = 0; j < HIST_FIELD_OPERANDS_MAX; j++) {
+ struct hist_field *operand;
+
+ operand = hist_field->operands[j];
+ found = check_var_ref(operand, var_data, var_idx);
+ if (found)
+ return found;
+ }
+ } + }
+ +
+ return found; + return found;
@ -155,6 +184,10 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ struct hist_field *found = NULL; + struct hist_field *found = NULL;
+ struct hist_var_data *var_data; + struct hist_var_data *var_data;
+ +
+ found = find_var_ref(hist_data, hist_data, var_idx);
+ if (found)
+ return found;
+
+ list_for_each_entry(var_data, &tr->hist_vars, list) { + list_for_each_entry(var_data, &tr->hist_vars, list) {
+ found = find_var_ref(var_data->hist_data, hist_data, var_idx); + found = find_var_ref(var_data->hist_data, hist_data, var_idx);
+ if (found) + if (found)
@ -198,27 +231,41 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ return found; + return found;
+} +}
+ +
+static bool field_has_hist_vars(struct hist_field *hist_field,
+ unsigned int level)
+{
+ int i;
+
+ if (level > 2)
+ return false;
+
+ if (!hist_field)
+ return false;
+
+ if (hist_field->flags & HIST_FIELD_FL_VAR ||
+ hist_field->flags & HIST_FIELD_FL_VAR_REF)
+ return true;
+
+ for (i = 0; i < HIST_FIELD_OPERANDS_MAX; i++) {
+ struct hist_field *operand;
+
+ operand = hist_field->operands[i];
+ if (field_has_hist_vars(operand, level + 1))
+ return true;
+ }
+
+ return false;
+}
+
+static bool has_hist_vars(struct hist_trigger_data *hist_data) +static bool has_hist_vars(struct hist_trigger_data *hist_data)
+{ +{
+ struct hist_field *hist_field; + struct hist_field *hist_field;
+ int i, j; + int i;
+ +
+ for_each_hist_field(i, hist_data) { + for_each_hist_field(i, hist_data) {
+ hist_field = hist_data->fields[i]; + hist_field = hist_data->fields[i];
+ if (hist_field && + if (field_has_hist_vars(hist_field, 0))
+ (hist_field->flags & HIST_FIELD_FL_VAR ||
+ hist_field->flags & HIST_FIELD_FL_VAR_REF))
+ return true; + return true;
+
+ for (j = 0; j < HIST_FIELD_OPERANDS_MAX; j++) {
+ struct hist_field *operand;
+
+ operand = hist_field->operands[j];
+ if (operand &&
+ (operand->flags & HIST_FIELD_FL_VAR ||
+ operand->flags & HIST_FIELD_FL_VAR_REF))
+ return true;
+ }
+ } + }
+ +
+ return false; + return false;
@ -267,52 +314,22 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ trace_array_put(tr); + trace_array_put(tr);
+} +}
+ +
+static struct hist_field *find_var_field(struct hist_trigger_data *hist_data, static struct hist_field *find_var_field(struct hist_trigger_data *hist_data,
+ const char *var_name) const char *var_name)
+{ {
+ struct hist_field *hist_field, *found = NULL; @@ -313,10 +531,148 @@ static struct hist_field *find_var(struc
+ int i; return NULL;
+ }
+ for_each_hist_field(i, hist_data) {
+ hist_field = hist_data->fields[i];
+ if (hist_field && hist_field->flags & HIST_FIELD_FL_VAR &&
+ strcmp(hist_field->var.name, var_name) == 0) {
+ found = hist_field;
+ break;
+ }
+ }
+
+ return found;
+}
+
+static struct hist_field *find_var(struct trace_event_file *file,
+ const char *var_name)
+{
+ struct hist_trigger_data *hist_data;
+ struct event_trigger_data *test;
+ struct hist_field *hist_field;
+
+ list_for_each_entry_rcu(test, &file->triggers, list) {
+ if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
+ hist_data = test->private_data;
+ hist_field = find_var_field(hist_data, var_name);
+ if (hist_field)
+ return hist_field;
+ }
+ }
+
+ return NULL;
+}
+
+static struct trace_event_file *find_var_file(struct trace_array *tr, +static struct trace_event_file *find_var_file(struct trace_array *tr,
+ const char *system, + char *system,
+ const char *event_name, + char *event_name,
+ const char *var_name) + char *var_name)
+{ +{
+ struct hist_trigger_data *var_hist_data; + struct hist_trigger_data *var_hist_data;
+ struct hist_var_data *var_data; + struct hist_var_data *var_data;
+ struct trace_event_call *call; + struct trace_event_call *call;
+ struct trace_event_file *file; + struct trace_event_file *file, *found = NULL;
+ const char *name; + const char *name;
+ +
+ list_for_each_entry(var_data, &tr->hist_vars, list) { + list_for_each_entry(var_data, &tr->hist_vars, list) {
@ -322,8 +339,13 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ name = trace_event_name(call); + name = trace_event_name(call);
+ +
+ if (!system || !event_name) { + if (!system || !event_name) {
+ if (find_var(file, var_name)) + if (find_var(var_hist_data, file, var_name)) {
+ return file; + if (found) {
+ return NULL;
+ }
+
+ found = file;
+ }
+ continue; + continue;
+ } + }
+ +
@ -332,10 +354,11 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ if (strcmp(system, call->class->system) != 0) + if (strcmp(system, call->class->system) != 0)
+ continue; + continue;
+ +
+ return file; + found = file;
+ break;
+ } + }
+ +
+ return NULL; + return found;
+} +}
+ +
+static struct hist_field *find_file_var(struct trace_event_file *file, +static struct hist_field *find_file_var(struct trace_event_file *file,
@ -357,11 +380,12 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ return NULL; + return NULL;
+} +}
+ +
+static struct hist_field *find_event_var(struct trace_array *tr, +static struct hist_field *find_event_var(struct hist_trigger_data *hist_data,
+ const char *system, + char *system,
+ const char *event_name, + char *event_name,
+ const char *var_name) + char *var_name)
+{ +{
+ struct trace_array *tr = hist_data->event_file->tr;
+ struct hist_field *hist_field = NULL; + struct hist_field *hist_field = NULL;
+ struct trace_event_file *file; + struct trace_event_file *file;
+ +
@ -442,17 +466,30 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static const char *hist_field_name(struct hist_field *field, static const char *hist_field_name(struct hist_field *field,
unsigned int level) unsigned int level)
{ {
@@ -291,7 +631,8 @@ static const char *hist_field_name(struc @@ -331,8 +687,20 @@ static const char *hist_field_name(struc
field_name = hist_field_name(field->operands[0], ++level); field_name = hist_field_name(field->operands[0], ++level);
else if (field->flags & HIST_FIELD_FL_TIMESTAMP) else if (field->flags & HIST_FIELD_FL_TIMESTAMP)
field_name = "$common_timestamp"; field_name = "$common_timestamp";
- else if (field->flags & HIST_FIELD_FL_EXPR) - else if (field->flags & HIST_FIELD_FL_EXPR)
- field_name = field->name;
+ else if (field->flags & HIST_FIELD_FL_EXPR || + else if (field->flags & HIST_FIELD_FL_EXPR ||
+ field->flags & HIST_FIELD_FL_VAR_REF) + field->flags & HIST_FIELD_FL_VAR_REF) {
field_name = field->name; + if (field->system) {
+ static char full_name[MAX_FILTER_STR_VAL];
+
+ strcat(full_name, field->system);
+ strcat(full_name, ".");
+ strcat(full_name, field->event_name);
+ strcat(full_name, ".");
+ strcat(full_name, field->name);
+ field_name = full_name;
+ } else
+ field_name = field->name;
+ }
if (field_name == NULL) if (field_name == NULL)
@@ -596,6 +937,8 @@ static char *expr_str(struct hist_field field_name = "";
@@ -636,6 +1004,8 @@ static char *expr_str(struct hist_field
return expr; return expr;
} }
@ -461,7 +498,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
strcat(expr, hist_field_name(field->operands[0], 0)); strcat(expr, hist_field_name(field->operands[0], 0));
if (field->operands[0]->flags) { if (field->operands[0]->flags) {
const char *flags_str = get_hist_field_flags(field->operands[0]); const char *flags_str = get_hist_field_flags(field->operands[0]);
@@ -618,6 +961,8 @@ static char *expr_str(struct hist_field @@ -658,6 +1028,8 @@ static char *expr_str(struct hist_field
return NULL; return NULL;
} }
@ -470,7 +507,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
strcat(expr, hist_field_name(field->operands[1], 0)); strcat(expr, hist_field_name(field->operands[1], 0));
if (field->operands[1]->flags) { if (field->operands[1]->flags) {
const char *flags_str = get_hist_field_flags(field->operands[1]); const char *flags_str = get_hist_field_flags(field->operands[1]);
@@ -697,6 +1042,11 @@ static struct hist_field *create_hist_fi @@ -737,6 +1109,11 @@ static struct hist_field *create_hist_fi
if (flags & HIST_FIELD_FL_EXPR) if (flags & HIST_FIELD_FL_EXPR)
goto out; /* caller will populate */ goto out; /* caller will populate */
@ -482,39 +519,65 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (flags & HIST_FIELD_FL_HITCOUNT) { if (flags & HIST_FIELD_FL_HITCOUNT) {
hist_field->fn = hist_field_counter; hist_field->fn = hist_field_counter;
hist_field->size = sizeof(u64); hist_field->size = sizeof(u64);
@@ -790,6 +1140,51 @@ static void destroy_hist_fields(struct h @@ -830,6 +1207,77 @@ static void destroy_hist_fields(struct h
} }
} }
+static int init_var_ref(struct hist_field *ref_field, +static int init_var_ref(struct hist_field *ref_field,
+ struct hist_field *var_field) + struct hist_field *var_field,
+ char *system, char *event_name)
+{ +{
+ int err = 0;
+
+ ref_field->var.idx = var_field->var.idx; + ref_field->var.idx = var_field->var.idx;
+ ref_field->var.hist_data = var_field->hist_data; + ref_field->var.hist_data = var_field->hist_data;
+ ref_field->size = var_field->size; + ref_field->size = var_field->size;
+ ref_field->is_signed = var_field->is_signed; + ref_field->is_signed = var_field->is_signed;
+ +
+ if (system) {
+ ref_field->system = kstrdup(system, GFP_KERNEL);
+ if (!ref_field->system)
+ return -ENOMEM;
+ }
+
+ if (event_name) {
+ ref_field->event_name = kstrdup(event_name, GFP_KERNEL);
+ if (!ref_field->event_name) {
+ err = -ENOMEM;
+ goto free;
+ }
+ }
+
+ ref_field->name = kstrdup(var_field->var.name, GFP_KERNEL); + ref_field->name = kstrdup(var_field->var.name, GFP_KERNEL);
+ if (!ref_field->name) + if (!ref_field->name) {
+ return -ENOMEM; + err = -ENOMEM;
+ goto free;
+ }
+ +
+ ref_field->type = kstrdup(var_field->type, GFP_KERNEL); + ref_field->type = kstrdup(var_field->type, GFP_KERNEL);
+ if (!ref_field->type) { + if (!ref_field->type) {
+ kfree(ref_field->name); + err = -ENOMEM;
+ return -ENOMEM; + goto free;
+ } + }
+ out:
+ return err;
+ free:
+ kfree(ref_field->system);
+ kfree(ref_field->event_name);
+ kfree(ref_field->name);
+ +
+ return 0; + goto out;
+} +}
+ +
+static struct hist_field *create_var_ref(struct hist_field *var_field) +static struct hist_field *create_var_ref(struct hist_field *var_field,
+ char *system, char *event_name)
+{ +{
+ unsigned long flags = HIST_FIELD_FL_VAR_REF; + unsigned long flags = HIST_FIELD_FL_VAR_REF;
+ struct hist_field *ref_field; + struct hist_field *ref_field;
+ +
+ ref_field = create_hist_field(var_field->hist_data, NULL, flags, NULL); + ref_field = create_hist_field(var_field->hist_data, NULL, flags, NULL);
+ if (ref_field) { + if (ref_field) {
+ if (init_var_ref(ref_field, var_field)) { + if (init_var_ref(ref_field, var_field, system, event_name)) {
+ destroy_hist_field(ref_field, 0); + destroy_hist_field(ref_field, 0);
+ return NULL; + return NULL;
+ } + }
@ -534,7 +597,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static char *field_name_from_var(struct hist_trigger_data *hist_data, static char *field_name_from_var(struct hist_trigger_data *hist_data,
char *var_name) char *var_name)
{ {
@@ -801,7 +1196,7 @@ static char *field_name_from_var(struct @@ -841,7 +1289,7 @@ static char *field_name_from_var(struct
if (strcmp(var_name, name) == 0) { if (strcmp(var_name, name) == 0) {
field = hist_data->attrs->var_defs.expr[i]; field = hist_data->attrs->var_defs.expr[i];
@ -543,7 +606,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
continue; continue;
return field; return field;
} }
@@ -813,11 +1208,32 @@ static char *field_name_from_var(struct @@ -853,11 +1301,32 @@ static char *field_name_from_var(struct
static char *local_field_var_ref(struct hist_trigger_data *hist_data, static char *local_field_var_ref(struct hist_trigger_data *hist_data,
char *var_name) char *var_name)
{ {
@ -555,7 +618,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
return field_name_from_var(hist_data, var_name); return field_name_from_var(hist_data, var_name);
} }
+static struct hist_field *parse_var_ref(struct trace_array *tr, +static struct hist_field *parse_var_ref(struct hist_trigger_data *hist_data,
+ char *system, char *event_name, + char *system, char *event_name,
+ char *var_name) + char *var_name)
+{ +{
@ -566,9 +629,9 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ var_name++; + var_name++;
+ +
+ var_field = find_event_var(tr, system, event_name, var_name); + var_field = find_event_var(hist_data, system, event_name, var_name);
+ if (var_field) + if (var_field)
+ ref_field = create_var_ref(var_field); + ref_field = create_var_ref(var_field, system, event_name);
+ +
+ return ref_field; + return ref_field;
+} +}
@ -576,13 +639,12 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static struct ftrace_event_field * static struct ftrace_event_field *
parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file, parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file,
char *field_str, unsigned long *flags) char *field_str, unsigned long *flags)
@@ -874,13 +1290,39 @@ struct hist_field *parse_atom(struct his @@ -914,13 +1383,38 @@ struct hist_field *parse_atom(struct his
struct trace_event_file *file, char *str, struct trace_event_file *file, char *str,
unsigned long *flags, char *var_name) unsigned long *flags, char *var_name)
{ {
- char *s; - char *s;
+ char *s, *ref_system = NULL, *ref_event = NULL, *ref_var = str; + char *s, *ref_system = NULL, *ref_event = NULL, *ref_var = str;
+ struct trace_array *tr = hist_data->event_file->tr;
struct ftrace_event_field *field = NULL; struct ftrace_event_field *field = NULL;
struct hist_field *hist_field = NULL; struct hist_field *hist_field = NULL;
int ret = 0; int ret = 0;
@ -609,7 +671,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ s = local_field_var_ref(hist_data, ref_var); + s = local_field_var_ref(hist_data, ref_var);
+ if (!s) { + if (!s) {
+ hist_field = parse_var_ref(tr, ref_system, ref_event, ref_var); + hist_field = parse_var_ref(hist_data, ref_system, ref_event, ref_var);
+ if (hist_field) { + if (hist_field) {
+ hist_data->var_refs[hist_data->n_var_refs] = hist_field; + hist_data->var_refs[hist_data->n_var_refs] = hist_field;
+ hist_field->var_ref_idx = hist_data->n_var_refs++; + hist_field->var_ref_idx = hist_data->n_var_refs++;
@ -619,7 +681,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
str = s; str = s;
field = parse_field(hist_data, file, str, flags); field = parse_field(hist_data, file, str, flags);
@@ -1053,6 +1495,9 @@ static struct hist_field *parse_expr(str @@ -1094,6 +1588,9 @@ static struct hist_field *parse_expr(str
goto free; goto free;
} }
@ -629,51 +691,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
expr->operands[0] = operand1; expr->operands[0] = operand1;
expr->operands[1] = operand2; expr->operands[1] = operand2;
expr->operator = field_op; expr->operator = field_op;
@@ -1099,43 +1544,6 @@ static int create_hitcount_val(struct hi @@ -1266,6 +1763,12 @@ static int create_key_field(struct hist_
return 0;
}
-static struct hist_field *find_var_field(struct hist_trigger_data *hist_data,
- const char *var_name)
-{
- struct hist_field *hist_field, *found = NULL;
- int i;
-
- for_each_hist_field(i, hist_data) {
- hist_field = hist_data->fields[i];
- if (hist_field && hist_field->flags & HIST_FIELD_FL_VAR &&
- strcmp(hist_field->var.name, var_name) == 0) {
- found = hist_field;
- break;
- }
- }
-
- return found;
-}
-
-static struct hist_field *find_var(struct trace_event_file *file,
- const char *var_name)
-{
- struct hist_trigger_data *hist_data;
- struct event_trigger_data *test;
- struct hist_field *hist_field;
-
- list_for_each_entry_rcu(test, &file->triggers, list) {
- if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
- hist_data = test->private_data;
- hist_field = find_var_field(hist_data, var_name);
- if (hist_field)
- return hist_field;
- }
- }
-
- return NULL;
-}
-
static int __create_val_field(struct hist_trigger_data *hist_data,
unsigned int val_idx,
struct trace_event_file *file,
@@ -1269,6 +1677,12 @@ static int create_key_field(struct hist_
goto out; goto out;
} }
@ -686,7 +704,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
key_size = hist_field->size; key_size = hist_field->size;
} }
@@ -1604,6 +2018,7 @@ create_hist_data(unsigned int map_bits, @@ -1604,6 +2107,7 @@ create_hist_data(unsigned int map_bits,
hist_data->attrs = attrs; hist_data->attrs = attrs;
hist_data->remove = remove; hist_data->remove = remove;
@ -694,7 +712,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
ret = create_hist_fields(hist_data, file); ret = create_hist_fields(hist_data, file);
if (ret) if (ret)
@@ -1626,12 +2041,6 @@ create_hist_data(unsigned int map_bits, @@ -1626,12 +2130,6 @@ create_hist_data(unsigned int map_bits,
ret = create_tracing_map_fields(hist_data); ret = create_tracing_map_fields(hist_data);
if (ret) if (ret)
goto free; goto free;
@ -707,7 +725,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
out: out:
return hist_data; return hist_data;
free: free:
@@ -1646,12 +2055,17 @@ create_hist_data(unsigned int map_bits, @@ -1646,12 +2144,17 @@ create_hist_data(unsigned int map_bits,
static void hist_trigger_elt_update(struct hist_trigger_data *hist_data, static void hist_trigger_elt_update(struct hist_trigger_data *hist_data,
struct tracing_map_elt *elt, void *rec, struct tracing_map_elt *elt, void *rec,
@ -726,7 +744,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
for_each_hist_val_field(i, hist_data) { for_each_hist_val_field(i, hist_data) {
hist_field = hist_data->fields[i]; hist_field = hist_data->fields[i];
hist_val = hist_field->fn(hist_field, elt, rbe, rec); hist_val = hist_field->fn(hist_field, elt, rbe, rec);
@@ -1704,6 +2118,7 @@ static void event_hist_trigger(struct ev @@ -1703,6 +2206,7 @@ static void event_hist_trigger(struct ev
struct hist_trigger_data *hist_data = data->private_data; struct hist_trigger_data *hist_data = data->private_data;
bool use_compound_key = (hist_data->n_keys > 1); bool use_compound_key = (hist_data->n_keys > 1);
unsigned long entries[HIST_STACKTRACE_DEPTH]; unsigned long entries[HIST_STACKTRACE_DEPTH];
@ -734,7 +752,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
char compound_key[HIST_KEY_SIZE_MAX]; char compound_key[HIST_KEY_SIZE_MAX];
struct tracing_map_elt *elt = NULL; struct tracing_map_elt *elt = NULL;
struct stack_trace stacktrace; struct stack_trace stacktrace;
@@ -1743,9 +2158,15 @@ static void event_hist_trigger(struct ev @@ -1742,9 +2246,15 @@ static void event_hist_trigger(struct ev
if (use_compound_key) if (use_compound_key)
key = compound_key; key = compound_key;
@ -752,17 +770,20 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} }
static void hist_trigger_stacktrace_print(struct seq_file *m, static void hist_trigger_stacktrace_print(struct seq_file *m,
@@ -1848,7 +2269,8 @@ hist_trigger_entry_print(struct seq_file @@ -1961,8 +2471,11 @@ static void hist_field_print(struct seq_
field_name = hist_field_name(hist_data->fields[i], 0);
if (hist_data->fields[i]->flags & HIST_FIELD_FL_VAR || if (hist_field->flags & HIST_FIELD_FL_TIMESTAMP)
- hist_data->fields[i]->flags & HIST_FIELD_FL_EXPR) seq_puts(m, "$common_timestamp");
+ hist_data->fields[i]->flags & HIST_FIELD_FL_EXPR || - else if (field_name)
+ hist_data->fields[i]->flags & HIST_FIELD_FL_VAR_REF) + else if (field_name) {
continue; + if (hist_field->flags & HIST_FIELD_FL_VAR_REF)
+ seq_putc(m, '$');
seq_printf(m, "%s", field_name);
+ }
if (hist_data->fields[i]->flags & HIST_FIELD_FL_HEX) { if (hist_field->flags) {
@@ -2098,7 +2520,11 @@ static void event_hist_trigger_free(stru const char *flags_str = get_hist_field_flags(hist_field);
@@ -2102,7 +2615,11 @@ static void event_hist_trigger_free(stru
if (!data->ref) { if (!data->ref) {
if (data->name) if (data->name)
del_named_trigger(data); del_named_trigger(data);
@ -774,7 +795,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
destroy_hist_data(hist_data); destroy_hist_data(hist_data);
} }
} }
@@ -2311,23 +2737,55 @@ static int hist_register_trigger(char *g @@ -2315,23 +2832,55 @@ static int hist_register_trigger(char *g
goto out; goto out;
} }
@ -794,7 +815,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+{ +{
+ int ret = 0; + int ret = 0;
+ +
+ list_add_rcu(&data->list, &file->triggers); + list_add_tail_rcu(&data->list, &file->triggers);
+ +
+ update_cond_flag(file); + update_cond_flag(file);
@ -834,7 +855,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static void hist_unregister_trigger(char *glob, struct event_trigger_ops *ops, static void hist_unregister_trigger(char *glob, struct event_trigger_ops *ops,
struct event_trigger_data *data, struct event_trigger_data *data,
struct trace_event_file *file) struct trace_event_file *file)
@@ -2360,10 +2818,29 @@ static void hist_unregister_trigger(char @@ -2364,11 +2913,30 @@ static void hist_unregister_trigger(char
} }
} }
@ -857,14 +878,15 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static void hist_unreg_all(struct trace_event_file *file) static void hist_unreg_all(struct trace_event_file *file)
{ {
struct event_trigger_data *test, *n; struct event_trigger_data *test, *n;
struct hist_trigger_data *hist_data;
+ if (hist_file_check_refs(file)) + if (hist_file_check_refs(file))
+ return; + return;
+ +
list_for_each_entry_safe(test, n, &file->triggers, list) { list_for_each_entry_safe(test, n, &file->triggers, list) {
if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) { if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
list_del_rcu(&test->list); hist_data = test->private_data;
@@ -2436,6 +2913,11 @@ static int event_hist_trigger_func(struc @@ -2444,6 +3012,11 @@ static int event_hist_trigger_func(struc
} }
if (remove) { if (remove) {
@ -876,7 +898,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file); cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file);
ret = 0; ret = 0;
goto out_free; goto out_free;
@@ -2453,14 +2935,33 @@ static int event_hist_trigger_func(struc @@ -2461,14 +3034,33 @@ static int event_hist_trigger_func(struc
goto out_free; goto out_free;
} else if (ret < 0) } else if (ret < 0)
goto out_free; goto out_free;

View File

@ -1,12 +1,13 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:01 +0200 Date: Sun, 22 Oct 2017 23:40:01 +0200
Subject: [PATCH 23/36] hrtimer: Split hrtimer_start_range_ns() Subject: [PATCH 23/36] hrtimer: Split hrtimer_start_range_ns()
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Preparatory patch for softirq based hrtimers to avoid code duplication. No Preparatory patch for softirq based hrtimers to avoid code duplication. No
functional change. functional change.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 44 ++++++++++++++++++++++++-------------------- kernel/time/hrtimer.c | 44 ++++++++++++++++++++++++--------------------

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:00 -0500 Date: Fri, 17 Nov 2017 14:33:02 -0600
Subject: [PATCH 29/42] tracing: Add hist trigger action hook Subject: [PATCH 23/37] tracing: Add hist trigger action hook
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Add a hook for executing extra actions whenever a histogram entry is Add a hook for executing extra actions whenever a histogram entry is
added or updated. added or updated.
@ -17,8 +17,8 @@ implemented on top of it in later patches.
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace_events_hist.c | 91 +++++++++++++++++++++++++++++++++++++-- kernel/trace/trace_events_hist.c | 108 +++++++++++++++++++++++++++++++++++++--
1 file changed, 88 insertions(+), 3 deletions(-) 1 file changed, 105 insertions(+), 3 deletions(-)
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@ -30,7 +30,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
enum field_op_id { enum field_op_id {
FIELD_OP_NONE, FIELD_OP_NONE,
@@ -241,6 +242,9 @@ struct hist_trigger_attrs { @@ -242,6 +243,9 @@ struct hist_trigger_attrs {
char *assignment_str[TRACING_MAP_VARS_MAX]; char *assignment_str[TRACING_MAP_VARS_MAX];
unsigned int n_assignments; unsigned int n_assignments;
@ -62,7 +62,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
}; };
static u64 hist_field_timestamp(struct hist_field *hist_field, static u64 hist_field_timestamp(struct hist_field *hist_field,
@@ -710,6 +729,9 @@ static void destroy_hist_trigger_attrs(s @@ -777,6 +796,9 @@ static void destroy_hist_trigger_attrs(s
for (i = 0; i < attrs->n_assignments; i++) for (i = 0; i < attrs->n_assignments; i++)
kfree(attrs->assignment_str[i]); kfree(attrs->assignment_str[i]);
@ -72,7 +72,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
kfree(attrs->name); kfree(attrs->name);
kfree(attrs->sort_key_str); kfree(attrs->sort_key_str);
kfree(attrs->keys_str); kfree(attrs->keys_str);
@@ -717,6 +739,16 @@ static void destroy_hist_trigger_attrs(s @@ -784,6 +806,16 @@ static void destroy_hist_trigger_attrs(s
kfree(attrs); kfree(attrs);
} }
@ -89,7 +89,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static int parse_assignment(char *str, struct hist_trigger_attrs *attrs) static int parse_assignment(char *str, struct hist_trigger_attrs *attrs)
{ {
int ret = 0; int ret = 0;
@@ -800,8 +832,9 @@ static struct hist_trigger_attrs *parse_ @@ -867,8 +899,9 @@ static struct hist_trigger_attrs *parse_
else if (strcmp(str, "clear") == 0) else if (strcmp(str, "clear") == 0)
attrs->clear = true; attrs->clear = true;
else { else {
@ -101,7 +101,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} }
} }
@@ -1949,11 +1982,42 @@ static int create_sort_keys(struct hist_ @@ -2038,11 +2071,55 @@ static int create_sort_keys(struct hist_
return ret; return ret;
} }
@ -116,8 +116,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ } + }
+} +}
+ +
+static int create_actions(struct hist_trigger_data *hist_data, +static int parse_actions(struct hist_trigger_data *hist_data)
+ struct trace_event_file *file)
+{ +{
+ unsigned int i; + unsigned int i;
+ int ret = 0; + int ret = 0;
@ -129,6 +128,20 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ return ret; + return ret;
+} +}
+
+static int create_actions(struct hist_trigger_data *hist_data,
+ struct trace_event_file *file)
+{
+ struct action_data *data;
+ unsigned int i;
+ int ret = 0;
+
+ for (i = 0; i < hist_data->attrs->n_actions; i++) {
+ data = hist_data->actions[i];
+ }
+
+ return ret;
+}
+ +
static void destroy_hist_data(struct hist_trigger_data *hist_data) static void destroy_hist_data(struct hist_trigger_data *hist_data)
{ {
@ -144,7 +157,18 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
kfree(hist_data); kfree(hist_data);
} }
@@ -2112,6 +2176,20 @@ static inline void add_to_key(char *comp @@ -2109,6 +2186,10 @@ create_hist_data(unsigned int map_bits,
hist_data->remove = remove;
hist_data->event_file = file;
+ ret = parse_actions(hist_data);
+ if (ret)
+ goto free;
+
ret = create_hist_fields(hist_data, file);
if (ret)
goto free;
@@ -2200,6 +2281,20 @@ static inline void add_to_key(char *comp
memcpy(compound_key + key_field->offset, key, size); memcpy(compound_key + key_field->offset, key, size);
} }
@ -165,7 +189,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static void event_hist_trigger(struct event_trigger_data *data, void *rec, static void event_hist_trigger(struct event_trigger_data *data, void *rec,
struct ring_buffer_event *rbe) struct ring_buffer_event *rbe)
{ {
@@ -2167,6 +2245,9 @@ static void event_hist_trigger(struct ev @@ -2255,6 +2350,9 @@ static void event_hist_trigger(struct ev
return; return;
hist_trigger_elt_update(hist_data, elt, rec, rbe, var_ref_vals); hist_trigger_elt_update(hist_data, elt, rec, rbe, var_ref_vals);
@ -175,7 +199,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} }
static void hist_trigger_stacktrace_print(struct seq_file *m, static void hist_trigger_stacktrace_print(struct seq_file *m,
@@ -2942,6 +3023,10 @@ static int event_hist_trigger_func(struc @@ -3041,6 +3139,10 @@ static int event_hist_trigger_func(struc
if (has_hist_vars(hist_data)) if (has_hist_vars(hist_data))
save_hist_vars(hist_data); save_hist_vars(hist_data);
@ -186,7 +210,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
ret = tracing_map_init(hist_data->map); ret = tracing_map_init(hist_data->map);
if (ret) if (ret)
goto out_unreg; goto out_unreg;
@@ -2963,8 +3048,8 @@ static int event_hist_trigger_func(struc @@ -3062,8 +3164,8 @@ static int event_hist_trigger_func(struc
remove_hist_vars(hist_data); remove_hist_vars(hist_data);
kfree(trigger_data); kfree(trigger_data);

View File

@ -1,12 +1,13 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:02 +0200 Date: Sun, 22 Oct 2017 23:40:02 +0200
Subject: [PATCH 24/36] hrtimer: Split __hrtimer_get_next_event() Subject: [PATCH 24/36] hrtimer: Split __hrtimer_get_next_event()
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Preparatory patch for softirq based hrtimers to avoid code duplication. No Preparatory patch for softirq based hrtimers to avoid code duplication. No
functional change. functional change.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 20 ++++++++++++++++---- kernel/time/hrtimer.c | 20 ++++++++++++++++----
@ -15,9 +16,9 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- a/kernel/time/hrtimer.c --- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c
@@ -459,13 +459,13 @@ static struct hrtimer_clock_base * @@ -459,13 +459,13 @@ static struct hrtimer_clock_base *
#define for_each_active_base(base, cpu_base, active) \
while ((base = __next_base((cpu_base), &(active)))) while ((base = __next_base((cpu_base), &(active))))
#if defined(CONFIG_NO_HZ_COMMON) || defined(CONFIG_HIGH_RES_TIMERS)
-static ktime_t __hrtimer_get_next_event(struct hrtimer_cpu_base *cpu_base) -static ktime_t __hrtimer_get_next_event(struct hrtimer_cpu_base *cpu_base)
+static ktime_t __hrtimer_next_event_base(struct hrtimer_cpu_base *cpu_base, +static ktime_t __hrtimer_next_event_base(struct hrtimer_cpu_base *cpu_base,
+ unsigned int active, + unsigned int active,

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:01 -0500 Date: Fri, 17 Nov 2017 14:33:03 -0600
Subject: [PATCH 30/42] tracing: Add support for 'synthetic' events Subject: [PATCH 24/37] tracing: Add support for 'synthetic' events
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Synthetic events are user-defined events generated from hist trigger Synthetic events are user-defined events generated from hist trigger
variables saved from one or more other events. variables saved from one or more other events.
@ -46,10 +46,12 @@ How this can be automatically hooked up via a hist trigger 'action' is
discussed in a subsequent patch. discussed in a subsequent patch.
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
[fix noderef.cocci warnings, sizeof pointer for kcalloc of event->fields]
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace_events_hist.c | 865 +++++++++++++++++++++++++++++++++++++++ kernel/trace/trace_events_hist.c | 908 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 865 insertions(+) 1 file changed, 906 insertions(+), 2 deletions(-)
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@ -97,7 +99,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
struct action_data; struct action_data;
typedef void (*action_fn_t) (struct hist_trigger_data *hist_data, typedef void (*action_fn_t) (struct hist_trigger_data *hist_data,
@@ -282,6 +308,800 @@ struct action_data { @@ -282,6 +308,803 @@ struct action_data {
unsigned int var_ref_idx; unsigned int var_ref_idx;
}; };
@ -265,7 +267,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ fmt = "%lu"; + fmt = "%lu";
+ else if (strcmp(type, "pid_t") == 0) + else if (strcmp(type, "pid_t") == 0)
+ fmt = "%d"; + fmt = "%d";
+ else if (strstr(type, "[") == 0) + else if (strchr(type, '[') != NULL)
+ fmt = "%s"; + fmt = "%s";
+ +
+ return fmt; + return fmt;
@ -549,7 +551,6 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ return NULL; + return NULL;
+} +}
+ +
+/* This function releases synth_event_mutex */
+static int register_synth_event(struct synth_event *event) +static int register_synth_event(struct synth_event *event)
+{ +{
+ struct trace_event_call *call = &event->call; + struct trace_event_call *call = &event->call;
@ -584,14 +585,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ call->data = event; + call->data = event;
+ call->tp = event->tp; + call->tp = event->tp;
+ +
+ /*
+ * trace_add_event_call() grabs event_mutex, but that can
+ * deadlock with a hist trigger cmd already holding it that
+ * can grab synth_event_mutex
+ */
+ mutex_unlock(&synth_event_mutex);
+ ret = trace_add_event_call(call); + ret = trace_add_event_call(call);
+ mutex_lock(&synth_event_mutex);
+ if (ret) { + if (ret) {
+ pr_warn("Failed to register synthetic event: %s\n", + pr_warn("Failed to register synthetic event: %s\n",
+ trace_event_name(call)); + trace_event_name(call));
@ -600,9 +594,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ ret = set_synth_event_print_fmt(call); + ret = set_synth_event_print_fmt(call);
+ if (ret < 0) { + if (ret < 0) {
+ mutex_unlock(&synth_event_mutex);
+ trace_remove_event_call(call); + trace_remove_event_call(call);
+ mutex_lock(&synth_event_mutex);
+ goto err; + goto err;
+ } + }
+ out: + out:
@ -612,42 +604,16 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ goto out; + goto out;
+} +}
+ +
+/* This function releases synth_event_mutex */
+static int unregister_synth_event(struct synth_event *event) +static int unregister_synth_event(struct synth_event *event)
+{ +{
+ struct trace_event_call *call = &event->call; + struct trace_event_call *call = &event->call;
+ int ret; + int ret;
+ +
+ mutex_unlock(&synth_event_mutex);
+ ret = trace_remove_event_call(call); + ret = trace_remove_event_call(call);
+ mutex_lock(&synth_event_mutex);
+ +
+ return ret; + return ret;
+} +}
+ +
+static int remove_synth_event(struct synth_event *event)
+{
+ int ret = unregister_synth_event(event);
+
+ if (!ret)
+ list_del(&event->list);
+
+ return ret;
+}
+
+static int add_synth_event(struct synth_event *event)
+{
+ int ret;
+
+ ret = register_synth_event(event);
+ if (ret)
+ return ret;
+
+ list_add(&event->list, &synth_event_list);
+
+ return 0;
+}
+
+static void free_synth_event(struct synth_event *event) +static void free_synth_event(struct synth_event *event)
+{ +{
+ unsigned int i; + unsigned int i;
@ -685,7 +651,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ goto out; + goto out;
+ } + }
+ +
+ event->fields = kcalloc(n_fields, sizeof(event->fields), GFP_KERNEL); + event->fields = kcalloc(n_fields, sizeof(*event->fields), GFP_KERNEL);
+ if (!event->fields) { + if (!event->fields) {
+ free_synth_event(event); + free_synth_event(event);
+ event = ERR_PTR(-ENOMEM); + event = ERR_PTR(-ENOMEM);
@ -700,7 +666,6 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ return event; + return event;
+} +}
+ +
+/* This function releases synth_event_mutex */
+static int create_synth_event(int argc, char **argv) +static int create_synth_event(int argc, char **argv)
+{ +{
+ struct synth_field *field, *fields[SYNTH_FIELDS_MAX]; + struct synth_field *field, *fields[SYNTH_FIELDS_MAX];
@ -732,20 +697,18 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ if (event) { + if (event) {
+ if (delete_event) { + if (delete_event) {
+ if (event->ref) { + if (event->ref) {
+ event = NULL;
+ ret = -EBUSY; + ret = -EBUSY;
+ goto out; + goto out;
+ } + }
+ ret = remove_synth_event(event); + list_del(&event->list);
+ if (!ret)
+ free_synth_event(event);
+ goto out; + goto out;
+ } + }
+ event = NULL;
+ ret = -EEXIST; + ret = -EEXIST;
+ goto out; + goto out;
+ } else if (delete_event) { + } else if (delete_event)
+ ret = -EINVAL;
+ goto out; + goto out;
+ }
+ +
+ if (argc < 2) { + if (argc < 2) {
+ ret = -EINVAL; + ret = -EINVAL;
@ -780,43 +743,85 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ event = NULL; + event = NULL;
+ goto err; + goto err;
+ } + }
+
+ add_synth_event(event);
+ out: + out:
+ mutex_unlock(&synth_event_mutex); + mutex_unlock(&synth_event_mutex);
+ +
+ if (event) {
+ if (delete_event) {
+ ret = unregister_synth_event(event);
+ if (!ret)
+ free_synth_event(event);
+ else {
+ mutex_lock(&synth_event_mutex);
+ if (!find_synth_event(event->name))
+ list_add(&event->list, &synth_event_list);
+ mutex_unlock(&synth_event_mutex);
+ }
+ } else {
+ ret = register_synth_event(event);
+ if (!ret) {
+ mutex_lock(&synth_event_mutex);
+ if (!find_synth_event(event->name))
+ list_add(&event->list, &synth_event_list);
+ mutex_unlock(&synth_event_mutex);
+ } else
+ free_synth_event(event);
+ }
+ }
+
+ return ret; + return ret;
+ err: + err:
+ mutex_unlock(&synth_event_mutex);
+
+ for (i = 0; i < n_fields; i++) + for (i = 0; i < n_fields; i++)
+ free_synth_field(fields[i]); + free_synth_field(fields[i]);
+ free_synth_event(event); + free_synth_event(event);
+ +
+ goto out; + return ret;
+} +}
+ +
+/* This function releases synth_event_mutex */
+static int release_all_synth_events(void) +static int release_all_synth_events(void)
+{ +{
+ struct list_head release_events;
+ struct synth_event *event, *e; + struct synth_event *event, *e;
+ int ret = 0; + int ret = 0, err = 0;
+
+ INIT_LIST_HEAD(&release_events);
+ +
+ mutex_lock(&synth_event_mutex); + mutex_lock(&synth_event_mutex);
+ +
+ list_for_each_entry(event, &synth_event_list, list) { + list_for_each_entry(event, &synth_event_list, list) {
+ if (event->ref) { + if (event->ref) {
+ ret = -EBUSY; + mutex_unlock(&synth_event_mutex);
+ goto out; + return -EBUSY;
+ } + }
+ } + }
+ +
+ list_for_each_entry_safe(event, e, &synth_event_list, list) { + list_for_each_entry_safe(event, e, &synth_event_list, list) {
+ ret = remove_synth_event(event); + list_del(&event->list);
+ if (!ret) + list_add(&event->list, &release_events);
+ free_synth_event(event);
+ } + }
+ out: +
+ mutex_unlock(&synth_event_mutex); + mutex_unlock(&synth_event_mutex);
+ +
+ list_for_each_entry_safe(event, e, &release_events, list) {
+ list_del(&event->list);
+
+ ret = unregister_synth_event(event);
+ if (ret == 0)
+ free_synth_event(event);
+ else {
+ err = ret;
+ mutex_lock(&synth_event_mutex);
+ if (!find_synth_event(event->name))
+ list_add(&event->list, &synth_event_list);
+ mutex_unlock(&synth_event_mutex);
+ }
+ }
+
+ if (err)
+ ret = err;
+
+ return ret; + return ret;
+} +}
+ +
@ -898,7 +903,60 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static u64 hist_field_timestamp(struct hist_field *hist_field, static u64 hist_field_timestamp(struct hist_field *hist_field,
struct tracing_map_elt *elt, struct tracing_map_elt *elt,
struct ring_buffer_event *rbe, struct ring_buffer_event *rbe,
@@ -2942,6 +3762,8 @@ static int event_hist_trigger_func(struc @@ -2956,6 +3779,28 @@ static int hist_trigger_enable(struct ev
return ret;
}
+static bool have_hist_trigger_match(struct event_trigger_data *data,
+ struct trace_event_file *file)
+{
+ struct hist_trigger_data *hist_data = data->private_data;
+ struct event_trigger_data *test, *named_data = NULL;
+ bool match = false;
+
+ if (hist_data->attrs->name)
+ named_data = find_named_trigger(hist_data->attrs->name);
+
+ list_for_each_entry_rcu(test, &file->triggers, list) {
+ if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
+ if (hist_trigger_match(data, test, named_data, false)) {
+ match = true;
+ break;
+ }
+ }
+ }
+
+ return match;
+}
+
static bool hist_trigger_check_refs(struct event_trigger_data *data,
struct trace_event_file *file)
{
@@ -3031,6 +3876,8 @@ static void hist_unreg_all(struct trace_
{
struct event_trigger_data *test, *n;
struct hist_trigger_data *hist_data;
+ struct synth_event *se;
+ const char *se_name;
if (hist_file_check_refs(file))
return;
@@ -3040,6 +3887,14 @@ static void hist_unreg_all(struct trace_
hist_data = test->private_data;
list_del_rcu(&test->list);
trace_event_trigger_enable_disable(file, 0);
+
+ mutex_lock(&synth_event_mutex);
+ se_name = trace_event_name(file->event_call);
+ se = find_synth_event(se_name);
+ if (se)
+ se->ref--;
+ mutex_unlock(&synth_event_mutex);
+
update_cond_flag(file);
if (test->ops->free)
test->ops->free(test->ops, test);
@@ -3058,6 +3913,8 @@ static int event_hist_trigger_func(struc
struct hist_trigger_attrs *attrs; struct hist_trigger_attrs *attrs;
struct event_trigger_ops *trigger_ops; struct event_trigger_ops *trigger_ops;
struct hist_trigger_data *hist_data; struct hist_trigger_data *hist_data;
@ -907,7 +965,30 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
bool remove = false; bool remove = false;
char *trigger; char *trigger;
int ret = 0; int ret = 0;
@@ -3000,6 +3822,14 @@ static int event_hist_trigger_func(struc @@ -3088,10 +3945,11 @@ static int event_hist_trigger_func(struc
trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger);
- ret = -ENOMEM;
trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL);
- if (!trigger_data)
+ if (!trigger_data) {
+ ret = -ENOMEM;
goto out_free;
+ }
trigger_data->count = -1;
trigger_data->ops = trigger_ops;
@@ -3110,12 +3968,23 @@ static int event_hist_trigger_func(struc
}
if (remove) {
+ if (!have_hist_trigger_match(trigger_data, file))
+ goto out_free;
+
if (hist_trigger_check_refs(trigger_data, file)) {
ret = -EBUSY;
goto out_free;
} }
cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file); cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file);
@ -922,9 +1003,9 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
ret = 0; ret = 0;
goto out_free; goto out_free;
} }
@@ -3017,6 +3847,13 @@ static int event_hist_trigger_func(struc @@ -3151,6 +4020,13 @@ static int event_hist_trigger_func(struc
} else if (ret < 0) if (ret)
goto out_free; goto out_unreg;
+ mutex_lock(&synth_event_mutex); + mutex_lock(&synth_event_mutex);
+ se_name = trace_event_name(file->event_call); + se_name = trace_event_name(file->event_call);
@ -933,10 +1014,10 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ se->ref++; + se->ref++;
+ mutex_unlock(&synth_event_mutex); + mutex_unlock(&synth_event_mutex);
+ +
if (get_named_trigger_data(trigger_data)) /* Just return zero, not the number of registered triggers */
goto enable; ret = 0;
out:
@@ -3207,3 +4044,31 @@ static __init void unregister_trigger_hi @@ -3323,3 +4199,31 @@ static __init void unregister_trigger_hi
return ret; return ret;
} }

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:03 +0200 Date: Sun, 22 Oct 2017 23:40:03 +0200
Subject: [PATCH 25/36] hrtimer: Use irqsave/irqrestore around __run_hrtimer() Subject: [PATCH 25/36] hrtimer: Use irqsave/irqrestore around __run_hrtimer()
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
__run_hrtimer() is called with the hrtimer_cpu_base.lock held and __run_hrtimer() is called with the hrtimer_cpu_base.lock held and
interrupts disabled. Before invoking the timer callback the base lock is interrupts disabled. Before invoking the timer callback the base lock is
@ -18,6 +18,7 @@ interrupt enabled state when called from softirq context.
Suggested-by: Peter Zijlstra <peterz@infradead.org> Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 31 ++++++++++++++++++------------- kernel/time/hrtimer.c | 31 ++++++++++++++++++-------------

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:02 -0500 Date: Fri, 17 Nov 2017 14:33:04 -0600
Subject: [PATCH 31/42] tracing: Add support for 'field variables' Subject: [PATCH 25/37] tracing: Add support for 'field variables'
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Users should be able to directly specify event fields in hist trigger Users should be able to directly specify event fields in hist trigger
'actions' rather than being forced to explicitly create a variable for 'actions' rather than being forced to explicitly create a variable for
@ -25,7 +25,7 @@ sched_switch, and prio is a normal field on sched_waking.
Since the mechanism works on variables, those two normal fields just Since the mechanism works on variables, those two normal fields just
have 'invisible' variables created internally for them. In the case of have 'invisible' variables created internally for them. In the case of
'prio', which is on another event, we actually need to create an 'prio', which is on another event, we actually need to create an
additional hist trigger and define the invisible event on that, since additional hist trigger and define the invisible variable on that, since
once a hist trigger is defined, variables can't be added to it later. once a hist trigger is defined, variables can't be added to it later.
echo 'wakeup_latency u64 lat; pid_t pid; int prio' >> echo 'wakeup_latency u64 lat; pid_t pid; int prio' >>
@ -41,12 +41,12 @@ echo 'hist:keys=next_pid:wakeup_lat=$common_timestamp.usecs-$ts0:
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace_events_hist.c | 450 ++++++++++++++++++++++++++++++++++++++- kernel/trace/trace_events_hist.c | 536 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 449 insertions(+), 1 deletion(-) 1 file changed, 535 insertions(+), 1 deletion(-)
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@@ -254,6 +254,16 @@ struct hist_trigger_attrs { @@ -255,6 +255,16 @@ struct hist_trigger_attrs {
struct var_defs var_defs; struct var_defs var_defs;
}; };
@ -78,7 +78,16 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
}; };
struct synth_field { struct synth_field {
@@ -1394,6 +1412,7 @@ static struct hist_field *find_event_var @@ -1387,6 +1405,8 @@ static struct trace_event_file *find_var
list_for_each_entry(var_data, &tr->hist_vars, list) {
var_hist_data = var_data->hist_data;
file = var_hist_data->event_file;
+ if (file == found)
+ continue;
call = file->event_call;
name = trace_event_name(call);
@@ -1453,6 +1473,7 @@ static struct hist_field *find_event_var
struct hist_elt_data { struct hist_elt_data {
char *comm; char *comm;
u64 *var_ref_vals; u64 *var_ref_vals;
@ -86,7 +95,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
}; };
static u64 hist_field_var_ref(struct hist_field *hist_field, static u64 hist_field_var_ref(struct hist_field *hist_field,
@@ -1687,6 +1706,11 @@ static inline void save_comm(char *comm, @@ -1757,6 +1778,11 @@ static inline void save_comm(char *comm,
static void hist_elt_data_free(struct hist_elt_data *elt_data) static void hist_elt_data_free(struct hist_elt_data *elt_data)
{ {
@ -98,7 +107,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
kfree(elt_data->comm); kfree(elt_data->comm);
kfree(elt_data); kfree(elt_data);
} }
@@ -1704,7 +1728,7 @@ static int hist_trigger_elt_data_alloc(s @@ -1774,7 +1800,7 @@ static int hist_trigger_elt_data_alloc(s
unsigned int size = TASK_COMM_LEN + 1; unsigned int size = TASK_COMM_LEN + 1;
struct hist_elt_data *elt_data; struct hist_elt_data *elt_data;
struct hist_field *key_field; struct hist_field *key_field;
@ -107,7 +116,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
elt_data = kzalloc(sizeof(*elt_data), GFP_KERNEL); elt_data = kzalloc(sizeof(*elt_data), GFP_KERNEL);
if (!elt_data) if (!elt_data)
@@ -1723,6 +1747,18 @@ static int hist_trigger_elt_data_alloc(s @@ -1793,6 +1819,18 @@ static int hist_trigger_elt_data_alloc(s
} }
} }
@ -126,7 +135,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
elt->private_data = elt_data; elt->private_data = elt_data;
return 0; return 0;
@@ -2381,6 +2417,387 @@ static struct hist_field *parse_expr(str @@ -2477,6 +2515,471 @@ static struct hist_field *parse_expr(str
return ERR_PTR(ret); return ERR_PTR(ret);
} }
@ -165,7 +174,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ for (n = 0; n < n_keys; n++) { + for (n = 0; n < n_keys; n++) {
+ hist_field = hist_data->fields[i + n]; + hist_field = hist_data->fields[i + n];
+ target_hist_field = hist_data->fields[j + n]; + target_hist_field = target_hist_data->fields[j + n];
+ +
+ if (strcmp(hist_field->type, target_hist_field->type) != 0) + if (strcmp(hist_field->type, target_hist_field->type) != 0)
+ return false; + return false;
@ -213,8 +222,54 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+} +}
+ +
+static struct hist_field * +static struct hist_field *
+find_synthetic_field_var(struct hist_trigger_data *target_hist_data,
+ char *system, char *event_name, char *field_name)
+{
+ struct hist_field *event_var;
+ char *synthetic_name;
+
+ synthetic_name = kzalloc(MAX_FILTER_STR_VAL, GFP_KERNEL);
+ if (!synthetic_name)
+ return ERR_PTR(-ENOMEM);
+
+ strcpy(synthetic_name, "synthetic_");
+ strcat(synthetic_name, field_name);
+
+ event_var = find_event_var(target_hist_data, system, event_name, synthetic_name);
+
+ kfree(synthetic_name);
+
+ return event_var;
+}
+
+/**
+ * create_field_var_hist - Automatically create a histogram and var for a field
+ * @target_hist_data: The target hist trigger
+ * @subsys_name: Optional subsystem name
+ * @event_name: Optional event name
+ * @field_name: The name of the field (and the resulting variable)
+ *
+ * Hist trigger actions fetch data from variables, not directly from
+ * events. However, for convenience, users are allowed to directly
+ * specify an event field in an action, which will be automatically
+ * converted into a variable on their behalf.
+
+ * If a user specifies a field on an event that isn't the event the
+ * histogram currently being defined (the target event histogram), the
+ * only way that can be accomplished is if a new hist trigger is
+ * created and the field variable defined on that.
+ *
+ * This function creates a new histogram compatible with the target
+ * event (meaning a histogram with the same key as the target
+ * histogram), and creates a variable for the specified field, but
+ * with 'synthetic_' prepended to the variable name in order to avoid
+ * collision with normal field variables.
+ *
+ * Return: The variable created for the field.
+ */
+struct hist_field *
+create_field_var_hist(struct hist_trigger_data *target_hist_data, +create_field_var_hist(struct hist_trigger_data *target_hist_data,
+ char *system, char *event_name, char *field_name) + char *subsys_name, char *event_name, char *field_name)
+{ +{
+ struct trace_array *tr = target_hist_data->event_file->tr; + struct trace_array *tr = target_hist_data->event_file->tr;
+ struct hist_field *event_var = ERR_PTR(-EINVAL); + struct hist_field *event_var = ERR_PTR(-EINVAL);
@ -230,17 +285,29 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ if (target_hist_data->n_field_var_hists >= SYNTH_FIELDS_MAX) + if (target_hist_data->n_field_var_hists >= SYNTH_FIELDS_MAX)
+ return ERR_PTR(-EINVAL); + return ERR_PTR(-EINVAL);
+ +
+ file = event_file(tr, system, event_name); + file = event_file(tr, subsys_name, event_name);
+ +
+ if (IS_ERR(file)) { + if (IS_ERR(file)) {
+ ret = PTR_ERR(file); + ret = PTR_ERR(file);
+ return ERR_PTR(ret); + return ERR_PTR(ret);
+ } + }
+ +
+ /*
+ * Look for a histogram compatible with target. We'll use the
+ * found histogram specification to create a new matching
+ * histogram with our variable on it. target_hist_data is not
+ * yet a registered histogram so we can't use that.
+ */
+ hist_data = find_compatible_hist(target_hist_data, file); + hist_data = find_compatible_hist(target_hist_data, file);
+ if (!hist_data) + if (!hist_data)
+ return ERR_PTR(-EINVAL); + return ERR_PTR(-EINVAL);
+ +
+ /* See if a synthetic field variable has already been created */
+ event_var = find_synthetic_field_var(target_hist_data, subsys_name,
+ event_name, field_name);
+ if (event_var && !IS_ERR(event_var))
+ return event_var;
+
+ var_hist = kzalloc(sizeof(*var_hist), GFP_KERNEL); + var_hist = kzalloc(sizeof(*var_hist), GFP_KERNEL);
+ if (!var_hist) + if (!var_hist)
+ return ERR_PTR(-ENOMEM); + return ERR_PTR(-ENOMEM);
@ -251,6 +318,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ return ERR_PTR(-ENOMEM); + return ERR_PTR(-ENOMEM);
+ } + }
+ +
+ /* Use the same keys as the compatible histogram */
+ strcat(cmd, "keys="); + strcat(cmd, "keys=");
+ +
+ for_each_hist_key_field(i, hist_data) { + for_each_hist_key_field(i, hist_data) {
@ -261,11 +329,13 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ first = false; + first = false;
+ } + }
+ +
+ /* Create the synthetic field variable specification */
+ strcat(cmd, ":synthetic_"); + strcat(cmd, ":synthetic_");
+ strcat(cmd, field_name); + strcat(cmd, field_name);
+ strcat(cmd, "="); + strcat(cmd, "=");
+ strcat(cmd, field_name); + strcat(cmd, field_name);
+ +
+ /* Use the same filter as the compatible histogram */
+ saved_filter = find_trigger_filter(hist_data, file); + saved_filter = find_trigger_filter(hist_data, file);
+ if (saved_filter) { + if (saved_filter) {
+ strcat(cmd, " if "); + strcat(cmd, " if ");
@ -279,8 +349,10 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ return ERR_PTR(-ENOMEM); + return ERR_PTR(-ENOMEM);
+ } + }
+ +
+ /* Save the compatible histogram information */
+ var_hist->hist_data = hist_data; + var_hist->hist_data = hist_data;
+ +
+ /* Create the new histogram with our variable */
+ ret = event_hist_trigger_func(&trigger_hist_cmd, file, + ret = event_hist_trigger_func(&trigger_hist_cmd, file,
+ "", "hist", cmd); + "", "hist", cmd);
+ if (ret) { + if (ret) {
@ -290,11 +362,12 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ return ERR_PTR(ret); + return ERR_PTR(ret);
+ } + }
+ +
+ strcpy(cmd, "synthetic_"); + kfree(cmd);
+ strcat(cmd, field_name);
+ +
+ event_var = find_event_var(tr, system, event_name, cmd); + /* If we can't find the variable, something went wrong */
+ if (!event_var) { + event_var = find_synthetic_field_var(target_hist_data, subsys_name,
+ event_name, field_name);
+ if (!event_var || IS_ERR(event_var)) {
+ kfree(cmd); + kfree(cmd);
+ kfree(var_hist->cmd); + kfree(var_hist->cmd);
+ kfree(var_hist); + kfree(var_hist);
@ -308,14 +381,14 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ return event_var; + return event_var;
+} +}
+ +
+static struct hist_field * +struct hist_field *
+find_target_event_var(struct hist_trigger_data *hist_data, +find_target_event_var(struct hist_trigger_data *hist_data,
+ char *system, char *event_name, char *var_name) + char *subsys_name, char *event_name, char *var_name)
+{ +{
+ struct trace_event_file *file = hist_data->event_file; + struct trace_event_file *file = hist_data->event_file;
+ struct hist_field *hist_field = NULL; + struct hist_field *hist_field = NULL;
+ +
+ if (system) { + if (subsys_name) {
+ struct trace_event_call *call; + struct trace_event_call *call;
+ +
+ if (!event_name) + if (!event_name)
@ -323,7 +396,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ call = file->event_call; + call = file->event_call;
+ +
+ if (strcmp(system, call->class->system) != 0) + if (strcmp(subsys_name, call->class->system) != 0)
+ return NULL; + return NULL;
+ +
+ if (strcmp(event_name, trace_event_name(call)) != 0) + if (strcmp(event_name, trace_event_name(call)) != 0)
@ -381,7 +454,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ struct hist_field *var; + struct hist_field *var;
+ int idx; + int idx;
+ +
+ if (find_var(file, name) && !hist_data->remove) { + if (find_var(hist_data, file, name) && !hist_data->remove) {
+ var = ERR_PTR(-EINVAL); + var = ERR_PTR(-EINVAL);
+ goto out; + goto out;
+ } + }
@ -459,13 +532,33 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ goto out; + goto out;
+} +}
+ +
+static struct field_var * +/**
+create_target_field_var(struct hist_trigger_data *hist_data, + * create_target_field_var - Automatically create a variable for a field
+ char *system, char *event_name, char *var_name) + * @target_hist_data: The target hist trigger
+{ + * @subsys_name: Optional subsystem name
+ struct trace_event_file *file = hist_data->event_file; + * @event_name: Optional event name
+ * @var_name: The name of the field (and the resulting variable)
+ *
+ * Hist trigger actions fetch data from variables, not directly from
+ * events. However, for convenience, users are allowed to directly
+ * specify an event field in an action, which will be automatically
+ * converted into a variable on their behalf.
+ +
+ if (system) { + * This function creates a field variable with the name var_name on
+ * the hist trigger currently being defined on the target event. If
+ * subsys_name and event_name are specified, this function simply
+ * verifies that they do in fact match the target event subsystem and
+ * event name.
+ *
+ * Return: The variable created for the field.
+ */
+struct field_var *
+create_target_field_var(struct hist_trigger_data *target_hist_data,
+ char *subsys_name, char *event_name, char *var_name)
+{
+ struct trace_event_file *file = target_hist_data->event_file;
+
+ if (subsys_name) {
+ struct trace_event_call *call; + struct trace_event_call *call;
+ +
+ if (!event_name) + if (!event_name)
@ -473,14 +566,14 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ call = file->event_call; + call = file->event_call;
+ +
+ if (strcmp(system, call->class->system) != 0) + if (strcmp(subsys_name, call->class->system) != 0)
+ return NULL; + return NULL;
+ +
+ if (strcmp(event_name, trace_event_name(call)) != 0) + if (strcmp(event_name, trace_event_name(call)) != 0)
+ return NULL; + return NULL;
+ } + }
+ +
+ return create_field_var(hist_data, file, var_name); + return create_field_var(target_hist_data, file, var_name);
+} +}
+ +
+static void destroy_field_var(struct field_var *field_var) +static void destroy_field_var(struct field_var *field_var)
@ -502,8 +595,8 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ destroy_field_var(hist_data->field_vars[i]); + destroy_field_var(hist_data->field_vars[i]);
+} +}
+ +
+static void save_field_var(struct hist_trigger_data *hist_data, +void save_field_var(struct hist_trigger_data *hist_data,
+ struct field_var *field_var) + struct field_var *field_var)
+{ +{
+ hist_data->field_vars[hist_data->n_field_vars++] = field_var; + hist_data->field_vars[hist_data->n_field_vars++] = field_var;
+ +
@ -514,7 +607,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static int create_hitcount_val(struct hist_trigger_data *hist_data) static int create_hitcount_val(struct hist_trigger_data *hist_data)
{ {
hist_data->fields[HITCOUNT_IDX] = hist_data->fields[HITCOUNT_IDX] =
@@ -2827,6 +3244,16 @@ static int create_actions(struct hist_tr @@ -2932,6 +3435,16 @@ static int create_actions(struct hist_tr
return ret; return ret;
} }
@ -531,7 +624,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static void destroy_hist_data(struct hist_trigger_data *hist_data) static void destroy_hist_data(struct hist_trigger_data *hist_data)
{ {
if (!hist_data) if (!hist_data)
@@ -2837,6 +3264,8 @@ static void destroy_hist_data(struct his @@ -2942,6 +3455,8 @@ static void destroy_hist_data(struct his
tracing_map_destroy(hist_data->map); tracing_map_destroy(hist_data->map);
destroy_actions(hist_data); destroy_actions(hist_data);
@ -540,7 +633,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
kfree(hist_data); kfree(hist_data);
} }
@@ -2970,6 +3399,8 @@ static void hist_trigger_elt_update(stru @@ -3078,6 +3593,8 @@ static void hist_trigger_elt_update(stru
tracing_map_set_var(elt, var_idx, hist_val); tracing_map_set_var(elt, var_idx, hist_val);
} }
} }
@ -549,7 +642,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} }
static inline void add_to_key(char *compound_key, void *key, static inline void add_to_key(char *compound_key, void *key,
@@ -3687,6 +4118,21 @@ static bool hist_trigger_check_refs(stru @@ -3824,6 +4341,21 @@ static bool hist_trigger_check_refs(stru
return false; return false;
} }
@ -571,7 +664,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static void hist_unregister_trigger(char *glob, struct event_trigger_ops *ops, static void hist_unregister_trigger(char *glob, struct event_trigger_ops *ops,
struct event_trigger_data *data, struct event_trigger_data *data,
struct trace_event_file *file) struct trace_event_file *file)
@@ -3702,6 +4148,7 @@ static void hist_unregister_trigger(char @@ -3839,6 +4371,7 @@ static void hist_unregister_trigger(char
if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) { if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
if (!hist_trigger_match(data, test, named_data, false)) if (!hist_trigger_match(data, test, named_data, false))
continue; continue;
@ -579,11 +672,11 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
unregistered = true; unregistered = true;
list_del_rcu(&test->list); list_del_rcu(&test->list);
trace_event_trigger_enable_disable(file, 0); trace_event_trigger_enable_disable(file, 0);
@@ -3744,6 +4191,7 @@ static void hist_unreg_all(struct trace_ @@ -3885,6 +4418,7 @@ static void hist_unreg_all(struct trace_
list_for_each_entry_safe(test, n, &file->triggers, list) { list_for_each_entry_safe(test, n, &file->triggers, list) {
if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) { if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
+ unregister_field_var_hists(test->private_data); hist_data = test->private_data;
+ unregister_field_var_hists(hist_data);
list_del_rcu(&test->list); list_del_rcu(&test->list);
trace_event_trigger_enable_disable(file, 0); trace_event_trigger_enable_disable(file, 0);
update_cond_flag(file);

View File

@ -2,7 +2,7 @@ From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:04 +0200 Date: Sun, 22 Oct 2017 23:40:04 +0200
Subject: [PATCH 26/36] hrtimer: Add clock bases and hrtimer mode for soft irq Subject: [PATCH 26/36] hrtimer: Add clock bases and hrtimer mode for soft irq
context context
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
hrtimer callback functions are always executed in hard interrupt hrtimer callback functions are always executed in hard interrupt
context. Users of hrtimer which need their timer function to be executed context. Users of hrtimer which need their timer function to be executed
@ -18,6 +18,7 @@ HRTIMER_MODE_SOFT and the matching combinations with the ABS/REL/PINNED
bits and update the decoding of hrtimer_mode in tracepoints. bits and update the decoding of hrtimer_mode in tracepoints.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 14 ++++++++++++++ include/linux/hrtimer.h | 14 ++++++++++++++

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:03 -0500 Date: Fri, 17 Nov 2017 14:33:05 -0600
Subject: [PATCH 32/42] tracing: Add 'onmatch' hist trigger action support Subject: [PATCH 26/37] tracing: Add 'onmatch' hist trigger action support
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Add an 'onmatch(matching.event).<synthetic_event_name>(param list)' Add an 'onmatch(matching.event).<synthetic_event_name>(param list)'
hist trigger action which is invoked with the set of variables or hist trigger action which is invoked with the set of variables or
@ -43,8 +43,8 @@ Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com> Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace_events_hist.c | 406 +++++++++++++++++++++++++++++++++++++-- kernel/trace/trace_events_hist.c | 472 +++++++++++++++++++++++++++++++++++++--
1 file changed, 394 insertions(+), 12 deletions(-) 1 file changed, 459 insertions(+), 13 deletions(-)
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@ -68,7 +68,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
}; };
static LIST_HEAD(synth_event_list); static LIST_HEAD(synth_event_list);
@@ -925,6 +936,21 @@ static struct synth_event *alloc_synth_e @@ -889,6 +900,21 @@ static struct synth_event *alloc_synth_e
return event; return event;
} }
@ -87,22 +87,10 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ struct hist_trigger_data *hist_data; + struct hist_trigger_data *hist_data;
+}; +};
+ +
/* This function releases synth_event_mutex */
static int create_synth_event(int argc, char **argv) static int create_synth_event(int argc, char **argv)
{ {
@@ -967,10 +993,8 @@ static int create_synth_event(int argc, struct synth_field *field, *fields[SYNTH_FIELDS_MAX];
} @@ -1139,11 +1165,6 @@ static u64 hist_field_timestamp(struct h
ret = -EEXIST;
goto out;
- } else if (delete_event) {
- ret = -EINVAL;
+ } else if (delete_event)
goto out;
- }
if (argc < 2) {
ret = -EINVAL;
@@ -1136,11 +1160,6 @@ static u64 hist_field_timestamp(struct h
return ts; return ts;
} }
@ -111,10 +99,63 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
- struct hist_trigger_data *hist_data; - struct hist_trigger_data *hist_data;
-}; -};
- -
static struct hist_field *check_var_ref(struct hist_field *hist_field, static struct hist_field *
struct hist_trigger_data *var_data, check_field_for_var_ref(struct hist_field *hist_field,
unsigned int var_idx) struct hist_trigger_data *var_data,
@@ -1580,11 +1599,21 @@ static void destroy_hist_trigger_attrs(s @@ -1452,6 +1473,37 @@ static struct hist_field *find_file_var(
return NULL;
}
+static struct hist_field *
+find_match_var(struct hist_trigger_data *hist_data, char *var_name)
+{
+ struct trace_array *tr = hist_data->event_file->tr;
+ struct hist_field *hist_field, *found = NULL;
+ struct trace_event_file *file;
+ unsigned int i;
+
+ for (i = 0; i < hist_data->n_actions; i++) {
+ struct action_data *data = hist_data->actions[i];
+
+ if (data->fn == action_trace) {
+ char *system = data->onmatch.match_event_system;
+ char *event_name = data->onmatch.match_event;
+
+ file = find_var_file(tr, system, event_name, var_name);
+ if (!file)
+ continue;
+ hist_field = find_file_var(file, var_name);
+ if (hist_field) {
+ if (found) {
+ return ERR_PTR(-EINVAL);
+ }
+
+ found = hist_field;
+ }
+ }
+ }
+ return found;
+}
+
static struct hist_field *find_event_var(struct hist_trigger_data *hist_data,
char *system,
char *event_name,
@@ -1461,6 +1513,14 @@ static struct hist_field *find_event_var
struct hist_field *hist_field = NULL;
struct trace_event_file *file;
+ if (!system || !event_name) {
+ hist_field = find_match_var(hist_data, var_name);
+ if (IS_ERR(hist_field))
+ return NULL;
+ if (hist_field)
+ return hist_field;
+ }
+
file = find_var_file(tr, system, event_name, var_name);
if (!file)
return NULL;
@@ -1652,11 +1712,21 @@ static void destroy_hist_trigger_attrs(s
static int parse_action(char *str, struct hist_trigger_attrs *attrs) static int parse_action(char *str, struct hist_trigger_attrs *attrs)
{ {
@ -137,17 +178,35 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
return ret; return ret;
} }
@@ -2452,7 +2481,7 @@ static bool compatible_keys(struct hist_ @@ -2643,7 +2713,7 @@ find_synthetic_field_var(struct hist_tri
*
* Return: The variable created for the field.
*/
-struct hist_field *
+static struct hist_field *
create_field_var_hist(struct hist_trigger_data *target_hist_data,
char *subsys_name, char *event_name, char *field_name)
{
@@ -2757,7 +2827,7 @@ create_field_var_hist(struct hist_trigge
return event_var;
}
for (n = 0; n < n_keys; n++) { -struct hist_field *
hist_field = hist_data->fields[i + n]; +static struct hist_field *
- target_hist_field = hist_data->fields[j + n]; find_target_event_var(struct hist_trigger_data *hist_data,
+ target_hist_field = target_hist_data->fields[j + n]; char *subsys_name, char *event_name, char *var_name)
{
if (strcmp(hist_field->type, target_hist_field->type) != 0) @@ -2928,7 +2998,7 @@ static struct field_var *create_field_va
return false; *
@@ -2770,6 +2799,27 @@ create_target_field_var(struct hist_trig * Return: The variable created for the field.
return create_field_var(hist_data, file, var_name); */
-struct field_var *
+static struct field_var *
create_target_field_var(struct hist_trigger_data *target_hist_data,
char *subsys_name, char *event_name, char *var_name)
{
@@ -2952,6 +3022,27 @@ create_target_field_var(struct hist_trig
return create_field_var(target_hist_data, file, var_name);
} }
+static void onmatch_destroy(struct action_data *data) +static void onmatch_destroy(struct action_data *data)
@ -174,7 +233,18 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static void destroy_field_var(struct field_var *field_var) static void destroy_field_var(struct field_var *field_var)
{ {
if (!field_var) if (!field_var)
@@ -2798,6 +2848,283 @@ static void save_field_var(struct hist_t @@ -2971,8 +3062,8 @@ static void destroy_field_vars(struct hi
destroy_field_var(hist_data->field_vars[i]);
}
-void save_field_var(struct hist_trigger_data *hist_data,
- struct field_var *field_var)
+static void save_field_var(struct hist_trigger_data *hist_data,
+ struct field_var *field_var)
{
hist_data->field_vars[hist_data->n_field_vars++] = field_var;
@@ -2980,6 +3071,298 @@ void save_field_var(struct hist_trigger_
hist_data->n_field_var_str++; hist_data->n_field_var_str++;
} }
@ -250,7 +320,6 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+onmatch_find_var(struct hist_trigger_data *hist_data, struct action_data *data, +onmatch_find_var(struct hist_trigger_data *hist_data, struct action_data *data,
+ char *system, char *event, char *var) + char *system, char *event, char *var)
+{ +{
+ struct trace_array *tr = hist_data->event_file->tr;
+ struct hist_field *hist_field; + struct hist_field *hist_field;
+ +
+ var++; /* skip '$' */ + var++; /* skip '$' */
@ -262,7 +331,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ event = data->onmatch.match_event; + event = data->onmatch.match_event;
+ } + }
+ +
+ hist_field = find_event_var(tr, system, event, var); + hist_field = find_event_var(hist_data, system, event, var);
+ } + }
+ +
+ return hist_field; + return hist_field;
@ -276,19 +345,36 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ struct hist_field *hist_field = NULL; + struct hist_field *hist_field = NULL;
+ struct field_var *field_var; + struct field_var *field_var;
+ +
+ /*
+ * First try to create a field var on the target event (the
+ * currently being defined). This will create a variable for
+ * unqualified fields on the target event, or if qualified,
+ * target fields that have qualified names matching the target.
+ */
+ field_var = create_target_field_var(hist_data, system, event, var); + field_var = create_target_field_var(hist_data, system, event, var);
+ if (IS_ERR(field_var))
+ goto out;
+ +
+ if (field_var) { + if (field_var && !IS_ERR(field_var)) {
+ save_field_var(hist_data, field_var); + save_field_var(hist_data, field_var);
+ hist_field = field_var->var; + hist_field = field_var->var;
+ } else { + } else {
+ field_var = NULL;
+ /*
+ * If no explicit system.event is specfied, default to
+ * looking for fields on the onmatch(system.event.xxx)
+ * event.
+ */
+ if (!system) { + if (!system) {
+ system = data->onmatch.match_event_system; + system = data->onmatch.match_event_system;
+ event = data->onmatch.match_event; + event = data->onmatch.match_event;
+ } + }
+ +
+ /*
+ * At this point, we're looking at a field on another
+ * event. Because we can't modify a hist trigger on
+ * another event to add a variable for a field, we need
+ * to create a new trigger on that event and create the
+ * variable at the same time.
+ */
+ hist_field = create_field_var_hist(hist_data, system, event, var); + hist_field = create_field_var_hist(hist_data, system, event, var);
+ if (IS_ERR(hist_field)) + if (IS_ERR(hist_field))
+ goto free; + goto free;
@ -360,7 +446,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ } + }
+ +
+ if (check_synth_field(event, hist_field, field_pos) == 0) { + if (check_synth_field(event, hist_field, field_pos) == 0) {
+ var_ref = create_var_ref(hist_field); + var_ref = create_var_ref(hist_field, system, event_name);
+ if (!var_ref) { + if (!var_ref) {
+ kfree(p); + kfree(p);
+ ret = -ENOMEM; + ret = -ENOMEM;
@ -386,7 +472,6 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ data->fn = action_trace; + data->fn = action_trace;
+ data->onmatch.synth_event = event; + data->onmatch.synth_event = event;
+ data->onmatch.var_ref_idx = var_ref_idx; + data->onmatch.var_ref_idx = var_ref_idx;
+ hist_data->actions[hist_data->n_actions++] = data;
+ event->ref++; + event->ref++;
+ out: + out:
+ return ret; + return ret;
@ -458,7 +543,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static int create_hitcount_val(struct hist_trigger_data *hist_data) static int create_hitcount_val(struct hist_trigger_data *hist_data)
{ {
hist_data->fields[HITCOUNT_IDX] = hist_data->fields[HITCOUNT_IDX] =
@@ -3226,24 +3553,76 @@ static void destroy_actions(struct hist_ @@ -3404,18 +3787,39 @@ static void destroy_actions(struct hist_
for (i = 0; i < hist_data->n_actions; i++) { for (i = 0; i < hist_data->n_actions; i++) {
struct action_data *data = hist_data->actions[i]; struct action_data *data = hist_data->actions[i];
@ -470,8 +555,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} }
} }
static int create_actions(struct hist_trigger_data *hist_data, static int parse_actions(struct hist_trigger_data *hist_data)
struct trace_event_file *file)
{ {
+ struct trace_array *tr = hist_data->event_file->tr; + struct trace_array *tr = hist_data->event_file->tr;
+ struct action_data *data; + struct action_data *data;
@ -486,14 +570,29 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ char *action_str = str + strlen("onmatch("); + char *action_str = str + strlen("onmatch(");
+ +
+ data = onmatch_parse(tr, action_str); + data = onmatch_parse(tr, action_str);
+ if (IS_ERR(data)) + if (IS_ERR(data)) {
+ return PTR_ERR(data); + ret = PTR_ERR(data);
+ + break;
+ ret = onmatch_create(hist_data, file, data);
+ if (ret) {
+ onmatch_destroy(data);
+ return ret;
+ } + }
+ data->fn = action_trace;
+ } else {
+ ret = -EINVAL;
+ break;
+ }
+
+ hist_data->actions[hist_data->n_actions++] = data;
}
return ret;
@@ -3430,11 +3834,50 @@ static int create_actions(struct hist_tr
for (i = 0; i < hist_data->attrs->n_actions; i++) {
data = hist_data->actions[i];
+
+ if (data->fn == action_trace) {
+ ret = onmatch_create(hist_data, file, data);
+ if (ret)
+ return ret;
+ } + }
} }
@ -536,7 +635,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static void destroy_field_var_hists(struct hist_trigger_data *hist_data) static void destroy_field_var_hists(struct hist_trigger_data *hist_data)
{ {
unsigned int i; unsigned int i;
@@ -3266,6 +3645,7 @@ static void destroy_hist_data(struct his @@ -3457,6 +3900,7 @@ static void destroy_hist_data(struct his
destroy_actions(hist_data); destroy_actions(hist_data);
destroy_field_vars(hist_data); destroy_field_vars(hist_data);
destroy_field_var_hists(hist_data); destroy_field_var_hists(hist_data);
@ -544,7 +643,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
kfree(hist_data); kfree(hist_data);
} }
@@ -3814,6 +4194,8 @@ static int event_hist_trigger_print(stru @@ -4015,6 +4459,8 @@ static int event_hist_trigger_print(stru
} }
seq_printf(m, ":size=%u", (1 << hist_data->map->map_bits)); seq_printf(m, ":size=%u", (1 << hist_data->map->map_bits));

View File

@ -2,7 +2,7 @@ From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:05 +0200 Date: Sun, 22 Oct 2017 23:40:05 +0200
Subject: [PATCH 27/36] hrtimer: Prepare handling of hard and softirq based Subject: [PATCH 27/36] hrtimer: Prepare handling of hard and softirq based
hrtimers hrtimers
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The softirq based hrtimer can utilize most of the existing hrtimers The softirq based hrtimer can utilize most of the existing hrtimers
functions, but need to operate on a different data set. functions, but need to operate on a different data set.
@ -12,6 +12,7 @@ can be selected. Fixup the existing callers and hand in the ACTIVE_HARD
mask. mask.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 38 +++++++++++++++++++++++++++++--------- kernel/time/hrtimer.c | 38 +++++++++++++++++++++++++++++---------

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:04 -0500 Date: Fri, 17 Nov 2017 14:33:06 -0600
Subject: [PATCH 33/42] tracing: Add 'onmax' hist trigger action support Subject: [PATCH 27/37] tracing: Add 'onmax' hist trigger action support
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Add an 'onmax(var).save(field,...)' hist trigger action which is Add an 'onmax(var).save(field,...)' hist trigger action which is
invoked whenever an event exceeds the current maximum. invoked whenever an event exceeds the current maximum.
@ -55,8 +55,8 @@ fields:
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace_events_hist.c | 332 ++++++++++++++++++++++++++++++++++----- kernel/trace/trace_events_hist.c | 331 ++++++++++++++++++++++++++++++++++-----
1 file changed, 297 insertions(+), 35 deletions(-) 1 file changed, 296 insertions(+), 35 deletions(-)
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@ -86,7 +86,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
}; };
}; };
@@ -1604,7 +1616,8 @@ static int parse_action(char *str, struc @@ -1717,7 +1729,8 @@ static int parse_action(char *str, struc
if (attrs->n_actions >= HIST_ACTIONS_MAX) if (attrs->n_actions >= HIST_ACTIONS_MAX)
return ret; return ret;
@ -96,7 +96,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
attrs->action_str[attrs->n_actions] = kstrdup(str, GFP_KERNEL); attrs->action_str[attrs->n_actions] = kstrdup(str, GFP_KERNEL);
if (!attrs->action_str[attrs->n_actions]) { if (!attrs->action_str[attrs->n_actions]) {
ret = -ENOMEM; ret = -ENOMEM;
@@ -1776,7 +1789,7 @@ static int hist_trigger_elt_data_alloc(s @@ -1889,7 +1902,7 @@ static int hist_trigger_elt_data_alloc(s
} }
} }
@ -105,7 +105,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
size = STR_VAR_LEN_MAX; size = STR_VAR_LEN_MAX;
@@ -2690,6 +2703,15 @@ static void update_field_vars(struct his @@ -2893,6 +2906,15 @@ static void update_field_vars(struct his
hist_data->n_field_vars, 0); hist_data->n_field_vars, 0);
} }
@ -121,8 +121,8 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static struct hist_field *create_var(struct hist_trigger_data *hist_data, static struct hist_field *create_var(struct hist_trigger_data *hist_data,
struct trace_event_file *file, struct trace_event_file *file,
char *name, int size, const char *type) char *name, int size, const char *type)
@@ -2799,6 +2821,229 @@ create_target_field_var(struct hist_trig @@ -3022,6 +3044,227 @@ create_target_field_var(struct hist_trig
return create_field_var(hist_data, file, var_name); return create_field_var(target_hist_data, file, var_name);
} }
+static void onmax_print(struct seq_file *m, +static void onmax_print(struct seq_file *m,
@ -217,7 +217,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ if (!ref_field) + if (!ref_field)
+ return -ENOMEM; + return -ENOMEM;
+ +
+ if (init_var_ref(ref_field, var_field)) { + if (init_var_ref(ref_field, var_field, NULL, NULL)) {
+ destroy_hist_field(ref_field, 0); + destroy_hist_field(ref_field, 0);
+ ret = -ENOMEM; + ret = -ENOMEM;
+ goto out; + goto out;
@ -255,8 +255,6 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ kfree(param); + kfree(param);
+ } + }
+
+ hist_data->actions[hist_data->n_actions++] = data;
+ out: + out:
+ return ret; + return ret;
+} +}
@ -351,7 +349,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static void onmatch_destroy(struct action_data *data) static void onmatch_destroy(struct action_data *data)
{ {
unsigned int i; unsigned int i;
@@ -2883,39 +3128,6 @@ static int check_synth_field(struct synt @@ -3106,39 +3349,6 @@ static int check_synth_field(struct synt
return 0; return 0;
} }
@ -391,7 +389,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static struct hist_field * static struct hist_field *
onmatch_find_var(struct hist_trigger_data *hist_data, struct action_data *data, onmatch_find_var(struct hist_trigger_data *hist_data, struct action_data *data,
char *system, char *event, char *var) char *system, char *event, char *var)
@@ -3555,6 +3767,8 @@ static void destroy_actions(struct hist_ @@ -3789,6 +3999,8 @@ static void destroy_actions(struct hist_
if (data->fn == action_trace) if (data->fn == action_trace)
onmatch_destroy(data); onmatch_destroy(data);
@ -400,22 +398,30 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
else else
kfree(data); kfree(data);
} }
@@ -3584,12 +3798,56 @@ static int create_actions(struct hist_tr @@ -3814,6 +4026,15 @@ static int parse_actions(struct hist_tri
onmatch_destroy(data); break;
return ret;
} }
data->fn = action_trace;
+ } else if (strncmp(str, "onmax(", strlen("onmax(")) == 0) { + } else if (strncmp(str, "onmax(", strlen("onmax(")) == 0) {
+ char *action_str = str + strlen("onmax("); + char *action_str = str + strlen("onmax(");
+ +
+ data = onmax_parse(action_str); + data = onmax_parse(action_str);
+ if (IS_ERR(data)) + if (IS_ERR(data)) {
+ return PTR_ERR(data); + ret = PTR_ERR(data);
+ + break;
+ ret = onmax_create(hist_data, data);
+ if (ret) {
+ onmax_destroy(data);
+ return ret;
+ } + }
+ data->fn = onmax_save;
} else {
ret = -EINVAL;
break;
@@ -3839,12 +4060,48 @@ static int create_actions(struct hist_tr
ret = onmatch_create(hist_data, file, data);
if (ret)
return ret;
+ } else if (data->fn == onmax_save) {
+ ret = onmax_create(hist_data, data);
+ if (ret)
+ return ret;
} }
} }
@ -457,7 +463,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static void print_onmatch_spec(struct seq_file *m, static void print_onmatch_spec(struct seq_file *m,
struct hist_trigger_data *hist_data, struct hist_trigger_data *hist_data,
struct action_data *data) struct action_data *data)
@@ -3620,6 +3878,8 @@ static void print_actions_spec(struct se @@ -3875,6 +4132,8 @@ static void print_actions_spec(struct se
if (data->fn == action_trace) if (data->fn == action_trace)
print_onmatch_spec(m, hist_data, data); print_onmatch_spec(m, hist_data, data);
@ -466,7 +472,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} }
} }
@@ -3994,6 +4254,8 @@ hist_trigger_entry_print(struct seq_file @@ -4256,6 +4515,8 @@ hist_trigger_entry_print(struct seq_file
} }
} }

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:06 +0200 Date: Sun, 22 Oct 2017 23:40:06 +0200
Subject: [PATCH 28/36] hrtimer: Implement support for softirq based hrtimers Subject: [PATCH 28/36] hrtimer: Implement support for softirq based hrtimers
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
hrtimer callbacks are always invoked in hard interrupt context. Several hrtimer callbacks are always invoked in hard interrupt context. Several
users in tree require soft interrupt context for their callbacks and users in tree require soft interrupt context for their callbacks and
@ -32,15 +32,24 @@ processing the regular processing is resumed.
Suggested-by: Thomas Gleixner <tglx@linutronix.de> Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Suggested-by: Peter Zijlstra <peterz@infradead.org> Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/linux/hrtimer.h | 20 +++- include/linux/hrtimer.h | 21 +++--
kernel/time/hrtimer.c | 201 ++++++++++++++++++++++++++++++++++++++++-------- kernel/time/hrtimer.c | 201 ++++++++++++++++++++++++++++++++++++++++--------
2 files changed, 185 insertions(+), 36 deletions(-) 2 files changed, 186 insertions(+), 36 deletions(-)
--- a/include/linux/hrtimer.h --- a/include/linux/hrtimer.h
+++ b/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h
@@ -113,6 +113,7 @@ struct hrtimer { @@ -103,6 +103,7 @@ enum hrtimer_restart {
* @base: pointer to the timer base (per cpu and per clock)
* @state: state information (See bit values above)
* @is_rel: Set if the timer was armed relative
+ * @is_soft: Set if hrtimer will be expired in soft interrupt context.
*
* The hrtimer structure must be initialized by hrtimer_init()
*/
@@ -113,6 +114,7 @@ struct hrtimer {
struct hrtimer_clock_base *base; struct hrtimer_clock_base *base;
u8 state; u8 state;
u8 is_rel; u8 is_rel;
@ -48,7 +57,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
}; };
/** /**
@@ -178,13 +179,18 @@ enum hrtimer_base_type { @@ -178,13 +180,18 @@ enum hrtimer_base_type {
* @hres_active: State of high resolution mode * @hres_active: State of high resolution mode
* @in_hrtirq: hrtimer_interrupt() is currently executing * @in_hrtirq: hrtimer_interrupt() is currently executing
* @hang_detected: The last hrtimer interrupt detected a hang * @hang_detected: The last hrtimer interrupt detected a hang
@ -68,7 +77,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
* @clock_base: array of clock bases for this cpu * @clock_base: array of clock bases for this cpu
* *
* Note: next_timer is just an optimization for __remove_hrtimer(). * Note: next_timer is just an optimization for __remove_hrtimer().
@@ -196,9 +202,10 @@ struct hrtimer_cpu_base { @@ -196,9 +203,10 @@ struct hrtimer_cpu_base {
unsigned int cpu; unsigned int cpu;
unsigned int active_bases; unsigned int active_bases;
unsigned int clock_was_set_seq; unsigned int clock_was_set_seq;
@ -82,7 +91,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
#ifdef CONFIG_HIGH_RES_TIMERS #ifdef CONFIG_HIGH_RES_TIMERS
unsigned int nr_events; unsigned int nr_events;
unsigned short nr_retries; unsigned short nr_retries;
@@ -207,6 +214,8 @@ struct hrtimer_cpu_base { @@ -207,6 +215,8 @@ struct hrtimer_cpu_base {
#endif #endif
ktime_t expires_next; ktime_t expires_next;
struct hrtimer *next_timer; struct hrtimer *next_timer;
@ -91,7 +100,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES]; struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES];
} ____cacheline_aligned; } ____cacheline_aligned;
@@ -379,7 +388,8 @@ extern void hrtimer_start_range_ns(struc @@ -379,7 +389,8 @@ extern void hrtimer_start_range_ns(struc
* @timer: the timer to be added * @timer: the timer to be added
* @tim: expiry time * @tim: expiry time
* @mode: timer mode: absolute (HRTIMER_MODE_ABS) or * @mode: timer mode: absolute (HRTIMER_MODE_ABS) or
@ -158,14 +167,14 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
trace_hrtimer_start(timer, mode); trace_hrtimer_start(timer, mode);
} }
@@ -470,7 +486,6 @@ static inline void debug_deactivate(stru @@ -487,7 +503,6 @@ static struct hrtimer_clock_base *
trace_hrtimer_cancel(timer); #define for_each_active_base(base, cpu_base, active) \
} while ((base = __next_base((cpu_base), &(active))))
-#if defined(CONFIG_NO_HZ_COMMON) || defined(CONFIG_HIGH_RES_TIMERS) -#if defined(CONFIG_NO_HZ_COMMON) || defined(CONFIG_HIGH_RES_TIMERS)
static struct hrtimer_clock_base * static ktime_t __hrtimer_next_event_base(struct hrtimer_cpu_base *cpu_base,
__next_base(struct hrtimer_cpu_base *cpu_base, unsigned int *active) unsigned int active,
{ ktime_t expires_next)
@@ -504,7 +519,10 @@ static ktime_t __hrtimer_next_event_base @@ -504,7 +519,10 @@ static ktime_t __hrtimer_next_event_base
expires = ktime_sub(hrtimer_get_expires(timer), base->offset); expires = ktime_sub(hrtimer_get_expires(timer), base->offset);
if (expires < expires_next) { if (expires < expires_next) {

View File

@ -1,8 +1,8 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:05 -0500 Date: Fri, 17 Nov 2017 14:33:07 -0600
Subject: [PATCH 34/42] tracing: Allow whitespace to surround hist trigger Subject: [PATCH 28/37] tracing: Allow whitespace to surround hist trigger
filter filter
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The existing code only allows for one space before and after the 'if' The existing code only allows for one space before and after the 'if'
specifying the filter for a hist trigger. Add code to make that more specifying the filter for a hist trigger. Add code to make that more
@ -14,12 +14,12 @@ in param lists.
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace_events_hist.c | 24 +++++++++++++++++++----- kernel/trace/trace_events_hist.c | 37 ++++++++++++++++++++++++++++++++-----
1 file changed, 19 insertions(+), 5 deletions(-) 1 file changed, 32 insertions(+), 5 deletions(-)
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@@ -4857,7 +4857,7 @@ static int event_hist_trigger_func(struc @@ -5157,7 +5157,7 @@ static int event_hist_trigger_func(struc
struct synth_event *se; struct synth_event *se;
const char *se_name; const char *se_name;
bool remove = false; bool remove = false;
@ -28,7 +28,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
int ret = 0; int ret = 0;
if (!param) if (!param)
@@ -4866,10 +4866,23 @@ static int event_hist_trigger_func(struc @@ -5166,10 +5166,37 @@ static int event_hist_trigger_func(struc
if (glob[0] == '!') if (glob[0] == '!')
remove = true; remove = true;
@ -40,27 +40,33 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ * separate the trigger from the filter (k:v [if filter]) + * separate the trigger from the filter (k:v [if filter])
+ * allowing for whitespace in the trigger + * allowing for whitespace in the trigger
+ */ + */
+ trigger = param; + p = trigger = param;
+ p = strstr(param, " if"); + do {
+ if (!p) + p = strstr(p, "if");
+ p = strstr(param, "\tif"); + if (!p)
+ if (p) { + break;
+ if (p == trigger) + if (p == param)
+ return -EINVAL; + return -EINVAL;
+ param = p + 1; + if (*(p - 1) != ' ' && *(p - 1) != '\t') {
+ param = strstrip(param); + p++;
+ *p = '\0'; + continue;
+ trigger = strstrip(trigger); + }
+ } else + if (p >= param + strlen(param) - strlen("if") - 1)
+ return -EINVAL;
+ if (*(p + strlen("if")) != ' ' && *(p + strlen("if")) != '\t') {
+ p++;
+ continue;
+ }
+ break;
+ } while (p);
+
+ if (!p)
+ param = NULL; + param = NULL;
+ else {
+ *(p - 1) = '\0';
+ param = strstrip(p);
+ trigger = strstrip(trigger);
+ }
attrs = parse_hist_trigger_attrs(trigger); attrs = parse_hist_trigger_attrs(trigger);
if (IS_ERR(attrs)) if (IS_ERR(attrs))
@@ -4927,6 +4940,7 @@ static int event_hist_trigger_func(struc
}
ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file);
+
/*
* The above returns on success the # of triggers registered,
* but if it didn't register any it returns zero. Consider no

View File

@ -1,7 +1,7 @@
From: Anna-Maria Gleixner <anna-maria@linutronix.de> From: Anna-Maria Gleixner <anna-maria@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:07 +0200 Date: Sun, 22 Oct 2017 23:40:07 +0200
Subject: [PATCH 29/36] hrtimer: Implement SOFT/HARD clock base selection Subject: [PATCH 29/36] hrtimer: Implement SOFT/HARD clock base selection
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
All prerequisites to handle hrtimers for expiry in either hard or soft All prerequisites to handle hrtimers for expiry in either hard or soft
interrupt context are in place. interrupt context are in place.
@ -10,6 +10,7 @@ Add the missing bit in hrtimer_init() which associates the timer to the
hard or the soft irq clock base. hard or the soft irq clock base.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/time/hrtimer.c | 15 +++++++++++---- kernel/time/hrtimer.c | 15 +++++++++++----

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:06 -0500 Date: Fri, 17 Nov 2017 14:33:08 -0600
Subject: [PATCH 35/42] tracing: Add cpu field for hist triggers Subject: [PATCH 29/37] tracing: Add cpu field for hist triggers
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
A common key to use in a histogram is the cpuid - add a new cpu A common key to use in a histogram is the cpuid - add a new cpu
'synthetic' field for that purpose. This field is named cpu rather 'synthetic' field for that purpose. This field is named cpu rather
@ -12,13 +12,13 @@ another name for the same thing.
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
Documentation/trace/events.txt | 18 ++++++++++++++++++ Documentation/trace/histogram.txt | 17 +++++++++++++++++
kernel/trace/trace_events_hist.c | 28 +++++++++++++++++++++++++++- kernel/trace/trace_events_hist.c | 28 +++++++++++++++++++++++++++-
2 files changed, 45 insertions(+), 1 deletion(-) 2 files changed, 44 insertions(+), 1 deletion(-)
--- a/Documentation/trace/events.txt --- a/Documentation/trace/histogram.txt
+++ b/Documentation/trace/events.txt +++ b/Documentation/trace/histogram.txt
@@ -668,6 +668,24 @@ triggers (you have to use '!' for each o @@ -172,6 +172,23 @@
The examples below provide a more concrete illustration of the The examples below provide a more concrete illustration of the
concepts and typical usage patterns discussed above. concepts and typical usage patterns discussed above.
@ -39,21 +39,20 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ modified by .usecs to have timestamps + modified by .usecs to have timestamps
+ interpreted as microseconds. + interpreted as microseconds.
+ cpu int - the cpu on which the event occurred. + cpu int - the cpu on which the event occurred.
+
6.2 'hist' trigger examples 6.2 'hist' trigger examples
--------------------------- ---------------------------
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@@ -226,6 +226,7 @@ enum hist_field_flags { @@ -227,6 +227,7 @@ enum hist_field_flags {
HIST_FIELD_FL_VAR_ONLY = 1 << 13, HIST_FIELD_FL_VAR = 1 << 12,
HIST_FIELD_FL_EXPR = 1 << 14, HIST_FIELD_FL_EXPR = 1 << 13,
HIST_FIELD_FL_VAR_REF = 1 << 15, HIST_FIELD_FL_VAR_REF = 1 << 14,
+ HIST_FIELD_FL_CPU = 1 << 16, + HIST_FIELD_FL_CPU = 1 << 15,
}; };
struct var_defs { struct var_defs {
@@ -1172,6 +1173,16 @@ static u64 hist_field_timestamp(struct h @@ -1177,6 +1178,16 @@ static u64 hist_field_timestamp(struct h
return ts; return ts;
} }
@ -67,19 +66,19 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ return cpu; + return cpu;
+} +}
+ +
static struct hist_field *check_var_ref(struct hist_field *hist_field, static struct hist_field *
struct hist_trigger_data *var_data, check_field_for_var_ref(struct hist_field *hist_field,
unsigned int var_idx) struct hist_trigger_data *var_data,
@@ -1520,6 +1531,8 @@ static const char *hist_field_name(struc @@ -1622,6 +1633,8 @@ static const char *hist_field_name(struc
field_name = hist_field_name(field->operands[0], ++level); field_name = hist_field_name(field->operands[0], ++level);
else if (field->flags & HIST_FIELD_FL_TIMESTAMP) else if (field->flags & HIST_FIELD_FL_TIMESTAMP)
field_name = "$common_timestamp"; field_name = "$common_timestamp";
+ else if (field->flags & HIST_FIELD_FL_CPU) + else if (field->flags & HIST_FIELD_FL_CPU)
+ field_name = "cpu"; + field_name = "cpu";
else if (field->flags & HIST_FIELD_FL_EXPR || else if (field->flags & HIST_FIELD_FL_EXPR ||
field->flags & HIST_FIELD_FL_VAR_REF) field->flags & HIST_FIELD_FL_VAR_REF) {
field_name = field->name; if (field->system) {
@@ -2012,6 +2025,15 @@ static struct hist_field *create_hist_fi @@ -2125,6 +2138,15 @@ static struct hist_field *create_hist_fi
goto out; goto out;
} }
@ -95,7 +94,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (WARN_ON_ONCE(!field)) if (WARN_ON_ONCE(!field))
goto out; goto out;
@@ -2204,7 +2226,9 @@ parse_field(struct hist_trigger_data *hi @@ -2343,7 +2365,9 @@ parse_field(struct hist_trigger_data *hi
hist_data->enable_timestamps = true; hist_data->enable_timestamps = true;
if (*flags & HIST_FIELD_FL_TIMESTAMP_USECS) if (*flags & HIST_FIELD_FL_TIMESTAMP_USECS)
hist_data->attrs->ts_in_usecs = true; hist_data->attrs->ts_in_usecs = true;
@ -106,12 +105,12 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
field = trace_find_event_field(file->event_call, field_name); field = trace_find_event_field(file->event_call, field_name);
if (!field || !field->size) { if (!field || !field->size) {
field = ERR_PTR(-EINVAL); field = ERR_PTR(-EINVAL);
@@ -4353,6 +4377,8 @@ static void hist_field_print(struct seq_ @@ -4614,6 +4638,8 @@ static void hist_field_print(struct seq_
if (hist_field->flags & HIST_FIELD_FL_TIMESTAMP) if (hist_field->flags & HIST_FIELD_FL_TIMESTAMP)
seq_puts(m, "$common_timestamp"); seq_puts(m, "$common_timestamp");
+ else if (hist_field->flags & HIST_FIELD_FL_CPU) + else if (hist_field->flags & HIST_FIELD_FL_CPU)
+ seq_puts(m, "cpu"); + seq_puts(m, "cpu");
else if (field_name) else if (field_name) {
seq_printf(m, "%s", field_name); if (hist_field->flags & HIST_FIELD_FL_VAR_REF)
seq_putc(m, '$');

View File

@ -1,14 +1,15 @@
From: Thomas Gleixner <tglx@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:08 +0200 Date: Thu, 23 Nov 2017 16:39:11 +0100
Subject: [PATCH 30/36] can/bcm: Replace hrtimer_tasklet with softirq based Subject: [PATCH 30/36] can/bcm: Replace hrtimer_tasklet with softirq based
hrtimer hrtimer
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Switch the timer to HRTIMER_MODE_SOFT, which executed the timer Switch the timer to HRTIMER_MODE_SOFT, which executed the timer
callback in softirq context and remove the hrtimer_tasklet. callback in softirq context and remove the hrtimer_tasklet.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Oliver Hartkopp <socketcan@hartkopp.net> Cc: Oliver Hartkopp <socketcan@hartkopp.net>
Cc: Marc Kleine-Budde <mkl@pengutronix.de> Cc: Marc Kleine-Budde <mkl@pengutronix.de>
Cc: linux-can@vger.kernel.org Cc: linux-can@vger.kernel.org

View File

@ -1,11 +1,11 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:07 -0500 Date: Fri, 17 Nov 2017 14:33:09 -0600
Subject: [PATCH 36/42] tracing: Add hist trigger support for variable Subject: [PATCH 30/37] tracing: Add hist trigger support for variable
reference aliases reference aliases
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Add support for alias=$somevar where alias can be used as Add support for alias=$somevar where alias can be used as
onmatch($alias). onmatch.xxx($alias).
Aliases are a way of creating a new name for an existing variable, for Aliases are a way of creating a new name for an existing variable, for
flexibly in making naming more clear in certain cases. For example in flexibly in making naming more clear in certain cases. For example in
@ -24,20 +24,20 @@ uses that in the call instead:
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
kernel/trace/trace_events_hist.c | 61 +++++++++++++++++++++++++++++++++++++-- kernel/trace/trace_events_hist.c | 58 ++++++++++++++++++++++++++++++++++++---
1 file changed, 58 insertions(+), 3 deletions(-) 1 file changed, 55 insertions(+), 3 deletions(-)
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@@ -227,6 +227,7 @@ enum hist_field_flags { @@ -228,6 +228,7 @@ enum hist_field_flags {
HIST_FIELD_FL_EXPR = 1 << 14, HIST_FIELD_FL_EXPR = 1 << 13,
HIST_FIELD_FL_VAR_REF = 1 << 15, HIST_FIELD_FL_VAR_REF = 1 << 14,
HIST_FIELD_FL_CPU = 1 << 16, HIST_FIELD_FL_CPU = 1 << 15,
+ HIST_FIELD_FL_ALIAS = 1 << 17, + HIST_FIELD_FL_ALIAS = 1 << 16,
}; };
struct var_defs { struct var_defs {
@@ -1527,7 +1528,8 @@ static const char *hist_field_name(struc @@ -1629,7 +1630,8 @@ static const char *hist_field_name(struc
if (field->field) if (field->field)
field_name = field->field->name; field_name = field->field->name;
@ -47,7 +47,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
field_name = hist_field_name(field->operands[0], ++level); field_name = hist_field_name(field->operands[0], ++level);
else if (field->flags & HIST_FIELD_FL_TIMESTAMP) else if (field->flags & HIST_FIELD_FL_TIMESTAMP)
field_name = "$common_timestamp"; field_name = "$common_timestamp";
@@ -1983,7 +1985,7 @@ static struct hist_field *create_hist_fi @@ -2096,7 +2098,7 @@ static struct hist_field *create_hist_fi
hist_field->hist_data = hist_data; hist_field->hist_data = hist_data;
@ -56,7 +56,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
goto out; /* caller will populate */ goto out; /* caller will populate */
if (flags & HIST_FIELD_FL_VAR_REF) { if (flags & HIST_FIELD_FL_VAR_REF) {
@@ -2241,6 +2243,29 @@ parse_field(struct hist_trigger_data *hi @@ -2380,6 +2382,28 @@ parse_field(struct hist_trigger_data *hi
return field; return field;
} }
@ -65,8 +65,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ char *var_name) + char *var_name)
+{ +{
+ struct hist_field *alias = NULL; + struct hist_field *alias = NULL;
+ unsigned long flags = HIST_FIELD_FL_ALIAS | HIST_FIELD_FL_VAR | + unsigned long flags = HIST_FIELD_FL_ALIAS | HIST_FIELD_FL_VAR;
+ HIST_FIELD_FL_VAR_ONLY;
+ +
+ alias = create_hist_field(hist_data, NULL, flags, var_name); + alias = create_hist_field(hist_data, NULL, flags, var_name);
+ if (!alias) + if (!alias)
@ -75,7 +74,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ alias->fn = var_ref->fn; + alias->fn = var_ref->fn;
+ alias->operands[0] = var_ref; + alias->operands[0] = var_ref;
+ +
+ if (init_var_ref(alias, var_ref)) { + if (init_var_ref(alias, var_ref, var_ref->system, var_ref->event_name)) {
+ destroy_hist_field(alias, 0); + destroy_hist_field(alias, 0);
+ return NULL; + return NULL;
+ } + }
@ -86,7 +85,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
struct hist_field *parse_atom(struct hist_trigger_data *hist_data, struct hist_field *parse_atom(struct hist_trigger_data *hist_data,
struct trace_event_file *file, char *str, struct trace_event_file *file, char *str,
unsigned long *flags, char *var_name) unsigned long *flags, char *var_name)
@@ -2275,6 +2300,13 @@ struct hist_field *parse_atom(struct his @@ -2413,6 +2437,13 @@ struct hist_field *parse_atom(struct his
if (hist_field) { if (hist_field) {
hist_data->var_refs[hist_data->n_var_refs] = hist_field; hist_data->var_refs[hist_data->n_var_refs] = hist_field;
hist_field->var_ref_idx = hist_data->n_var_refs++; hist_field->var_ref_idx = hist_data->n_var_refs++;
@ -100,7 +99,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
return hist_field; return hist_field;
} }
} else } else
@@ -2378,6 +2410,26 @@ static int check_expr_operands(struct hi @@ -2517,6 +2548,26 @@ static int check_expr_operands(struct hi
unsigned long operand1_flags = operand1->flags; unsigned long operand1_flags = operand1->flags;
unsigned long operand2_flags = operand2->flags; unsigned long operand2_flags = operand2->flags;
@ -127,16 +126,13 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if ((operand1_flags & HIST_FIELD_FL_TIMESTAMP_USECS) != if ((operand1_flags & HIST_FIELD_FL_TIMESTAMP_USECS) !=
(operand2_flags & HIST_FIELD_FL_TIMESTAMP_USECS)) (operand2_flags & HIST_FIELD_FL_TIMESTAMP_USECS))
return -EINVAL; return -EINVAL;
@@ -4379,8 +4431,11 @@ static void hist_field_print(struct seq_ @@ -4641,7 +4692,8 @@ static void hist_field_print(struct seq_
seq_puts(m, "$common_timestamp");
else if (hist_field->flags & HIST_FIELD_FL_CPU) else if (hist_field->flags & HIST_FIELD_FL_CPU)
seq_puts(m, "cpu"); seq_puts(m, "cpu");
- else if (field_name) else if (field_name) {
+ else if (field_name) { - if (hist_field->flags & HIST_FIELD_FL_VAR_REF)
+ if (hist_field->flags & HIST_FIELD_FL_ALIAS) + if (hist_field->flags & HIST_FIELD_FL_VAR_REF ||
+ seq_putc(m, '$'); + hist_field->flags & HIST_FIELD_FL_ALIAS)
seq_putc(m, '$');
seq_printf(m, "%s", field_name); seq_printf(m, "%s", field_name);
+ } }
if (hist_field->flags) {
const char *flags_str = get_hist_field_flags(hist_field);

View File

@ -1,17 +1,17 @@
From: Thomas Gleixner <tglx@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:09 +0200 Date: Thu, 23 Nov 2017 16:39:12 +0100
Subject: [PATCH 31/36] mac80211_hwsim: Replace hrtimer tasklet with softirq Subject: [PATCH 31/36] mac80211_hwsim: Replace hrtimer tasklet with softirq
hrtimer hrtimer
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Switch the timer to HRTIMER_MODE_SOFT, which executed the timer Switch the timer to HRTIMER_MODE_SOFT, which executed the timer
callback in softirq context and remove the hrtimer_tasklet. callback in softirq context and remove the hrtimer_tasklet.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Cc: linux-wireless@vger.kernel.org
Cc: Johannes Berg <johannes@sipsolutions.net> Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: Kalle Valo <kvalo@codeaurora.org> Cc: Kalle Valo <kvalo@codeaurora.org>
Cc: linux-wireless@vger.kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
drivers/net/wireless/mac80211_hwsim.c | 44 +++++++++++++++------------------- drivers/net/wireless/mac80211_hwsim.c | 44 +++++++++++++++-------------------

View File

@ -1,8 +1,8 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:08 -0500 Date: Fri, 17 Nov 2017 14:33:10 -0600
Subject: [PATCH 37/42] tracing: Add 'last error' error facility for hist Subject: [PATCH 31/37] tracing: Add 'last error' error facility for hist
triggers triggers
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
With the addition of variables and actions, it's become necessary to With the addition of variables and actions, it's become necessary to
provide more detailed error information to users about syntax errors. provide more detailed error information to users about syntax errors.
@ -26,13 +26,13 @@ Also add specific error messages for variable and action errors.
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
Documentation/trace/events.txt | 19 ++++ Documentation/trace/histogram.txt | 20 ++++
kernel/trace/trace_events_hist.c | 162 +++++++++++++++++++++++++++++++++++---- kernel/trace/trace_events_hist.c | 167 +++++++++++++++++++++++++++++++++++---
2 files changed, 168 insertions(+), 13 deletions(-) 2 files changed, 174 insertions(+), 13 deletions(-)
--- a/Documentation/trace/events.txt --- a/Documentation/trace/histogram.txt
+++ b/Documentation/trace/events.txt +++ b/Documentation/trace/histogram.txt
@@ -686,6 +686,25 @@ triggers (you have to use '!' for each o @@ -190,6 +190,26 @@
interpreted as microseconds. interpreted as microseconds.
cpu int - the cpu on which the event occurred. cpu int - the cpu on which the event occurred.
@ -55,9 +55,10 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ # cat /sys/kernel/debug/tracing/events/sched/sched_wakeup/hist + # cat /sys/kernel/debug/tracing/events/sched/sched_wakeup/hist
+ ERROR: Couldn't yyy: zzz + ERROR: Couldn't yyy: zzz
+ Last command: xxx + Last command: xxx
+
6.2 'hist' trigger examples 6.2 'hist' trigger examples
--------------------------- ---------------------------
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@@ -351,6 +351,65 @@ struct action_data { @@ -351,6 +351,65 @@ struct action_data {
@ -126,7 +127,31 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
static LIST_HEAD(synth_event_list); static LIST_HEAD(synth_event_list);
static DEFINE_MUTEX(synth_event_mutex); static DEFINE_MUTEX(synth_event_mutex);
@@ -2132,9 +2191,18 @@ static struct hist_field *create_var_ref @@ -1458,6 +1517,7 @@ static struct trace_event_file *find_var
if (!system || !event_name) {
if (find_var(var_hist_data, file, var_name)) {
if (found) {
+ hist_err_event("Variable name not unique, need to use fully qualified name (subsys.event.var) for variable: ", system, event_name, var_name);
return NULL;
}
@@ -1518,6 +1578,7 @@ find_match_var(struct hist_trigger_data
hist_field = find_file_var(file, var_name);
if (hist_field) {
if (found) {
+ hist_err_event("Variable name not unique, need to use fully qualified name (subsys.event.var) for variable: ", system, event_name, var_name);
return ERR_PTR(-EINVAL);
}
@@ -1801,6 +1862,7 @@ static int parse_assignment(char *str, s
char *assignment;
if (attrs->n_assignments == TRACING_MAP_VARS_MAX) {
+ hist_err("Too many variables defined: ", str);
ret = -EINVAL;
goto out;
}
@@ -2271,9 +2333,18 @@ static struct hist_field *create_var_ref
return ref_field; return ref_field;
} }
@ -146,9 +171,9 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
return false; return false;
return true; return true;
@@ -2186,6 +2254,10 @@ static struct hist_field *parse_var_ref( @@ -2325,6 +2396,10 @@ static struct hist_field *parse_var_ref(
if (var_field) if (var_field)
ref_field = create_var_ref(var_field); ref_field = create_var_ref(var_field, system, event_name);
+ if (!ref_field) + if (!ref_field)
+ hist_err_event("Couldn't find variable: $", + hist_err_event("Couldn't find variable: $",
@ -157,7 +182,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
return ref_field; return ref_field;
} }
@@ -2431,8 +2503,10 @@ static int check_expr_operands(struct hi @@ -2569,8 +2644,10 @@ static int check_expr_operands(struct hi
} }
if ((operand1_flags & HIST_FIELD_FL_TIMESTAMP_USECS) != if ((operand1_flags & HIST_FIELD_FL_TIMESTAMP_USECS) !=
@ -169,55 +194,57 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
return 0; return 0;
} }
@@ -2632,19 +2706,27 @@ create_field_var_hist(struct hist_trigge @@ -2816,12 +2893,17 @@ create_field_var_hist(struct hist_trigge
char *cmd; char *cmd;
int ret; int ret;
- if (target_hist_data->n_field_var_hists >= SYNTH_FIELDS_MAX) - if (target_hist_data->n_field_var_hists >= SYNTH_FIELDS_MAX)
+ if (target_hist_data->n_field_var_hists >= SYNTH_FIELDS_MAX) { + if (target_hist_data->n_field_var_hists >= SYNTH_FIELDS_MAX) {
+ hist_err_event("onmatch: Too many field variables defined: ", + hist_err_event("onmatch: Too many field variables defined: ",
+ system, event_name, field_name); + subsys_name, event_name, field_name);
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
+ } + }
file = event_file(tr, system, event_name); file = event_file(tr, subsys_name, event_name);
if (IS_ERR(file)) { if (IS_ERR(file)) {
+ hist_err_event("onmatch: Event file not found: ", + hist_err_event("onmatch: Event file not found: ",
+ system, event_name, field_name); + subsys_name, event_name, field_name);
ret = PTR_ERR(file); ret = PTR_ERR(file);
return ERR_PTR(ret); return ERR_PTR(ret);
} }
@@ -2833,8 +2915,11 @@ create_field_var_hist(struct hist_trigge
* yet a registered histogram so we can't use that.
*/
hist_data = find_compatible_hist(target_hist_data, file); hist_data = find_compatible_hist(target_hist_data, file);
- if (!hist_data) - if (!hist_data)
+ if (!hist_data) { + if (!hist_data) {
+ hist_err_event("onmatch: Matching event histogram not found: ", + hist_err_event("onmatch: Matching event histogram not found: ",
+ system, event_name, field_name); + subsys_name, event_name, field_name);
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
+ } + }
var_hist = kzalloc(sizeof(*var_hist), GFP_KERNEL); /* See if a synthetic field variable has already been created */
if (!var_hist) event_var = find_synthetic_field_var(target_hist_data, subsys_name,
@@ -2692,6 +2774,8 @@ create_field_var_hist(struct hist_trigge @@ -2893,6 +2978,8 @@ create_field_var_hist(struct hist_trigge
kfree(cmd); kfree(cmd);
kfree(var_hist->cmd); kfree(var_hist->cmd);
kfree(var_hist); kfree(var_hist);
+ hist_err_event("onmatch: Couldn't create histogram for field: ", + hist_err_event("onmatch: Couldn't create histogram for field: ",
+ system, event_name, field_name); + subsys_name, event_name, field_name);
return ERR_PTR(ret); return ERR_PTR(ret);
} }
@@ -2703,6 +2787,8 @@ create_field_var_hist(struct hist_trigge @@ -2905,6 +2992,8 @@ create_field_var_hist(struct hist_trigge
kfree(cmd); kfree(cmd);
kfree(var_hist->cmd); kfree(var_hist->cmd);
kfree(var_hist); kfree(var_hist);
+ hist_err_event("onmatch: Couldn't find synthetic variable: ", + hist_err_event("onmatch: Couldn't find synthetic variable: ",
+ system, event_name, field_name); + subsys_name, event_name, field_name);
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
@@ -2839,18 +2925,21 @@ static struct field_var *create_field_va @@ -3041,18 +3130,21 @@ static struct field_var *create_field_va
int ret = 0; int ret = 0;
if (hist_data->n_field_vars >= SYNTH_FIELDS_MAX) { if (hist_data->n_field_vars >= SYNTH_FIELDS_MAX) {
@ -239,7 +266,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
kfree(val); kfree(val);
ret = PTR_ERR(var); ret = PTR_ERR(var);
goto err; goto err;
@@ -2975,14 +3064,18 @@ static int onmax_create(struct hist_trig @@ -3197,14 +3289,18 @@ static int onmax_create(struct hist_trig
int ret = 0; int ret = 0;
onmax_var_str = data->onmax.var_str; onmax_var_str = data->onmax.var_str;
@ -260,7 +287,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
flags = HIST_FIELD_FL_VAR_REF; flags = HIST_FIELD_FL_VAR_REF;
ref_field = create_hist_field(hist_data, NULL, flags, NULL); ref_field = create_hist_field(hist_data, NULL, flags, NULL);
@@ -3002,6 +3095,7 @@ static int onmax_create(struct hist_trig @@ -3224,6 +3320,7 @@ static int onmax_create(struct hist_trig
data->onmax.max_var_ref_idx = var_ref_idx; data->onmax.max_var_ref_idx = var_ref_idx;
max_var = create_var(hist_data, file, "max", sizeof(u64), "u64"); max_var = create_var(hist_data, file, "max", sizeof(u64), "u64");
if (IS_ERR(max_var)) { if (IS_ERR(max_var)) {
@ -268,7 +295,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
ret = PTR_ERR(max_var); ret = PTR_ERR(max_var);
goto out; goto out;
} }
@@ -3016,6 +3110,7 @@ static int onmax_create(struct hist_trig @@ -3238,6 +3335,7 @@ static int onmax_create(struct hist_trig
field_var = create_target_field_var(hist_data, NULL, NULL, param); field_var = create_target_field_var(hist_data, NULL, NULL, param);
if (IS_ERR(field_var)) { if (IS_ERR(field_var)) {
@ -276,7 +303,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
ret = PTR_ERR(field_var); ret = PTR_ERR(field_var);
kfree(param); kfree(param);
goto out; goto out;
@@ -3050,6 +3145,7 @@ static int parse_action_params(char *par @@ -3270,6 +3368,7 @@ static int parse_action_params(char *par
param = strstrip(param); param = strstrip(param);
if (strlen(param) < 2) { if (strlen(param) < 2) {
@ -284,8 +311,8 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }
@@ -3223,6 +3319,9 @@ onmatch_find_var(struct hist_trigger_dat @@ -3442,6 +3541,9 @@ onmatch_find_var(struct hist_trigger_dat
hist_field = find_event_var(tr, system, event, var); hist_field = find_event_var(hist_data, system, event, var);
} }
+ if (!hist_field) + if (!hist_field)
@ -294,7 +321,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
return hist_field; return hist_field;
} }
@@ -3273,6 +3372,7 @@ static int onmatch_create(struct hist_tr @@ -3509,6 +3611,7 @@ static int onmatch_create(struct hist_tr
mutex_lock(&synth_event_mutex); mutex_lock(&synth_event_mutex);
event = find_synth_event(data->onmatch.synth_event_name); event = find_synth_event(data->onmatch.synth_event_name);
if (!event) { if (!event) {
@ -302,7 +329,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
mutex_unlock(&synth_event_mutex); mutex_unlock(&synth_event_mutex);
return -EINVAL; return -EINVAL;
} }
@@ -3331,12 +3431,15 @@ static int onmatch_create(struct hist_tr @@ -3567,12 +3670,15 @@ static int onmatch_create(struct hist_tr
continue; continue;
} }
@ -318,7 +345,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }
@@ -3362,15 +3465,22 @@ static struct action_data *onmatch_parse @@ -3597,15 +3703,22 @@ static struct action_data *onmatch_parse
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
match_event = strsep(&str, ")"); match_event = strsep(&str, ")");
@ -344,7 +371,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
data->onmatch.match_event = kstrdup(match_event, GFP_KERNEL); data->onmatch.match_event = kstrdup(match_event, GFP_KERNEL);
if (!data->onmatch.match_event) { if (!data->onmatch.match_event) {
@@ -3385,12 +3495,16 @@ static struct action_data *onmatch_parse @@ -3620,12 +3733,16 @@ static struct action_data *onmatch_parse
} }
strsep(&str, "."); strsep(&str, ".");
@ -363,7 +390,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
data->onmatch.synth_event_name = kstrdup(synth_event_name, GFP_KERNEL); data->onmatch.synth_event_name = kstrdup(synth_event_name, GFP_KERNEL);
if (!data->onmatch.synth_event_name) { if (!data->onmatch.synth_event_name) {
@@ -3399,8 +3513,10 @@ static struct action_data *onmatch_parse @@ -3634,8 +3751,10 @@ static struct action_data *onmatch_parse
} }
params = strsep(&str, ")"); params = strsep(&str, ")");
@ -375,22 +402,25 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
ret = parse_action_params(params, data); ret = parse_action_params(params, data);
if (ret) if (ret)
@@ -3480,12 +3596,14 @@ static int create_var_field(struct hist_ @@ -3710,7 +3829,9 @@ static int create_var_field(struct hist_
return -EINVAL;
if (find_var(file, var_name) && !hist_data->remove) { if (WARN_ON(val_idx >= TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX))
return -EINVAL;
+
if (find_var(hist_data, file, var_name) && !hist_data->remove) {
+ hist_err("Variable already defined: ", var_name); + hist_err("Variable already defined: ", var_name);
return -EINVAL; return -EINVAL;
} }
flags |= HIST_FIELD_FL_VAR; @@ -3791,6 +3912,7 @@ static int create_key_field(struct hist_
hist_data->n_vars++; }
if (hist_data->n_vars > TRACING_MAP_VARS_MAX) {
+ hist_err("Too many variables defined: ", var_name);
return -EINVAL;
}
@@ -3676,6 +3794,7 @@ static int parse_var_defs(struct hist_tr if (hist_field->flags & HIST_FIELD_FL_VAR_REF) {
+ hist_err("Using variable references as keys not supported: ", field_str);
destroy_hist_field(hist_field, 0);
ret = -EINVAL;
goto out;
@@ -3904,11 +4026,13 @@ static int parse_var_defs(struct hist_tr
var_name = strsep(&field_str, "="); var_name = strsep(&field_str, "=");
if (!var_name || !field_str) { if (!var_name || !field_str) {
@ -398,7 +428,13 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
ret = -EINVAL; ret = -EINVAL;
goto free; goto free;
} }
@@ -4402,6 +4521,11 @@ static int hist_show(struct seq_file *m,
if (n_vars == TRACING_MAP_VARS_MAX) {
+ hist_err("Too many variables defined: ", var_name);
ret = -EINVAL;
goto free;
}
@@ -4662,6 +4786,11 @@ static int hist_show(struct seq_file *m,
hist_trigger_show(m, data, n++); hist_trigger_show(m, data, n++);
} }
@ -410,7 +446,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
out_unlock: out_unlock:
mutex_unlock(&event_mutex); mutex_unlock(&event_mutex);
@@ -4748,6 +4872,7 @@ static int hist_register_trigger(char *g @@ -5009,6 +5138,7 @@ static int hist_register_trigger(char *g
if (named_data) { if (named_data) {
if (!hist_trigger_match(data, named_data, named_data, if (!hist_trigger_match(data, named_data, named_data,
true)) { true)) {
@ -418,7 +454,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }
@@ -4767,13 +4892,16 @@ static int hist_register_trigger(char *g @@ -5028,13 +5158,16 @@ static int hist_register_trigger(char *g
test->paused = false; test->paused = false;
else if (hist_data->attrs->clear) else if (hist_data->attrs->clear)
hist_clear(test); hist_clear(test);
@ -436,7 +472,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
ret = -ENOENT; ret = -ENOENT;
goto out; goto out;
} }
@@ -4941,6 +5069,11 @@ static int event_hist_trigger_func(struc @@ -5238,6 +5371,11 @@ static int event_hist_trigger_func(struc
char *trigger, *p; char *trigger, *p;
int ret = 0; int ret = 0;
@ -448,7 +484,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
if (!param) if (!param)
return -EINVAL; return -EINVAL;
@@ -5062,6 +5195,9 @@ static int event_hist_trigger_func(struc @@ -5376,6 +5514,9 @@ static int event_hist_trigger_func(struc
/* Just return zero, not the number of registered triggers */ /* Just return zero, not the number of registered triggers */
ret = 0; ret = 0;
out: out:

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:09 -0500 Date: Fri, 17 Nov 2017 14:33:11 -0600
Subject: [PATCH 38/42] tracing: Add inter-event hist trigger Documentation Subject: [PATCH 32/37] tracing: Add inter-event hist trigger Documentation
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Add background and details on inter-event hist triggers, including Add background and details on inter-event hist triggers, including
hist variables, synthetic events, and actions. hist variables, synthetic events, and actions.
@ -10,25 +10,18 @@ Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Baohong Liu <baohong.liu@intel.com> Signed-off-by: Baohong Liu <baohong.liu@intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
Documentation/trace/events.txt | 385 +++++++++++++++++++++++++++++++++++++++++ Documentation/trace/histogram.txt | 382 ++++++++++++++++++++++++++++++++++++++
1 file changed, 385 insertions(+) 1 file changed, 382 insertions(+)
--- a/Documentation/trace/events.txt --- a/Documentation/trace/histogram.txt
+++ b/Documentation/trace/events.txt +++ b/Documentation/trace/histogram.txt
@@ -571,6 +571,7 @@ triggers (you have to use '!' for each o @@ -1605,3 +1605,385 @@
.sym-offset display an address as a symbol and offset
.syscall display a syscall id as a system call name
.execname display a common_pid as a program name
+ .usecs display a $common_timestamp in microseconds
Note that in general the semantics of a given field aren't
interpreted when applying a modifier to it, but there are some
@@ -2101,3 +2102,387 @@ triggers (you have to use '!' for each o
Hits: 489 Hits: 489
Entries: 7 Entries: 7
Dropped: 0 Dropped: 0
+ +
+6.3 Inter-event hist triggers +
+2.2 Inter-event hist triggers
+----------------------------- +-----------------------------
+ +
+Inter-event hist triggers are hist triggers that combine values from +Inter-event hist triggers are hist triggers that combine values from
@ -39,13 +32,10 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+The most important example of an inter-event quantity that can be used +The most important example of an inter-event quantity that can be used
+in this manner is latency, which is simply a difference in timestamps +in this manner is latency, which is simply a difference in timestamps
+between two events (although trace events don't have an externally +between two events. Although latency is the most important
+visible timestamp field, the inter-event hist trigger support adds a +inter-event quantity, note that because the support is completely
+pseudo-field to all events named '$common_timestamp' which can be used +general across the trace event subsystem, any event field can be used
+as if it were an actual event field). Although latency is the most +in an inter-event quantity.
+important inter-event quantity, note that because the support is
+completely general across the trace event subsystem, any event field
+can be used in an inter-event quantity.
+ +
+An example of a histogram that combines data from other histograms +An example of a histogram that combines data from other histograms
+into a useful chain would be a 'wakeupswitch latency' histogram that +into a useful chain would be a 'wakeupswitch latency' histogram that
@ -100,7 +90,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+These features are decribed in more detail in the following sections. +These features are decribed in more detail in the following sections.
+ +
+6.3.1 Histogram Variables +2.2.1 Histogram Variables
+------------------------- +-------------------------
+ +
+Variables are simply named locations used for saving and retrieving +Variables are simply named locations used for saving and retrieving
@ -187,7 +177,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ +
+ # echo 'hist:key=pid:wakeupswitch_lat=$wakeup_lat+$switchtime_lat ... >> event3/trigger + # echo 'hist:key=pid:wakeupswitch_lat=$wakeup_lat+$switchtime_lat ... >> event3/trigger
+ +
+6.3.2 Synthetic Events +2.2.2 Synthetic Events
+---------------------- +----------------------
+ +
+Synthetic events are user-defined events generated from hist trigger +Synthetic events are user-defined events generated from hist trigger
@ -243,7 +233,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Like any other event, once a histogram is enabled for the event, the +Like any other event, once a histogram is enabled for the event, the
+output can be displayed by reading the event's 'hist' file. +output can be displayed by reading the event's 'hist' file.
+ +
+6.3.3 Hist trigger 'actions' +2.2.3 Hist trigger 'actions'
+---------------------------- +----------------------------
+ +
+A hist trigger 'action' is a function that's executed whenever a +A hist trigger 'action' is a function that's executed whenever a

View File

@ -1,7 +1,7 @@
From: Thomas Gleixner <tglx@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:10 +0200 Date: Thu, 23 Nov 2017 16:39:13 +0100
Subject: [PATCH 32/36] xfrm: Replace hrtimer tasklet with softirq hrtimer Subject: [PATCH 32/36] xfrm: Replace hrtimer tasklet with softirq hrtimer
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Switch the timer to HRTIMER_MODE_SOFT, which executed the timer Switch the timer to HRTIMER_MODE_SOFT, which executed the timer
callback in softirq context and remove the hrtimer_tasklet. callback in softirq context and remove the hrtimer_tasklet.
@ -9,9 +9,9 @@ callback in softirq context and remove the hrtimer_tasklet.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Cc: Steffen Klassert <steffen.klassert@secunet.com> Cc: Steffen Klassert <steffen.klassert@secunet.com>
Cc: netdev@vger.kernel.org
Cc: Herbert Xu <herbert@gondor.apana.org.au> Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: "David S. Miller" <davem@davemloft.net> Cc: "David S. Miller" <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
include/net/xfrm.h | 2 +- include/net/xfrm.h | 2 +-

View File

@ -1,7 +1,7 @@
From: Thomas Gleixner <tglx@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:11 +0200 Date: Thu, 23 Nov 2017 16:39:14 +0100
Subject: [PATCH 33/36] softirq: Remove tasklet_hrtimer Subject: [PATCH 33/36] softirq: Remove tasklet_hrtimer
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
There are no more tasklet_hrtimer users of this interface. There are no more tasklet_hrtimer users of this interface.
Remove it. Remove it.

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:10 -0500 Date: Fri, 17 Nov 2017 14:33:12 -0600
Subject: [PATCH 39/42] tracing: Make tracing_set_clock() non-static Subject: [PATCH 33/37] tracing: Make tracing_set_clock() non-static
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Allow tracing code outside of trace.c to access tracing_set_clock(). Allow tracing code outside of trace.c to access tracing_set_clock().
@ -19,7 +19,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- a/kernel/trace/trace.c --- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c +++ b/kernel/trace/trace.c
@@ -6226,7 +6226,7 @@ static int tracing_clock_show(struct seq @@ -6230,7 +6230,7 @@ static int tracing_clock_show(struct seq
return 0; return 0;
} }

View File

@ -1,7 +1,7 @@
From: Thomas Gleixner <tglx@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:12 +0200 Date: Thu, 23 Nov 2017 16:39:15 +0100
Subject: [PATCH 34/36] ALSA/dummy: Replace tasklet with softirq hrtimer Subject: [PATCH 34/36] ALSA/dummy: Replace tasklet with softirq hrtimer
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The tasklet is used to defer the execution of snd_pcm_period_elapsed() to The tasklet is used to defer the execution of snd_pcm_period_elapsed() to
the softirq context. Using the HRTIMER_MODE_SOFT mode invokes the timer the softirq context. Using the HRTIMER_MODE_SOFT mode invokes the timer
@ -9,12 +9,13 @@ callback in softirq context as well which renders the tasklet useless.
[o-takashi: avoid stall due to a call of hrtimer_cancel() on a callback [o-takashi: avoid stall due to a call of hrtimer_cancel() on a callback
of hrtimer] of hrtimer]
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Cc: Jaroslav Kysela <perex@perex.cz>
Cc: Takashi Iwai <tiwai@suse.com>
Cc: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Cc: alsa-devel@alsa-project.org Cc: alsa-devel@alsa-project.org
Cc: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Cc: Takashi Iwai <tiwai@suse.com>
Cc: Jaroslav Kysela <perex@perex.cz>
Link: http://lkml.kernel.org/r/20170905161820.jtysvxtfleunbbmf@breakpoint.cc Link: http://lkml.kernel.org/r/20170905161820.jtysvxtfleunbbmf@breakpoint.cc
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---

View File

@ -1,7 +1,7 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:11 -0500 Date: Fri, 17 Nov 2017 14:33:13 -0600
Subject: [PATCH 40/42] tracing: Add a clock attribute for hist triggers Subject: [PATCH 34/37] tracing: Add a clock attribute for hist triggers
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The default clock if timestamps are used in a histogram is "global". The default clock if timestamps are used in a histogram is "global".
If timestamps aren't used, the clock is irrelevant. If timestamps aren't used, the clock is irrelevant.
@ -13,16 +13,17 @@ Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com> Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
Documentation/trace/events.txt | 9 +++++++++ Documentation/trace/histogram.txt | 11 ++++++++++-
kernel/trace/trace_events_hist.c | 38 ++++++++++++++++++++++++++++++++++++-- kernel/trace/trace_events_hist.c | 38 ++++++++++++++++++++++++++++++++++++--
2 files changed, 45 insertions(+), 2 deletions(-) 2 files changed, 46 insertions(+), 3 deletions(-)
--- a/Documentation/trace/events.txt --- a/Documentation/trace/histogram.txt
+++ b/Documentation/trace/events.txt +++ b/Documentation/trace/histogram.txt
@@ -2173,6 +2173,15 @@ specification. In support of this overa @@ -1674,7 +1674,16 @@ specification. In support of this overa
default it is in units of nanoseconds; appending '.usecs' to a default it is in units of nanoseconds; appending '.usecs' to a
common_timestamp field changes the units to microseconds. common_timestamp field changes the units to microseconds.
-These features are decribed in more detail in the following sections.
+A note on inter-event timestamps: If $common_timestamp is used in a +A note on inter-event timestamps: If $common_timestamp is used in a
+histogram, the trace buffer is automatically switched over to using +histogram, the trace buffer is automatically switched over to using
+absolute timestamps and the "global" trace clock, in order to avoid +absolute timestamps and the "global" trace clock, in order to avoid
@ -32,12 +33,13 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+where XXX is any of the clocks listed in the tracing/trace_clock +where XXX is any of the clocks listed in the tracing/trace_clock
+pseudo-file. +pseudo-file.
+ +
These features are decribed in more detail in the following sections. +These features are described in more detail in the following sections.
6.3.1 Histogram Variables 2.2.1 Histogram Variables
-------------------------
--- a/kernel/trace/trace_events_hist.c --- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c
@@ -241,6 +241,7 @@ struct hist_trigger_attrs { @@ -242,6 +242,7 @@ struct hist_trigger_attrs {
char *vals_str; char *vals_str;
char *sort_key_str; char *sort_key_str;
char *name; char *name;
@ -45,7 +47,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
bool pause; bool pause;
bool cont; bool cont;
bool clear; bool clear;
@@ -1680,6 +1681,7 @@ static void destroy_hist_trigger_attrs(s @@ -1795,6 +1796,7 @@ static void destroy_hist_trigger_attrs(s
kfree(attrs->sort_key_str); kfree(attrs->sort_key_str);
kfree(attrs->keys_str); kfree(attrs->keys_str);
kfree(attrs->vals_str); kfree(attrs->vals_str);
@ -53,7 +55,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
kfree(attrs); kfree(attrs);
} }
@@ -1735,6 +1737,19 @@ static int parse_assignment(char *str, s @@ -1850,6 +1852,19 @@ static int parse_assignment(char *str, s
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
} }
@ -73,7 +75,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
} else if (strncmp(str, "size=", strlen("size=")) == 0) { } else if (strncmp(str, "size=", strlen("size=")) == 0) {
int map_bits = parse_map_size(str); int map_bits = parse_map_size(str);
@@ -1798,6 +1813,14 @@ static struct hist_trigger_attrs *parse_ @@ -1914,6 +1929,14 @@ static struct hist_trigger_attrs *parse_
goto free; goto free;
} }
@ -88,7 +90,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
return attrs; return attrs;
free: free:
destroy_hist_trigger_attrs(attrs); destroy_hist_trigger_attrs(attrs);
@@ -4660,6 +4683,8 @@ static int event_hist_trigger_print(stru @@ -4926,6 +4949,8 @@ static int event_hist_trigger_print(stru
seq_puts(m, ".descending"); seq_puts(m, ".descending");
} }
seq_printf(m, ":size=%u", (1 << hist_data->map->map_bits)); seq_printf(m, ":size=%u", (1 << hist_data->map->map_bits));
@ -97,7 +99,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
print_actions_spec(m, hist_data); print_actions_spec(m, hist_data);
@@ -4922,10 +4947,19 @@ static int hist_register_trigger(char *g @@ -5188,10 +5213,19 @@ static int hist_register_trigger(char *g
goto out; goto out;
} }

View File

@ -1,8 +1,8 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:12 -0500 Date: Fri, 17 Nov 2017 14:33:14 -0600
Subject: [PATCH 41/42] tracing: Increase trace_recursive_lock() limit for Subject: [PATCH 35/37] tracing: Increase trace_recursive_lock() limit for
synthetic events synthetic events
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Synthetic event generation needs to happen while the current event is Synthetic event generation needs to happen while the current event is
still in progress, so add 1 to the trace_recursive_lock() recursion still in progress, so add 1 to the trace_recursive_lock() recursion
@ -20,7 +20,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- a/kernel/trace/ring_buffer.c --- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c
@@ -2590,16 +2590,16 @@ rb_wakeups(struct ring_buffer *buffer, s @@ -2589,16 +2589,16 @@ rb_wakeups(struct ring_buffer *buffer, s
* IRQ context * IRQ context
* NMI context * NMI context
* *

View File

@ -1,7 +1,7 @@
From: Thomas Gleixner <tglx@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:14 +0200 Date: Thu, 23 Nov 2017 16:39:16 +0100
Subject: [PATCH 35/36] usb/gadget/NCM: Replace tasklet with softirq hrtimer Subject: [PATCH 35/36] usb/gadget/NCM: Replace tasklet with softirq hrtimer
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The tx_tasklet tasklet is used in invoke the hrtimer (task_timer) in The tx_tasklet tasklet is used in invoke the hrtimer (task_timer) in
softirq context. This can be also achieved without the tasklet but softirq context. This can be also achieved without the tasklet but

View File

@ -1,7 +1,7 @@
From: Thomas Gleixner <tglx@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de>
Date: Sun, 22 Oct 2017 23:40:15 +0200 Date: Thu, 23 Nov 2017 16:39:17 +0100
Subject: [PATCH 36/36] net/mvpp2: Replace tasklet with softirq hrtimer Subject: [PATCH 36/36] net/mvpp2: Replace tasklet with softirq hrtimer
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The tx_done_tasklet tasklet is used in invoke the hrtimer The tx_done_tasklet tasklet is used in invoke the hrtimer
(mvpp2_hr_timer_cb) in softirq context. This can be also achieved without (mvpp2_hr_timer_cb) in softirq context. This can be also achieved without
@ -9,9 +9,9 @@ the tasklet but with HRTIMER_MODE_SOFT as hrtimer mode.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: netdev@vger.kernel.org Cc: netdev@vger.kernel.org
Cc: "David S. Miller" <davem@davemloft.net>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
--- ---
drivers/net/ethernet/marvell/mvpp2.c | 62 ++++++++++++++--------------------- drivers/net/ethernet/marvell/mvpp2.c | 62 ++++++++++++++---------------------

View File

@ -1,8 +1,8 @@
From: Tom Zanussi <tom.zanussi@linux.intel.com> From: Tom Zanussi <tom.zanussi@linux.intel.com>
Date: Fri, 22 Sep 2017 15:00:13 -0500 Date: Fri, 17 Nov 2017 14:33:15 -0600
Subject: [PATCH 42/42] tracing: Add inter-event blurb to HIST_TRIGGERS config Subject: [PATCH 36/37] tracing: Add inter-event blurb to HIST_TRIGGERS config
option option
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
So that users know that inter-event tracing is supported as part of So that users know that inter-event tracing is supported as part of
the HIST_TRIGGERS option, include text to that effect in the help the HIST_TRIGGERS option, include text to that effect in the help

View File

@ -0,0 +1,439 @@
From: Rajvi Jingar <rajvi.jingar@intel.com>
Date: Fri, 17 Nov 2017 14:33:16 -0600
Subject: [PATCH 37/37] selftests: ftrace: Add inter-event hist triggers
testcases
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
This adds inter-event hist triggers testcases which covers following:
- create/remove synthetic event
- disable histogram for synthetic event
- extended error support
- field variable support
- histogram variables
- histogram trigger onmatch action
- histogram trigger onmax action
- histogram trigger onmatch-onmax action
- simple expression support
- combined histogram
Here is the test result.
=== Ftrace unit tests ===
[1] event trigger - test extended error support [PASS]
[2] event trigger - test field variable support [PASS]
[3] event trigger - test inter-event combined histogram trigger [PASS]
[4] event trigger - test inter-event histogram trigger onmatch action [PASS]
[5] event trigger - test inter-event histogram trigger onmatch-onmax action [PASS]
[6] event trigger - test inter-event histogram trigger onmax action [PASS]
[7] event trigger - test synthetic event create remove [PASS]
Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
tools/testing/selftests/ftrace/test.d/functions | 7 +
tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-extended-error-support.tc | 39 ++++++
tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-field-variable-support.tc | 54 +++++++++
tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-inter-event-combined-hist.tc | 58 ++++++++++
tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onmatch-action-hist.tc | 50 ++++++++
tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onmatch-onmax-action-hist.tc | 50 ++++++++
tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onmax-action-hist.tc | 48 ++++++++
tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-createremove.tc | 54 +++++++++
8 files changed, 360 insertions(+)
create mode 100644 tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-extended-error-support.tc
create mode 100644 tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-field-variable-support.tc
create mode 100644 tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-inter-event-combined-hist.tc
create mode 100644 tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onmatch-action-hist.tc
create mode 100644 tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onmatch-onmax-action-hist.tc
create mode 100644 tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onmax-action-hist.tc
create mode 100644 tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-createremove.tc
--- a/tools/testing/selftests/ftrace/test.d/functions
+++ b/tools/testing/selftests/ftrace/test.d/functions
@@ -55,6 +55,13 @@ disable_events() {
echo 0 > events/enable
}
+clear_synthetic_events() { # reset all current synthetic events
+ grep -v ^# synthetic_events |
+ while read line; do
+ echo "!$line" >> synthetic_events
+ done
+}
+
initialize_ftrace() { # Reset ftrace to initial-state
# As the initial state, ftrace will be set to nop tracer,
# no events, no triggers, no filters, no function filters,
--- /dev/null
+++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-extended-error-support.tc
@@ -0,0 +1,39 @@
+#!/bin/sh
+# description: event trigger - test extended error support
+
+
+do_reset() {
+ reset_trigger
+ echo > set_event
+ clear_trace
+}
+
+fail() { #msg
+ do_reset
+ echo $1
+ exit_fail
+}
+
+if [ ! -f set_event ]; then
+ echo "event tracing is not supported"
+ exit_unsupported
+fi
+
+if [ ! -f synthetic_events ]; then
+ echo "synthetic event is not supported"
+ exit_unsupported
+fi
+
+reset_tracer
+do_reset
+
+echo "Test extended error support"
+echo 'hist:keys=pid:ts0=$common_timestamp.usecs if comm=="ping"' > events/sched/sched_wakeup/trigger
+echo 'hist:keys=pid:ts0=$common_timestamp.usecs if comm=="ping"' >> events/sched/sched_wakeup/trigger &>/dev/null
+if ! grep -q "ERROR:" events/sched/sched_wakeup/hist; then
+ fail "Failed to generate extended error in histogram"
+fi
+
+do_reset
+
+exit 0
--- /dev/null
+++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-field-variable-support.tc
@@ -0,0 +1,54 @@
+#!/bin/sh
+# description: event trigger - test field variable support
+
+do_reset() {
+ reset_trigger
+ echo > set_event
+ clear_trace
+}
+
+fail() { #msg
+ do_reset
+ echo $1
+ exit_fail
+}
+
+if [ ! -f set_event ]; then
+ echo "event tracing is not supported"
+ exit_unsupported
+fi
+
+if [ ! -f synthetic_events ]; then
+ echo "synthetic event is not supported"
+ exit_unsupported
+fi
+
+clear_synthetic_events
+reset_tracer
+do_reset
+
+echo "Test field variable support"
+
+echo 'wakeup_latency u64 lat; pid_t pid; int prio; char comm[16]' > synthetic_events
+echo 'hist:keys=comm:ts0=$common_timestamp.usecs if comm=="ping"' > events/sched/sched_waking/trigger
+echo 'hist:keys=next_comm:wakeup_lat=$common_timestamp.usecs-$ts0:onmatch(sched.sched_waking).wakeup_latency($wakeup_lat,next_pid,sched.sched_waking.prio,next_comm) if next_comm=="ping"' > events/sched/sched_switch/trigger
+echo 'hist:keys=pid,prio,comm:vals=lat:sort=pid,prio' > events/synthetic/wakeup_latency/trigger
+
+ping localhost -c 3
+if ! grep -q "ping" events/synthetic/wakeup_latency/hist; then
+ fail "Failed to create inter-event histogram"
+fi
+
+if ! grep -q "synthetic_prio=prio" events/sched/sched_waking/hist; then
+ fail "Failed to create histogram with field variable"
+fi
+
+echo '!hist:keys=next_comm:wakeup_lat=$common_timestamp.usecs-$ts0:onmatch(sched.sched_waking).wakeup_latency($wakeup_lat,next_pid,sched.sched_waking.prio,next_comm) if next_comm=="ping"' >> events/sched/sched_switch/trigger
+
+if grep -q "synthetic_prio=prio" events/sched/sched_waking/hist; then
+ fail "Failed to remove histogram with field variable"
+fi
+
+do_reset
+
+exit 0
--- /dev/null
+++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-inter-event-combined-hist.tc
@@ -0,0 +1,58 @@
+#!/bin/sh
+# description: event trigger - test inter-event combined histogram trigger
+
+do_reset() {
+ reset_trigger
+ echo > set_event
+ clear_trace
+}
+
+fail() { #msg
+ do_reset
+ echo $1
+ exit_fail
+}
+
+if [ ! -f set_event ]; then
+ echo "event tracing is not supported"
+ exit_unsupported
+fi
+
+if [ ! -f synthetic_events ]; then
+ echo "synthetic event is not supported"
+ exit_unsupported
+fi
+
+reset_tracer
+do_reset
+clear_synthetic_events
+
+echo "Test create synthetic event"
+
+echo 'waking_latency u64 lat pid_t pid' > synthetic_events
+if [ ! -d events/synthetic/waking_latency ]; then
+ fail "Failed to create waking_latency synthetic event"
+fi
+
+echo "Test combined histogram"
+
+echo 'hist:keys=pid:ts0=$common_timestamp.usecs if comm=="ping"' > events/sched/sched_waking/trigger
+echo 'hist:keys=pid:waking_lat=$common_timestamp.usecs-$ts0:onmatch(sched.sched_waking).waking_latency($waking_lat,pid) if comm=="ping"' > events/sched/sched_wakeup/trigger
+echo 'hist:keys=pid,lat:sort=pid,lat' > events/synthetic/waking_latency/trigger
+
+echo 'wakeup_latency u64 lat pid_t pid' >> synthetic_events
+echo 'hist:keys=pid:ts1=$common_timestamp.usecs if comm=="ping"' >> events/sched/sched_wakeup/trigger
+echo 'hist:keys=next_pid:wakeup_lat=$common_timestamp.usecs-$ts1:onmatch(sched.sched_wakeup).wakeup_latency($wakeup_lat,next_pid) if next_comm=="ping"' > events/sched/sched_switch/trigger
+
+echo 'waking+wakeup_latency u64 lat; pid_t pid' >> synthetic_events
+echo 'hist:keys=pid,lat:sort=pid,lat:ww_lat=$waking_lat+$wakeup_lat:onmatch(synthetic.wakeup_latency).waking+wakeup_latency($ww_lat,pid)' >> events/synthetic/wakeup_latency/trigger
+echo 'hist:keys=pid,lat:sort=pid,lat' >> events/synthetic/waking+wakeup_latency/trigger
+
+ping localhost -c 3
+if ! grep -q "pid:" events/synthetic/waking+wakeup_latency/hist; then
+ fail "Failed to create combined histogram"
+fi
+
+do_reset
+
+exit 0
--- /dev/null
+++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onmatch-action-hist.tc
@@ -0,0 +1,50 @@
+#!/bin/sh
+# description: event trigger - test inter-event histogram trigger onmatch action
+
+do_reset() {
+ reset_trigger
+ echo > set_event
+ clear_trace
+}
+
+fail() { #msg
+ do_reset
+ echo $1
+ exit_fail
+}
+
+if [ ! -f set_event ]; then
+ echo "event tracing is not supported"
+ exit_unsupported
+fi
+
+if [ ! -f synthetic_events ]; then
+ echo "synthetic event is not supported"
+ exit_unsupported
+fi
+
+clear_synthetic_events
+reset_tracer
+do_reset
+
+echo "Test create synthetic event"
+
+echo 'wakeup_latency u64 lat pid_t pid char comm[16]' > synthetic_events
+if [ ! -d events/synthetic/wakeup_latency ]; then
+ fail "Failed to create wakeup_latency synthetic event"
+fi
+
+echo "Test create histogram for synthetic event"
+echo "Test histogram variables,simple expression support and onmatch action"
+
+echo 'hist:keys=pid:ts0=$common_timestamp.usecs if comm=="ping"' > events/sched/sched_wakeup/trigger
+echo 'hist:keys=next_pid:wakeup_lat=$common_timestamp.usecs-$ts0:onmatch(sched.sched_wakeup).wakeup_latency($wakeup_lat,next_pid,next_comm) if next_comm=="ping"' > events/sched/sched_switch/trigger
+echo 'hist:keys=comm,pid,lat:wakeup_lat=lat:sort=lat' > events/synthetic/wakeup_latency/trigger
+ping localhost -c 5
+if ! grep -q "ping" events/synthetic/wakeup_latency/hist; then
+ fail "Failed to create onmatch action inter-event histogram"
+fi
+
+do_reset
+
+exit 0
--- /dev/null
+++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onmatch-onmax-action-hist.tc
@@ -0,0 +1,50 @@
+#!/bin/sh
+# description: event trigger - test inter-event histogram trigger onmatch-onmax action
+
+do_reset() {
+ reset_trigger
+ echo > set_event
+ clear_trace
+}
+
+fail() { #msg
+ do_reset
+ echo $1
+ exit_fail
+}
+
+if [ ! -f set_event ]; then
+ echo "event tracing is not supported"
+ exit_unsupported
+fi
+
+if [ ! -f synthetic_events ]; then
+ echo "synthetic event is not supported"
+ exit_unsupported
+fi
+
+clear_synthetic_events
+reset_tracer
+do_reset
+
+echo "Test create synthetic event"
+
+echo 'wakeup_latency u64 lat pid_t pid char comm[16]' > synthetic_events
+if [ ! -d events/synthetic/wakeup_latency ]; then
+ fail "Failed to create wakeup_latency synthetic event"
+fi
+
+echo "Test create histogram for synthetic event"
+echo "Test histogram variables,simple expression support and onmatch-onmax action"
+
+echo 'hist:keys=pid:ts0=$common_timestamp.usecs if comm=="ping"' > events/sched/sched_wakeup/trigger
+echo 'hist:keys=next_pid:wakeup_lat=$common_timestamp.usecs-$ts0:onmatch(sched.sched_wakeup).wakeup_latency($wakeup_lat,next_pid,next_comm):onmax($wakeup_lat).save(next_comm,prev_pid,prev_prio,prev_comm) if next_comm=="ping"' >> events/sched/sched_switch/trigger
+echo 'hist:keys=comm,pid,lat:wakeup_lat=lat:sort=lat' > events/synthetic/wakeup_latency/trigger
+ping localhost -c 5
+if [ ! grep -q "ping" events/synthetic/wakeup_latency/hist -o ! grep -q "max:" events/sched/sched_switch/hist]; then
+ fail "Failed to create onmatch-onmax action inter-event histogram"
+fi
+
+do_reset
+
+exit 0
--- /dev/null
+++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-onmax-action-hist.tc
@@ -0,0 +1,48 @@
+#!/bin/sh
+# description: event trigger - test inter-event histogram trigger onmax action
+
+do_reset() {
+ reset_trigger
+ echo > set_event
+ clear_trace
+}
+
+fail() { #msg
+ do_reset
+ echo $1
+ exit_fail
+}
+
+if [ ! -f set_event ]; then
+ echo "event tracing is not supported"
+ exit_unsupported
+fi
+
+if [ ! -f synthetic_events ]; then
+ echo "synthetic event is not supported"
+ exit_unsupported
+fi
+
+clear_synthetic_events
+reset_tracer
+do_reset
+
+echo "Test create synthetic event"
+
+echo 'wakeup_latency u64 lat pid_t pid char comm[16]' > synthetic_events
+if [ ! -d events/synthetic/wakeup_latency ]; then
+ fail "Failed to create wakeup_latency synthetic event"
+fi
+
+echo "Test onmax action"
+
+echo 'hist:keys=pid:ts0=$common_timestamp.usecs if comm=="ping"' >> events/sched/sched_waking/trigger
+echo 'hist:keys=next_pid:wakeup_lat=$common_timestamp.usecs-$ts0:onmax($wakeup_lat).save(next_comm,prev_pid,prev_prio,prev_comm) if next_comm=="ping"' >> events/sched/sched_switch/trigger
+ping localhost -c 3
+if ! grep -q "max:" events/sched/sched_switch/hist; then
+ fail "Failed to create onmax action inter-event histogram"
+fi
+
+do_reset
+
+exit 0
--- /dev/null
+++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-createremove.tc
@@ -0,0 +1,54 @@
+#!/bin/sh
+# description: event trigger - test synthetic event create remove
+do_reset() {
+ reset_trigger
+ echo > set_event
+ clear_trace
+}
+
+fail() { #msg
+ do_reset
+ echo $1
+ exit_fail
+}
+
+if [ ! -f set_event ]; then
+ echo "event tracing is not supported"
+ exit_unsupported
+fi
+
+if [ ! -f synthetic_events ]; then
+ echo "synthetic event is not supported"
+ exit_unsupported
+fi
+
+clear_synthetic_events
+reset_tracer
+do_reset
+
+echo "Test create synthetic event"
+
+echo 'wakeup_latency u64 lat pid_t pid char comm[16]' > synthetic_events
+if [ ! -d events/synthetic/wakeup_latency ]; then
+ fail "Failed to create wakeup_latency synthetic event"
+fi
+
+reset_trigger
+
+echo "Test create synthetic event with an error"
+echo 'wakeup_latency u64 lat pid_t pid char' > synthetic_events > /dev/null
+if [ -d events/synthetic/wakeup_latency ]; then
+ fail "Created wakeup_latency synthetic event with an invalid format"
+fi
+
+reset_trigger
+
+echo "Test remove synthetic event"
+echo '!wakeup_latency u64 lat pid_t pid char comm[16]' > synthetic_events
+if [ -d events/synthetic/wakeup_latency ]; then
+ fail "Failed to delete wakeup_latency synthetic event"
+fi
+
+do_reset
+
+exit 0

View File

@ -1,7 +1,7 @@
From: "Yadi.hu" <yadi.hu@windriver.com> From: "Yadi.hu" <yadi.hu@windriver.com>
Date: Wed, 10 Dec 2014 10:32:09 +0800 Date: Wed, 10 Dec 2014 10:32:09 +0800
Subject: ARM: enable irq in translation/section permission fault handlers Subject: ARM: enable irq in translation/section permission fault handlers
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Probably happens on all ARM, with Probably happens on all ARM, with
CONFIG_PREEMPT_RT_FULL CONFIG_PREEMPT_RT_FULL

View File

@ -2,7 +2,7 @@ From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: Thu, 21 Sep 2017 15:35:57 +0200 Date: Thu, 21 Sep 2017 15:35:57 +0200
Subject: Bluetooth: avoid recursive locking in Subject: Bluetooth: avoid recursive locking in
hci_send_to_channel() hci_send_to_channel()
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Mart reported a deadlock in -RT in the call path: Mart reported a deadlock in -RT in the call path:
hci_send_monitor_ctrl_event() -> hci_send_to_channel() hci_send_monitor_ctrl_event() -> hci_send_to_channel()

View File

@ -1,7 +1,7 @@
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: Thu, 21 Mar 2013 19:01:05 +0100 Date: Thu, 21 Mar 2013 19:01:05 +0100
Subject: printk: Drop the logbuf_lock more often Subject: printk: Drop the logbuf_lock more often
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The lock is hold with irgs off. The latency drops 500us+ on my arm bugs The lock is hold with irgs off. The latency drops 500us+ on my arm bugs
with a "full" buffer after executing "dmesg" on the shell. with a "full" buffer after executing "dmesg" on the shell.

View File

@ -1,7 +1,7 @@
From: Josh Cartwright <joshc@ni.com> From: Josh Cartwright <joshc@ni.com>
Date: Thu, 11 Feb 2016 11:54:01 -0600 Date: Thu, 11 Feb 2016 11:54:01 -0600
Subject: KVM: arm/arm64: downgrade preempt_disable()d region to migrate_disable() Subject: KVM: arm/arm64: downgrade preempt_disable()d region to migrate_disable()
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
kvm_arch_vcpu_ioctl_run() disables the use of preemption when updating kvm_arch_vcpu_ioctl_run() disables the use of preemption when updating
the vgic and timer states to prevent the calling task from migrating to the vgic and timer states to prevent the calling task from migrating to

View File

@ -5,7 +5,7 @@ Cc: Anna Schumaker <anna.schumaker@netapp.com>,
linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org,
tglx@linutronix.de tglx@linutronix.de
Subject: NFSv4: replace seqcount_t with a seqlock_t Subject: NFSv4: replace seqcount_t with a seqlock_t
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The raw_write_seqcount_begin() in nfs4_reclaim_open_state() bugs me The raw_write_seqcount_begin() in nfs4_reclaim_open_state() bugs me
because it maps to preempt_disable() in -RT which I can't have at this because it maps to preempt_disable() in -RT which I can't have at this

View File

@ -2,7 +2,7 @@ From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: Thu, 21 Sep 2017 14:25:13 +0200 Date: Thu, 21 Sep 2017 14:25:13 +0200
Subject: [PATCH] RCU: we need to skip that warning but only on sleeping Subject: [PATCH] RCU: we need to skip that warning but only on sleeping
locks locks
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
This check is okay for upstream. On RT we trigger this while blocking on This check is okay for upstream. On RT we trigger this while blocking on
sleeping lock. In this case, it is okay to schedule() within a RCU sleeping lock. In this case, it is okay to schedule() within a RCU

View File

@ -0,0 +1,26 @@
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: Thu, 23 Nov 2017 17:51:51 +0100
Subject: [PATCH] Revert "fs: jbd2: pull your plug when waiting for space"
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
This reverts commit "fs: jbd2: pull your plug when waiting for space".
This was a duct-tape fix which shouldn't be needed since commit
"locking/rt-mutex: fix deadlock in device mapper / block-IO".
Cc: stable@vger.kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
fs/jbd2/checkpoint.c | 2 --
1 file changed, 2 deletions(-)
--- a/fs/jbd2/checkpoint.c
+++ b/fs/jbd2/checkpoint.c
@@ -116,8 +116,6 @@ void __jbd2_log_wait_for_space(journal_t
nblocks = jbd2_space_needed(journal);
while (jbd2_log_space_left(journal) < nblocks) {
write_unlock(&journal->j_state_lock);
- if (current->plug)
- io_schedule();
mutex_lock(&journal->j_checkpoint_mutex);
/*

View File

@ -0,0 +1,101 @@
From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>
Date: Wed, 22 Nov 2017 07:31:19 -0500
Subject: [PATCH] Revert "memcontrol: Prevent scheduling while atomic in cgroup
code"
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The commit "memcontrol: Prevent scheduling while atomic in cgroup code"
fixed this issue:
refill_stock()
get_cpu_var()
drain_stock()
res_counter_uncharge()
res_counter_uncharge_until()
spin_lock() <== boom
But commit 3e32cb2e0a12b ("mm: memcontrol: lockless page counters") replaced
the calls to res_counter_uncharge() in drain_stock() to the lockless
function page_counter_uncharge(). There is no more spin lock there and no
more reason to have that local lock.
Cc: <stable@vger.kernel.org>
Reported-by: Haiyang HY1 Tan <tanhy1@lenovo.com>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
[bigeasy: That upstream commit appeared in v3.19 and the patch in
question in v3.18.7-rt2 and v3.18 seems still to be maintained. So I
guess that v3.18 would need the locallocks that we are about to remove
here. I am not sure if any earlier versions have the patch
backported.
The stable tag here is because Haiyang reported (and debugged) a crash
in 4.4-RT with this patch applied (which has get_cpu_light() instead
the locallocks it gained in v4.9-RT).
https://lkml.kernel.org/r/05AA4EC5C6EC1D48BE2CDCFF3AE0B8A637F78A15@CNMAILEX04.lenovo.com
]
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
mm/memcontrol.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1723,7 +1723,6 @@ struct memcg_stock_pcp {
#define FLUSHING_CACHED_CHARGE 0
};
static DEFINE_PER_CPU(struct memcg_stock_pcp, memcg_stock);
-static DEFINE_LOCAL_IRQ_LOCK(memcg_stock_ll);
static DEFINE_MUTEX(percpu_charge_mutex);
/**
@@ -1746,7 +1745,7 @@ static bool consume_stock(struct mem_cgr
if (nr_pages > CHARGE_BATCH)
return ret;
- local_lock_irqsave(memcg_stock_ll, flags);
+ local_irq_save(flags);
stock = this_cpu_ptr(&memcg_stock);
if (memcg == stock->cached && stock->nr_pages >= nr_pages) {
@@ -1754,7 +1753,7 @@ static bool consume_stock(struct mem_cgr
ret = true;
}
- local_unlock_irqrestore(memcg_stock_ll, flags);
+ local_irq_restore(flags);
return ret;
}
@@ -1785,13 +1784,13 @@ static void drain_local_stock(struct wor
* The only protection from memory hotplug vs. drain_stock races is
* that we always operate on local CPU stock here with IRQ disabled
*/
- local_lock_irqsave(memcg_stock_ll, flags);
+ local_irq_save(flags);
stock = this_cpu_ptr(&memcg_stock);
drain_stock(stock);
clear_bit(FLUSHING_CACHED_CHARGE, &stock->flags);
- local_unlock_irqrestore(memcg_stock_ll, flags);
+ local_irq_restore(flags);
}
/*
@@ -1803,7 +1802,7 @@ static void refill_stock(struct mem_cgro
struct memcg_stock_pcp *stock;
unsigned long flags;
- local_lock_irqsave(memcg_stock_ll, flags);
+ local_irq_save(flags);
stock = this_cpu_ptr(&memcg_stock);
if (stock->cached != memcg) { /* reset if necessary */
@@ -1815,7 +1814,7 @@ static void refill_stock(struct mem_cgro
if (stock->nr_pages > CHARGE_BATCH)
drain_stock(stock);
- local_unlock_irqrestore(memcg_stock_ll, flags);
+ local_irq_restore(flags);
}
/*

View File

@ -1,7 +1,7 @@
From: Steven Rostedt <rostedt@goodmis.org> From: Steven Rostedt <rostedt@goodmis.org>
Date: Wed, 13 Feb 2013 09:26:05 -0500 Date: Wed, 13 Feb 2013 09:26:05 -0500
Subject: acpi/rt: Convert acpi_gbl_hardware lock back to a raw_spinlock_t Subject: acpi/rt: Convert acpi_gbl_hardware lock back to a raw_spinlock_t
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
We hit the following bug with 3.6-rt: We hit the following bug with 3.6-rt:

View File

@ -1,7 +1,7 @@
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: Sat, 27 May 2017 19:02:06 +0200 Date: Sat, 27 May 2017 19:02:06 +0200
Subject: kernel/sched/core: add migrate_disable() Subject: kernel/sched/core: add migrate_disable()
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
--- ---
include/linux/preempt.h | 23 ++++++++ include/linux/preempt.h | 23 ++++++++

View File

@ -1,7 +1,7 @@
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: Wed, 11 Oct 2017 17:43:49 +0200 Date: Wed, 11 Oct 2017 17:43:49 +0200
Subject: apparmor: use a locallock instead preempt_disable() Subject: apparmor: use a locallock instead preempt_disable()
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
get_buffers() disables preemption which acts as a lock for the per-CPU get_buffers() disables preemption which acts as a lock for the per-CPU
variable. Since we can't disable preemption here on RT, a local_lock is variable. Since we can't disable preemption here on RT, a local_lock is

View File

@ -1,7 +1,7 @@
From: Anders Roxell <anders.roxell@linaro.org> From: Anders Roxell <anders.roxell@linaro.org>
Date: Thu, 14 May 2015 17:52:17 +0200 Date: Thu, 14 May 2015 17:52:17 +0200
Subject: arch/arm64: Add lazy preempt support Subject: arch/arm64: Add lazy preempt support
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
arm64 is missing support for PREEMPT_RT. The main feature which is arm64 is missing support for PREEMPT_RT. The main feature which is
lacking is support for lazy preemption. The arch-specific entry code, lacking is support for lazy preemption. The arch-specific entry code,

View File

@ -1,7 +1,7 @@
From: Benedikt Spranger <b.spranger@linutronix.de> From: Benedikt Spranger <b.spranger@linutronix.de>
Date: Sat, 6 Mar 2010 17:47:10 +0100 Date: Sat, 6 Mar 2010 17:47:10 +0100
Subject: ARM: AT91: PIT: Remove irq handler when clock event is unused Subject: ARM: AT91: PIT: Remove irq handler when clock event is unused
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
Setup and remove the interrupt handler in clock event mode selection. Setup and remove the interrupt handler in clock event mode selection.
This avoids calling the (shared) interrupt handler when the device is This avoids calling the (shared) interrupt handler when the device is

View File

@ -1,7 +1,7 @@
From: Thomas Gleixner <tglx@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de>
Date: Sat, 1 May 2010 18:29:35 +0200 Date: Sat, 1 May 2010 18:29:35 +0200
Subject: ARM: at91: tclib: Default to tclib timer for RT Subject: ARM: at91: tclib: Default to tclib timer for RT
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
RT is not too happy about the shared timer interrupt in AT91 RT is not too happy about the shared timer interrupt in AT91
devices. Default to tclib timer for RT. devices. Default to tclib timer for RT.

View File

@ -1,7 +1,7 @@
From: Frank Rowand <frank.rowand@am.sony.com> From: Frank Rowand <frank.rowand@am.sony.com>
Date: Mon, 19 Sep 2011 14:51:14 -0700 Date: Mon, 19 Sep 2011 14:51:14 -0700
Subject: arm: Convert arm boot_lock to raw Subject: arm: Convert arm boot_lock to raw
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The arm boot_lock is used by the secondary processor startup code. The locking The arm boot_lock is used by the secondary processor startup code. The locking
task is the idle thread, which has idle->sched_class == &idle_sched_class. task is the idle thread, which has idle->sched_class == &idle_sched_class.

View File

@ -1,7 +1,7 @@
Subject: arm: Enable highmem for rt Subject: arm: Enable highmem for rt
From: Thomas Gleixner <tglx@linutronix.de> From: Thomas Gleixner <tglx@linutronix.de>
Date: Wed, 13 Feb 2013 11:03:11 +0100 Date: Wed, 13 Feb 2013 11:03:11 +0100
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
fixup highmem for ARM. fixup highmem for ARM.

View File

@ -1,7 +1,7 @@
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: Mon, 11 Mar 2013 21:37:27 +0100 Date: Mon, 11 Mar 2013 21:37:27 +0100
Subject: arm/highmem: Flush tlb on unmap Subject: arm/highmem: Flush tlb on unmap
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14-rt1.tar.xz Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.1-rt3.tar.xz
The tlb should be flushed on unmap and thus make the mapping entry The tlb should be flushed on unmap and thus make the mapping entry
invalid. This is only done in the non-debug case which does not look invalid. This is only done in the non-debug case which does not look

Some files were not shown because too many files have changed in this diff Show More