public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Steven Rostedt <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: mingo@kernel.org, torvalds@linux-foundation.org,
	rostedt@goodmis.org, paulmck@linux.vnet.ibm.com,
	bigeasy@linutronix.de, hpa@zytor.com, akpm@linux-foundation.org,
	tglx@linutronix.de, bp@alien8.de, linux-kernel@vger.kernel.org,
	peterz@infradead.org
Subject: [tip:locking/urgent] locking/lockdep: Quiet GCC about dangerous __builtin_return_address() operations
Date: Thu, 6 Oct 2016 06:35:13 -0700	[thread overview]
Message-ID: <tip-9311a4c9f0d2d5404cd7bc2ba913c919418f83e2@git.kernel.org> (raw)
In-Reply-To: <20160908123433.2cf93b96@gandalf.local.home>

Commit-ID:  9311a4c9f0d2d5404cd7bc2ba913c919418f83e2
Gitweb:     http://git.kernel.org/tip/9311a4c9f0d2d5404cd7bc2ba913c919418f83e2
Author:     Steven Rostedt <rostedt@goodmis.org>
AuthorDate: Thu, 8 Sep 2016 12:34:33 -0400
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Thu, 6 Oct 2016 09:55:07 +0200

locking/lockdep: Quiet GCC about dangerous __builtin_return_address() operations

GCC's new warnings about __builtin_return_address(n) operations with
n > 0 is popping up around the kernel. The operation is dangerous, and
the warning is "good to know". But there's instances that we use
__builtin_return_address(n) with n > 0 and are aware of the issues,
and work around them. And its used mostly for tracing and debugging. In
these cases, the warning becomes a distraction and is not helpful.

To get better lock issue traces, a function like get_lock_parent_ip()
uses __builtin_return_address() to find the caller of the lock, and
skip over the internal callers of the lock itself. Currently it is only
used in the kernel/ directory and only if certain configs are enabled.

Create a new config called CONFIG_USING_GET_LOCK_PARENT_IP that gets
selected when another config relies on get_lock_parent_ip(), and this
will now enable the function get_lock_parent_ip(), otherwise it wont be
defined. It will also disable the frame-address warnings from GCC in
the kernel directory.

Reported-and-tested-by: Borislav Petkov <bp@alien8.de>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20160908123433.2cf93b96@gandalf.local.home
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 include/linux/ftrace.h |  2 ++
 kernel/Makefile        |  7 +++++++
 kernel/trace/Kconfig   |  1 +
 lib/Kconfig.debug      | 10 ++++++++++
 4 files changed, 20 insertions(+)

diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index 6f93ac4..1218b15 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -714,6 +714,7 @@ static inline void __ftrace_enabled_restore(int enabled)
 #define CALLER_ADDR5 ((unsigned long)ftrace_return_address(5))
 #define CALLER_ADDR6 ((unsigned long)ftrace_return_address(6))
 
+#ifdef CONFIG_USING_GET_LOCK_PARENT_IP
 static inline unsigned long get_lock_parent_ip(void)
 {
 	unsigned long addr = CALLER_ADDR0;
@@ -725,6 +726,7 @@ static inline unsigned long get_lock_parent_ip(void)
 		return addr;
 	return CALLER_ADDR2;
 }
+#endif
 
 #ifdef CONFIG_IRQSOFF_TRACER
   extern void time_hardirqs_on(unsigned long a0, unsigned long a1);
diff --git a/kernel/Makefile b/kernel/Makefile
index e2ec54e..bff8214 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -11,6 +11,13 @@ obj-y     = fork.o exec_domain.o panic.o \
 	    notifier.o ksysfs.o cred.o reboot.o \
 	    async.o range.o smpboot.o
 
+# Tracing may do some dangerous __builtin_return_address() operations
+# We know they are dangerous, we don't need gcc telling us that.
+ifdef CONFIG_USING_GET_LOCK_PARENT_IP
+FRAME_CFLAGS := $(call cc-disable-warning,frame-address)
+KBUILD_CFLAGS += $(FRAME_CFLAGS)
+endif
+
 obj-$(CONFIG_MULTIUSER) += groups.o
 
 ifdef CONFIG_FUNCTION_TRACER
diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
index ba33267..ecc0bbc 100644
--- a/kernel/trace/Kconfig
+++ b/kernel/trace/Kconfig
@@ -192,6 +192,7 @@ config PREEMPT_TRACER
 	select RING_BUFFER_ALLOW_SWAP
 	select TRACER_SNAPSHOT
 	select TRACER_SNAPSHOT_PER_CPU_SWAP
+	select USING_GET_LOCK_PARENT_IP
 	help
 	  This option measures the time spent in preemption-off critical
 	  sections, with microsecond accuracy.
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index cab7405..dbc49c4 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -977,6 +977,7 @@ config TIMER_STATS
 config DEBUG_PREEMPT
 	bool "Debug preemptible kernel"
 	depends on DEBUG_KERNEL && PREEMPT && TRACE_IRQFLAGS_SUPPORT
+	select USING_GET_LOCK_PARENT_IP
 	default y
 	help
 	  If you say Y here then the kernel will use a debug variant of the
@@ -1159,8 +1160,17 @@ config LOCK_TORTURE_TEST
 
 endmenu # lock debugging
 
+config USING_GET_LOCK_PARENT_IP
+        bool
+	help
+	  Enables the use of the function get_lock_parent_ip() that
+	  will use __builtin_return_address(n) with n > 0 causing
+	  some gcc warnings. When this is selected, those warnings
+	  will be suppressed.
+
 config TRACE_IRQFLAGS
 	bool
+	select USING_GET_LOCK_PARENT_IP
 	help
 	  Enables hooks to interrupt enabling and disabling for
 	  either tracing or lock debugging.

      parent reply	other threads:[~2016-10-06 13:36 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-08 16:34 [PATCH] lockdep: Quiet gcc about dangerous __builtin_return_address() operations Steven Rostedt
2016-09-08 18:33 ` Borislav Petkov
2016-09-08 18:38   ` Steven Rostedt
2016-09-15 13:54   ` Steven Rostedt
2016-09-15 14:08     ` Peter Zijlstra
2016-09-15 15:17       ` Steven Rostedt
2016-10-06 13:35 ` tip-bot for Steven Rostedt [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tip-9311a4c9f0d2d5404cd7bc2ba913c919418f83e2@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=akpm@linux-foundation.org \
    --cc=bigeasy@linutronix.de \
    --cc=bp@alien8.de \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox