Skip to contentSkip to conversation

Patch "arm64: kernel: pause/unpause function graph tracer in cpu_suspend()" has been added to the 4.1-stable tree

PATCH [email protected] 3 participants 6 messages Jan 27, 2016 – Mar 15, 2016

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

arm64: kernel: pause/unpause function graph tracer in cpu_suspend()

to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
arm64-kernel-pause-unpause-function-graph-tracer-in-cpu_suspend.patch
and it can be found in the queue-4.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From de818bd4522c40ea02a81b387d2fa86f989c9623 Mon Sep 17 00:00:00 2001

From: Lorenzo Pieralisi <[email protected]>
Date: Tue, 17 Nov 2015 11:50:51 +0000
Subject: arm64: kernel: pause/unpause function graph tracer in cpu_suspend()

From: Lorenzo Pieralisi <[email protected]>

commit de818bd4522c40ea02a81b387d2fa86f989c9623 upstream.

The function graph tracer adds instrumentation that is required to trace both entry and exit of a function. In particular the function graph tracer updates the "return address" of a function in order to insert a trace callback on function exit.

Kernel power management functions like cpu_suspend() are called upon power down entry with functions called "finishers" that are in turn called to trigger the power down sequence but they may not return to the kernel through the normal return path.

When the core resumes from low-power it returns to the cpu_suspend() function through the cpu_resume path, which leaves the trace stack frame set-up by the function tracer in an incosistent state upon return to the kernel when tracing is enabled.

This patch fixes the issue by pausing/resuming the function graph tracer on the thread executing cpu_suspend() (ie the function call that subsequently triggers the "suspend finishers"), so that the function graph tracer state is kept consistent across functions that enter power down states and never return by effectively disabling graph tracer while they are executing.

---
 arch/arm64/kernel/suspend.c |   10 ++++++++++
 1 file changed, 10 insertions(+)
arch/arm64/kernel/suspend.c +10 -0
@@ -1,3 +1,4 @@
+#include <linux/ftrace.h>
 #include <linux/percpu.h>
 #include <linux/slab.h>
 #include <asm/cacheflush.h>
@@ -71,6 +72,13 @@ int cpu_suspend(unsigned long arg, int (
 	local_dbg_save(flags);
 
 	/*
+	 * Function graph tracer state gets incosistent when the kernel
+	 * calls functions that never return (aka suspend finishers) hence
+	 * disable graph tracing during their execution.
+	 */
+	pause_graph_tracing();
+
+	/*
 	 * mm context saved on the stack, it will be restored when
 	 * the cpu comes out of reset through the identity mapped
 	 * page tables, so that the thread address space is properly
@@ -111,6 +119,8 @@ int cpu_suspend(unsigned long arg, int (
 			hw_breakpoint_restore(NULL);
 	}
 
+	unpause_graph_tracing();
+
 	/*
 	 * Restore pstate flags. OS lock and mdscr have been already
 	 * restored, so from this point onwards, debugging is fully

Patches currently in stable-queue which might be from [email protected] are

queue-4.1/arm64-kernel-pause-unpause-function-graph-tracer-in-cpu_suspend.patch

#1 lore raw

Hi Greg,

Quoted 8 lines · On Tue, Jan 26, 2016 at 10:54:50PM -0800, [email protected] wrote:

This is a note to let you know that I've just added the patch titled

arm64: kernel: pause/unpause function graph tracer in cpu_suspend()

to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

Quoted 6 lines

The filename of the patch is:
arm64-kernel-pause-unpause-function-graph-tracer-in-cpu_suspend.patch
and it can be found in the queue-4.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

We have just noticed this patch did not make it to 3.18 stable kernel even though it was marked for #3.16+, probably it has slipped through the cracks, please let us know what we can do to get it applied to the 3.18 stable tree.

Thanks !
Lorenzo

Quoted 83 lines

From de818bd4522c40ea02a81b387d2fa86f989c9623 Mon Sep 17 00:00:00 2001
From: Lorenzo Pieralisi <[email protected]>
Date: Tue, 17 Nov 2015 11:50:51 +0000
Subject: arm64: kernel: pause/unpause function graph tracer in cpu_suspend()

From: Lorenzo Pieralisi <[email protected]>

commit de818bd4522c40ea02a81b387d2fa86f989c9623 upstream.

The function graph tracer adds instrumentation that is required to trace both entry and exit of a function. In particular the function graph tracer updates the "return address" of a function in order to insert a trace callback on function exit.

Kernel power management functions like cpu_suspend() are called upon power down entry with functions called "finishers" that are in turn called to trigger the power down sequence but they may not return to the kernel through the normal return path.

When the core resumes from low-power it returns to the cpu_suspend() function through the cpu_resume path, which leaves the trace stack frame set-up by the function tracer in an incosistent state upon return to the kernel when tracing is enabled.

This patch fixes the issue by pausing/resuming the function graph tracer on the thread executing cpu_suspend() (ie the function call that subsequently triggers the "suspend finishers"), so that the function graph tracer state is kept consistent across functions that enter power down states and never return by effectively disabling graph tracer while they are executing.

---
 arch/arm64/kernel/suspend.c |   10 ++++++++++
 1 file changed, 10 insertions(+)
arch/arm64/kernel/suspend.c +10 -0
@@ -1,3 +1,4 @@
+#include <linux/ftrace.h>
 #include <linux/percpu.h>
 #include <linux/slab.h>
 #include <asm/cacheflush.h>
@@ -71,6 +72,13 @@ int cpu_suspend(unsigned long arg, int (
 	local_dbg_save(flags);
 
 	/*
+	 * Function graph tracer state gets incosistent when the kernel
+	 * calls functions that never return (aka suspend finishers) hence
+	 * disable graph tracing during their execution.
+	 */
+	pause_graph_tracing();
+
+	/*
 	 * mm context saved on the stack, it will be restored when
 	 * the cpu comes out of reset through the identity mapped
 	 * page tables, so that the thread address space is properly
@@ -111,6 +119,8 @@ int cpu_suspend(unsigned long arg, int (
 			hw_breakpoint_restore(NULL);
 	}
 
+	unpause_graph_tracing();
+
 	/*
 	 * Restore pstate flags. OS lock and mdscr have been already
 	 * restored, so from this point onwards, debugging is fully

Patches currently in stable-queue which might be from [email protected] are

queue-4.1/arm64-kernel-pause-unpause-function-graph-tracer-in-cpu_suspend.patch

#2 lore raw
Quoted 15 lines · On Tue, 15 Mar 2016 14:08:19 +0000 Lorenzo Pieralisi…

Hi Greg,

Quoted 12 lines · On Tue, Jan 26, 2016 at 10:54:50PM -0800, [email protected] wrote:

This is a note to let you know that I've just added the patch titled

arm64: kernel: pause/unpause function graph tracer in cpu_suspend()

to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
arm64-kernel-pause-unpause-function-graph-tracer-in-cpu_suspend.patch
and it can be found in the queue-4.1 subdirectory.

Quoted 8 lines
Quoted 2 lines

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

We have just noticed this patch did not make it to 3.18 stable kernel even though it was marked for #3.16+, probably it has slipped through the cracks, please let us know what we can do to get it applied to the 3.18 stable tree.

Does it apply without conflicts or break the build?

-- Steve

#3 lore raw
Quoted 21 lines · Steven Rostedt
Quoted 18 lines · On Tue, 15 Mar 2016 14:08:19 +0000 Lorenzo Pieralisi…

Hi Greg,

Quoted 14 lines · On Tue, Jan 26, 2016 at 10:54:50PM -0800, [email protected] wrote:

This is a note to let you know that I've just added the patch titled

arm64: kernel: pause/unpause function graph tracer in cpu_suspend()

to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
arm64-kernel-pause-unpause-function-graph-tracer-in-cpu_suspend.patch
and it can be found in the queue-4.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 7 lines
Quoted 5 lines

We have just noticed this patch did not make it to 3.18 stable kernel even though it was marked for #3.16+, probably it has slipped through the cracks, please let us know what we can do to get it applied to the 3.18 stable tree.

Does it apply without conflicts or break the build?

I checked when I marked it for stable 3.16+ but to make sure everything is fine I have just rechecked against 3.18.28, it applies cleanly and does not break the build so I hope it can be considered for inclusion.

Thanks,
Lorenzo

author maintainer
#4 lore raw
In reply to Lorenzo Pieralisi
Quoted 15 lines · Lorenzo Pieralisi

Hi Greg,

Quoted 12 lines · On Tue, Jan 26, 2016 at 10:54:50PM -0800, [email protected] wrote:

This is a note to let you know that I've just added the patch titled

arm64: kernel: pause/unpause function graph tracer in cpu_suspend()

to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
arm64-kernel-pause-unpause-function-graph-tracer-in-cpu_suspend.patch
and it can be found in the queue-4.1 subdirectory.

Quoted 7 lines
Quoted 2 lines

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

We have just noticed this patch did not make it to 3.18 stable kernel even though it was marked for #3.16+, probably it has slipped through the cracks, please let us know what we can do to get it applied to the 3.18 stable tree.

Why ask me, I'm not in charge of the 3.18 stable tree?

Hint, use https://www.kernel.org/category/releases.html in the future...

And do people really even use 3.18 for arm64 these days?

thanks,

greg k-h

#5 lore raw
Quoted 19 lines · Greg KH
Quoted 18 lines · Lorenzo Pieralisi

Hi Greg,

Quoted 14 lines · On Tue, Jan 26, 2016 at 10:54:50PM -0800, [email protected] wrote:

This is a note to let you know that I've just added the patch titled

arm64: kernel: pause/unpause function graph tracer in cpu_suspend()

to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
arm64-kernel-pause-unpause-function-graph-tracer-in-cpu_suspend.patch
and it can be found in the queue-4.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 8 lines
Quoted 4 lines

We have just noticed this patch did not make it to 3.18 stable kernel even though it was marked for #3.16+, probably it has slipped through the cracks, please let us know what we can do to get it applied to the 3.18 stable tree.

Why ask me, I'm not in charge of the 3.18 stable tree?

Hint, use https://www.kernel.org/category/releases.html in the future...

Ok, sorry for the noise, I will ask Sasha then, I just reused the 4.1 notification to enquire, wrongly.

Quoted 1 line

And do people really even use 3.18 for arm64 these days?

Yes, that's why I am asking for inclusion, we can debate whether that's what they should do if I had an option to prevent that.

Thanks,
Lorenzo