linux-toolchains.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO
@ 2021-06-21 23:18 Nick Desaulniers
  2021-06-21 23:18 ` [PATCH v2 1/3] compiler_attributes.h: define __no_profile, add to noinstr Nick Desaulniers
                   ` (5 more replies)
  0 siblings, 6 replies; 18+ messages in thread
From: Nick Desaulniers @ 2021-06-21 23:18 UTC (permalink / raw)
  To: Kees Cook
  Cc: Peter Zijlstra, Bill Wendling, Sami Tolvanen,
	Peter Oberparleiter, Masahiro Yamada, Miguel Ojeda,
	Nathan Chancellor, Luc Van Oostenryck, Ard Biesheuvel,
	Will Deacon, Arnd Bergmann, Andrew Morton, Rasmus Villemoes,
	linux-kernel, clang-built-linux, x86, Borislav Petkov,
	Martin Liska, Marco Elver, Jonathan Corbet, Fangrui Song,
	linux-doc, linux-kbuild, Dmitry Vyukov, johannes.berg,
	linux-toolchains, Heiko Carstens, Vasily Gorbik,
	Christian Borntraeger, linux-s390, linux-arm-kernel,
	Catalin Marinas, Nick Desaulniers

The kernel has been using noinstr for correctness to politely request
that the compiler avoid adding various forms of instrumentation to
certain functions.

GCOV and PGO can both instrument functions, yet the function attribute
to disable such instrumentation (no_profile_instrument_function) was not
being used to suppress such implementation. Also, clang only just
recently gained support for no_profile_instrument_function. GCC has
supported that since 7.1+.

Add a new function annotation __no_profile that expands to
__attribute__((__no_profile_instrument_function__)) and Kconfig values
CC_HAS_NO_PROFILE_FN_ATTR and ARCH_WANTS_NO_INSTR. Make GCOV and PGO
depend on either !ARCH_WANTS_NO_INSTR or CC_HAS_NO_PROFILE_FN_ATTR.

Changes V1 -> V2:
* s/no_profile/no_profile_instrument_function/
* fix trailing double underscore on GCC 4 define, as per Fangrui+Miguel.
* Pick up Fangrui + Miguel's reviewed-by tag.
* Add link to GCC's doc.
* Fix clang's doc format; will appear once clang-13 is released.
* New cleanup patch 2/3. Orthogonal to the series, but while I'm here...

Base is
https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git/log/?h=for-next/clang/pgo.

Nick Desaulniers (3):
  compiler_attributes.h: define __no_profile, add to noinstr
  compiler_attributes.h: cleanups for GCC 4.9+
  Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on
    for GCOV and PGO

 arch/Kconfig                        |  7 +++++++
 arch/arm64/Kconfig                  |  1 +
 arch/s390/Kconfig                   |  1 +
 arch/x86/Kconfig                    |  1 +
 include/linux/compiler_attributes.h | 19 ++++++++++++++++---
 include/linux/compiler_types.h      |  2 +-
 init/Kconfig                        |  3 +++
 kernel/gcov/Kconfig                 |  1 +
 kernel/pgo/Kconfig                  |  3 ++-
 9 files changed, 33 insertions(+), 5 deletions(-)


base-commit: 4356bc4c0425c81e204f561acf4dd0095544a6cb
-- 
2.32.0.288.g62a8d224e6-goog


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH v2 1/3] compiler_attributes.h: define __no_profile, add to noinstr
  2021-06-21 23:18 [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO Nick Desaulniers
@ 2021-06-21 23:18 ` Nick Desaulniers
  2021-06-21 23:41   ` Nathan Chancellor
  2021-06-21 23:18 ` [PATCH v2 2/3] compiler_attributes.h: cleanups for GCC 4.9+ Nick Desaulniers
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 18+ messages in thread
From: Nick Desaulniers @ 2021-06-21 23:18 UTC (permalink / raw)
  To: Kees Cook
  Cc: Peter Zijlstra, Bill Wendling, Sami Tolvanen,
	Peter Oberparleiter, Masahiro Yamada, Miguel Ojeda,
	Nathan Chancellor, Luc Van Oostenryck, Ard Biesheuvel,
	Will Deacon, Arnd Bergmann, Andrew Morton, Rasmus Villemoes,
	linux-kernel, clang-built-linux, x86, Borislav Petkov,
	Martin Liska, Marco Elver, Jonathan Corbet, Fangrui Song,
	linux-doc, linux-kbuild, Dmitry Vyukov, johannes.berg,
	linux-toolchains, Heiko Carstens, Vasily Gorbik,
	Christian Borntraeger, linux-s390, linux-arm-kernel,
	Catalin Marinas, Nick Desaulniers, Miguel Ojeda

noinstr implies that we would like the compiler to avoid instrumenting a
function.  Add support for the compiler attribute
no_profile_instrument_function to compiler_attributes.h, then add
__no_profile to the definition of noinstr.

Link: https://lore.kernel.org/lkml/20210614162018.GD68749@worktop.programming.kicks-ass.net/
Link: https://reviews.llvm.org/D104257
Link: https://reviews.llvm.org/D104475
Link: https://reviews.llvm.org/D104658
Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80223
Reviewed-by: Fangrui Song <maskray@google.com>
Reviewed-by: Miguel Ojeda <ojeda@kernel.org>
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
---
Changes V1 -> V2:
* s/no_profile/no_profile_instrument_function/
* fix trailing double underscore on GCC 4 define, as per Fangrui+Miguel.
* Pick up Fangrui + Miguel's reviewed-by tag.
* Add link to GCC's doc.
* Fix clang's doc format; will appear once clang-13 is released.

 include/linux/compiler_attributes.h | 13 +++++++++++++
 include/linux/compiler_types.h      |  2 +-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/include/linux/compiler_attributes.h b/include/linux/compiler_attributes.h
index c043b8d2b17b..225511b17223 100644
--- a/include/linux/compiler_attributes.h
+++ b/include/linux/compiler_attributes.h
@@ -33,6 +33,7 @@
 # define __GCC4_has_attribute___externally_visible__  1
 # define __GCC4_has_attribute___no_caller_saved_registers__ 0
 # define __GCC4_has_attribute___noclone__             1
+# define __GCC4_has_attribute___no_profile_instrument_function__ 0
 # define __GCC4_has_attribute___nonstring__           0
 # define __GCC4_has_attribute___no_sanitize_address__ (__GNUC_MINOR__ >= 8)
 # define __GCC4_has_attribute___no_sanitize_undefined__ (__GNUC_MINOR__ >= 9)
@@ -237,6 +238,18 @@
 # define __nonstring
 #endif
 
+/*
+ * Optional: only supported since GCC >= 7.1, clang >= 13.0.
+ *
+ *      gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-no_005fprofile_005finstrument_005ffunction-function-attribute
+ *    clang: https://clang.llvm.org/docs/AttributeReference.html#no-profile-instrument-function
+ */
+#if __has_attribute(__no_profile_instrument_function__)
+# define __no_profile                  __attribute__((__no_profile_instrument_function__))
+#else
+# define __no_profile
+#endif
+
 /*
  *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noreturn-function-attribute
  * clang: https://clang.llvm.org/docs/AttributeReference.html#noreturn
diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
index d29bda7f6ebd..d509169860f1 100644
--- a/include/linux/compiler_types.h
+++ b/include/linux/compiler_types.h
@@ -210,7 +210,7 @@ struct ftrace_likely_data {
 /* Section for code which can't be instrumented at all */
 #define noinstr								\
 	noinline notrace __attribute((__section__(".noinstr.text")))	\
-	__no_kcsan __no_sanitize_address
+	__no_kcsan __no_sanitize_address __no_profile
 
 #endif /* __KERNEL__ */
 
-- 
2.32.0.288.g62a8d224e6-goog


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH v2 2/3] compiler_attributes.h: cleanups for GCC 4.9+
  2021-06-21 23:18 [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO Nick Desaulniers
  2021-06-21 23:18 ` [PATCH v2 1/3] compiler_attributes.h: define __no_profile, add to noinstr Nick Desaulniers
@ 2021-06-21 23:18 ` Nick Desaulniers
  2021-06-21 23:31   ` Miguel Ojeda
  2021-06-21 23:42   ` Nathan Chancellor
  2021-06-21 23:18 ` [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO Nick Desaulniers
                   ` (3 subsequent siblings)
  5 siblings, 2 replies; 18+ messages in thread
From: Nick Desaulniers @ 2021-06-21 23:18 UTC (permalink / raw)
  To: Kees Cook
  Cc: Peter Zijlstra, Bill Wendling, Sami Tolvanen,
	Peter Oberparleiter, Masahiro Yamada, Miguel Ojeda,
	Nathan Chancellor, Luc Van Oostenryck, Ard Biesheuvel,
	Will Deacon, Arnd Bergmann, Andrew Morton, Rasmus Villemoes,
	linux-kernel, clang-built-linux, x86, Borislav Petkov,
	Martin Liska, Marco Elver, Jonathan Corbet, Fangrui Song,
	linux-doc, linux-kbuild, Dmitry Vyukov, johannes.berg,
	linux-toolchains, Heiko Carstens, Vasily Gorbik,
	Christian Borntraeger, linux-s390, linux-arm-kernel,
	Catalin Marinas, Nick Desaulniers, Miguel Ojeda

Since
commit 6ec4476ac825 ("Raise gcc version requirement to 4.9")
we no longer support building the kernel with GCC 4.8; drop the
preprocess checks for __GNUC_MINOR__ version. It's implied that if
__GNUC_MAJOR__ is 4, then the only supported version of __GNUC_MINOR__
left is 9.

Cc: Miguel Ojeda <ojeda@kernel.org>
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
---
 include/linux/compiler_attributes.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/include/linux/compiler_attributes.h b/include/linux/compiler_attributes.h
index 225511b17223..84b1c970acb3 100644
--- a/include/linux/compiler_attributes.h
+++ b/include/linux/compiler_attributes.h
@@ -27,7 +27,7 @@
  */
 #ifndef __has_attribute
 # define __has_attribute(x) __GCC4_has_attribute_##x
-# define __GCC4_has_attribute___assume_aligned__      (__GNUC_MINOR__ >= 9)
+# define __GCC4_has_attribute___assume_aligned__      1
 # define __GCC4_has_attribute___copy__                0
 # define __GCC4_has_attribute___designated_init__     0
 # define __GCC4_has_attribute___externally_visible__  1
@@ -35,8 +35,8 @@
 # define __GCC4_has_attribute___noclone__             1
 # define __GCC4_has_attribute___no_profile_instrument_function__ 0
 # define __GCC4_has_attribute___nonstring__           0
-# define __GCC4_has_attribute___no_sanitize_address__ (__GNUC_MINOR__ >= 8)
-# define __GCC4_has_attribute___no_sanitize_undefined__ (__GNUC_MINOR__ >= 9)
+# define __GCC4_has_attribute___no_sanitize_address__ 1
+# define __GCC4_has_attribute___no_sanitize_undefined__ 1
 # define __GCC4_has_attribute___fallthrough__         0
 #endif
 
-- 
2.32.0.288.g62a8d224e6-goog


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO
  2021-06-21 23:18 [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO Nick Desaulniers
  2021-06-21 23:18 ` [PATCH v2 1/3] compiler_attributes.h: define __no_profile, add to noinstr Nick Desaulniers
  2021-06-21 23:18 ` [PATCH v2 2/3] compiler_attributes.h: cleanups for GCC 4.9+ Nick Desaulniers
@ 2021-06-21 23:18 ` Nick Desaulniers
  2021-06-21 23:45   ` Nathan Chancellor
                     ` (4 more replies)
  2021-06-22  7:25 ` [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO Peter Zijlstra
                   ` (2 subsequent siblings)
  5 siblings, 5 replies; 18+ messages in thread
From: Nick Desaulniers @ 2021-06-21 23:18 UTC (permalink / raw)
  To: Kees Cook
  Cc: Peter Zijlstra, Bill Wendling, Sami Tolvanen,
	Peter Oberparleiter, Masahiro Yamada, Miguel Ojeda,
	Nathan Chancellor, Luc Van Oostenryck, Ard Biesheuvel,
	Will Deacon, Arnd Bergmann, Andrew Morton, Rasmus Villemoes,
	linux-kernel, clang-built-linux, x86, Borislav Petkov,
	Martin Liska, Marco Elver, Jonathan Corbet, Fangrui Song,
	linux-doc, linux-kbuild, Dmitry Vyukov, johannes.berg,
	linux-toolchains, Heiko Carstens, Vasily Gorbik,
	Christian Borntraeger, linux-s390, linux-arm-kernel,
	Catalin Marinas, Nick Desaulniers

We don't want compiler instrumentation to touch noinstr functions, which
are annotated with the no_profile_instrument_function function
attribute. Add a Kconfig test for this and make PGO and GCOV depend on
it.

If an architecture is using noinstr, it should denote that via this
Kconfig value. That makes Kconfigs that depend on noinstr able to
express dependencies in an architecturally agnostic way.

Cc: Masahiro Yamada <masahiroy@kernel.org>
Cc: Peter Oberparleiter <oberpar@linux.ibm.com>
Link: https://lore.kernel.org/lkml/YMTn9yjuemKFLbws@hirez.programming.kicks-ass.net/
Link: https://lore.kernel.org/lkml/YMcssV%2Fn5IBGv4f0@hirez.programming.kicks-ass.net/
Suggested-by: Nathan Chancellor <nathan@kernel.org>
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
---
Changes V1 -> V2:
* Add ARCH_WANTS_NO_INSTR
* Change depdendencies to be !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
  rather than list architectures explicitly, as per Nathan.
* s/no_profile/no_profile_instrument_function/

 arch/Kconfig        | 7 +++++++
 arch/arm64/Kconfig  | 1 +
 arch/s390/Kconfig   | 1 +
 arch/x86/Kconfig    | 1 +
 init/Kconfig        | 3 +++
 kernel/gcov/Kconfig | 1 +
 kernel/pgo/Kconfig  | 3 ++-
 7 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/arch/Kconfig b/arch/Kconfig
index 2b4109b0edee..2113c6b3b801 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -285,6 +285,13 @@ config ARCH_THREAD_STACK_ALLOCATOR
 config ARCH_WANTS_DYNAMIC_TASK_STRUCT
 	bool
 
+config ARCH_WANTS_NO_INSTR
+	bool
+	help
+	  An architecure should select this if the noinstr macro is being used on
+	  functions to denote that the toolchain should avoid instrumenting such
+	  functions and is required for correctness.
+
 config ARCH_32BIT_OFF_T
 	bool
 	depends on !64BIT
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 9f1d8566bbf9..39bf982b06f8 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -93,6 +93,7 @@ config ARM64
 	select ARCH_WANT_FRAME_POINTERS
 	select ARCH_WANT_HUGE_PMD_SHARE if ARM64_4K_PAGES || (ARM64_16K_PAGES && !ARM64_VA_BITS_36)
 	select ARCH_WANT_LD_ORPHAN_WARN
+	select ARCH_WANTS_NO_INSTR
 	select ARCH_HAS_UBSAN_SANITIZE_ALL
 	select ARM_AMBA
 	select ARM_ARCH_TIMER
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
index b4c7c34069f8..bd60310f33b9 100644
--- a/arch/s390/Kconfig
+++ b/arch/s390/Kconfig
@@ -117,6 +117,7 @@ config S390
 	select ARCH_USE_BUILTIN_BSWAP
 	select ARCH_USE_CMPXCHG_LOCKREF
 	select ARCH_WANTS_DYNAMIC_TASK_STRUCT
+	select ARCH_WANTS_NO_INSTR
 	select ARCH_WANT_DEFAULT_BPF_JIT
 	select ARCH_WANT_IPC_PARSE_VERSION
 	select BUILDTIME_TABLE_SORT
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index da43fd046149..7d6a44bb9b0e 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -114,6 +114,7 @@ config X86
 	select ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH
 	select ARCH_WANT_DEFAULT_BPF_JIT	if X86_64
 	select ARCH_WANTS_DYNAMIC_TASK_STRUCT
+	select ARCH_WANTS_NO_INSTR
 	select ARCH_WANT_HUGE_PMD_SHARE
 	select ARCH_WANT_LD_ORPHAN_WARN
 	select ARCH_WANTS_THP_SWAP		if X86_64
diff --git a/init/Kconfig b/init/Kconfig
index 1ea12c64e4c9..31397a7a45fb 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -83,6 +83,9 @@ config TOOLS_SUPPORT_RELR
 config CC_HAS_ASM_INLINE
 	def_bool $(success,echo 'void foo(void) { asm inline (""); }' | $(CC) -x c - -c -o /dev/null)
 
+config CC_HAS_NO_PROFILE_FN_ATTR
+	def_bool $(success,echo '__attribute__((no_profile_instrument_function)) int x();' | $(CC) -x c - -c -o /dev/null -Werror)
+
 config CONSTRUCTORS
 	bool
 
diff --git a/kernel/gcov/Kconfig b/kernel/gcov/Kconfig
index 58f87a3092f3..053447183ac5 100644
--- a/kernel/gcov/Kconfig
+++ b/kernel/gcov/Kconfig
@@ -5,6 +5,7 @@ config GCOV_KERNEL
 	bool "Enable gcov-based kernel profiling"
 	depends on DEBUG_FS
 	depends on !CC_IS_CLANG || CLANG_VERSION >= 110000
+	depends on !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
 	select CONSTRUCTORS
 	default n
 	help
diff --git a/kernel/pgo/Kconfig b/kernel/pgo/Kconfig
index d2053df1111c..ce7fe04f303d 100644
--- a/kernel/pgo/Kconfig
+++ b/kernel/pgo/Kconfig
@@ -8,7 +8,8 @@ config PGO_CLANG
 	bool "Enable clang's PGO-based kernel profiling"
 	depends on DEBUG_FS
 	depends on ARCH_SUPPORTS_PGO_CLANG
-	depends on CC_IS_CLANG && CLANG_VERSION >= 120000
+	depends on CC_IS_CLANG
+	depends on !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
 	help
 	  This option enables clang's PGO (Profile Guided Optimization) based
 	  code profiling to better optimize the kernel.
-- 
2.32.0.288.g62a8d224e6-goog


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 2/3] compiler_attributes.h: cleanups for GCC 4.9+
  2021-06-21 23:18 ` [PATCH v2 2/3] compiler_attributes.h: cleanups for GCC 4.9+ Nick Desaulniers
@ 2021-06-21 23:31   ` Miguel Ojeda
  2021-06-21 23:42   ` Nathan Chancellor
  1 sibling, 0 replies; 18+ messages in thread
From: Miguel Ojeda @ 2021-06-21 23:31 UTC (permalink / raw)
  To: Nick Desaulniers
  Cc: Kees Cook, Peter Zijlstra, Bill Wendling, Sami Tolvanen,
	Peter Oberparleiter, Masahiro Yamada, Nathan Chancellor,
	Luc Van Oostenryck, Ard Biesheuvel, Will Deacon, Arnd Bergmann,
	Andrew Morton, Rasmus Villemoes, linux-kernel, clang-built-linux,
	maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT),
	Borislav Petkov, Martin Liska, Marco Elver, Jonathan Corbet,
	Fangrui Song, Linux Doc Mailing List, Linux Kbuild mailing list,
	Dmitry Vyukov, Johannes Berg, linux-toolchains, Heiko Carstens,
	Vasily Gorbik, Christian Borntraeger, linux-s390, Linux ARM,
	Catalin Marinas, Miguel Ojeda

On Tue, Jun 22, 2021 at 1:18 AM Nick Desaulniers
<ndesaulniers@google.com> wrote:
>
> Since
> commit 6ec4476ac825 ("Raise gcc version requirement to 4.9")
> we no longer support building the kernel with GCC 4.8; drop the
> preprocess checks for __GNUC_MINOR__ version. It's implied that if
> __GNUC_MAJOR__ is 4, then the only supported version of __GNUC_MINOR__
> left is 9.

Yeah, I was waiting for the raise to 5.x to remove the entire block,
but this is of course good since we did not get that yet :-)

    Reviewed-by: Miguel Ojeda <ojeda@kernel.org>

Cheers,
Miguel

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 1/3] compiler_attributes.h: define __no_profile, add to noinstr
  2021-06-21 23:18 ` [PATCH v2 1/3] compiler_attributes.h: define __no_profile, add to noinstr Nick Desaulniers
@ 2021-06-21 23:41   ` Nathan Chancellor
  0 siblings, 0 replies; 18+ messages in thread
From: Nathan Chancellor @ 2021-06-21 23:41 UTC (permalink / raw)
  To: Nick Desaulniers, Kees Cook
  Cc: Peter Zijlstra, Bill Wendling, Sami Tolvanen,
	Peter Oberparleiter, Masahiro Yamada, Miguel Ojeda,
	Luc Van Oostenryck, Ard Biesheuvel, Will Deacon, Arnd Bergmann,
	Andrew Morton, Rasmus Villemoes, linux-kernel, clang-built-linux,
	x86, Borislav Petkov, Martin Liska, Marco Elver, Jonathan Corbet,
	Fangrui Song, linux-doc, linux-kbuild, Dmitry Vyukov,
	johannes.berg, linux-toolchains, Heiko Carstens, Vasily Gorbik,
	Christian Borntraeger, linux-s390, linux-arm-kernel,
	Catalin Marinas, Miguel Ojeda

On 6/21/2021 4:18 PM, 'Nick Desaulniers' via Clang Built Linux wrote:
> noinstr implies that we would like the compiler to avoid instrumenting a
> function.  Add support for the compiler attribute
> no_profile_instrument_function to compiler_attributes.h, then add
> __no_profile to the definition of noinstr.
> 
> Link: https://lore.kernel.org/lkml/20210614162018.GD68749@worktop.programming.kicks-ass.net/
> Link: https://reviews.llvm.org/D104257
> Link: https://reviews.llvm.org/D104475
> Link: https://reviews.llvm.org/D104658
> Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80223
> Reviewed-by: Fangrui Song <maskray@google.com>
> Reviewed-by: Miguel Ojeda <ojeda@kernel.org>
> Suggested-by: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>

Reviewed-by: Nathan Chancellor <nathan@kernel.org>

> ---
> Changes V1 -> V2:
> * s/no_profile/no_profile_instrument_function/
> * fix trailing double underscore on GCC 4 define, as per Fangrui+Miguel.
> * Pick up Fangrui + Miguel's reviewed-by tag.
> * Add link to GCC's doc.
> * Fix clang's doc format; will appear once clang-13 is released.
> 
>   include/linux/compiler_attributes.h | 13 +++++++++++++
>   include/linux/compiler_types.h      |  2 +-
>   2 files changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/include/linux/compiler_attributes.h b/include/linux/compiler_attributes.h
> index c043b8d2b17b..225511b17223 100644
> --- a/include/linux/compiler_attributes.h
> +++ b/include/linux/compiler_attributes.h
> @@ -33,6 +33,7 @@
>   # define __GCC4_has_attribute___externally_visible__  1
>   # define __GCC4_has_attribute___no_caller_saved_registers__ 0
>   # define __GCC4_has_attribute___noclone__             1
> +# define __GCC4_has_attribute___no_profile_instrument_function__ 0
>   # define __GCC4_has_attribute___nonstring__           0
>   # define __GCC4_has_attribute___no_sanitize_address__ (__GNUC_MINOR__ >= 8)
>   # define __GCC4_has_attribute___no_sanitize_undefined__ (__GNUC_MINOR__ >= 9)
> @@ -237,6 +238,18 @@
>   # define __nonstring
>   #endif
>   
> +/*
> + * Optional: only supported since GCC >= 7.1, clang >= 13.0.
> + *
> + *      gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-no_005fprofile_005finstrument_005ffunction-function-attribute
> + *    clang: https://clang.llvm.org/docs/AttributeReference.html#no-profile-instrument-function
> + */
> +#if __has_attribute(__no_profile_instrument_function__)
> +# define __no_profile                  __attribute__((__no_profile_instrument_function__))
> +#else
> +# define __no_profile
> +#endif
> +
>   /*
>    *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noreturn-function-attribute
>    * clang: https://clang.llvm.org/docs/AttributeReference.html#noreturn
> diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
> index d29bda7f6ebd..d509169860f1 100644
> --- a/include/linux/compiler_types.h
> +++ b/include/linux/compiler_types.h
> @@ -210,7 +210,7 @@ struct ftrace_likely_data {
>   /* Section for code which can't be instrumented at all */
>   #define noinstr								\
>   	noinline notrace __attribute((__section__(".noinstr.text")))	\
> -	__no_kcsan __no_sanitize_address
> +	__no_kcsan __no_sanitize_address __no_profile
>   
>   #endif /* __KERNEL__ */
>   
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 2/3] compiler_attributes.h: cleanups for GCC 4.9+
  2021-06-21 23:18 ` [PATCH v2 2/3] compiler_attributes.h: cleanups for GCC 4.9+ Nick Desaulniers
  2021-06-21 23:31   ` Miguel Ojeda
@ 2021-06-21 23:42   ` Nathan Chancellor
  1 sibling, 0 replies; 18+ messages in thread
From: Nathan Chancellor @ 2021-06-21 23:42 UTC (permalink / raw)
  To: Nick Desaulniers, Kees Cook
  Cc: Peter Zijlstra, Bill Wendling, Sami Tolvanen,
	Peter Oberparleiter, Masahiro Yamada, Miguel Ojeda,
	Luc Van Oostenryck, Ard Biesheuvel, Will Deacon, Arnd Bergmann,
	Andrew Morton, Rasmus Villemoes, linux-kernel, clang-built-linux,
	x86, Borislav Petkov, Martin Liska, Marco Elver, Jonathan Corbet,
	Fangrui Song, linux-doc, linux-kbuild, Dmitry Vyukov,
	johannes.berg, linux-toolchains, Heiko Carstens, Vasily Gorbik,
	Christian Borntraeger, linux-s390, linux-arm-kernel,
	Catalin Marinas, Miguel Ojeda

On 6/21/2021 4:18 PM, 'Nick Desaulniers' via Clang Built Linux wrote:
> Since
> commit 6ec4476ac825 ("Raise gcc version requirement to 4.9")
> we no longer support building the kernel with GCC 4.8; drop the
> preprocess checks for __GNUC_MINOR__ version. It's implied that if
> __GNUC_MAJOR__ is 4, then the only supported version of __GNUC_MINOR__
> left is 9.
> 
> Cc: Miguel Ojeda <ojeda@kernel.org>
> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>

Reviewed-by: Nathan Chancellor <nathan@kernel.org>

> ---
>   include/linux/compiler_attributes.h | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/include/linux/compiler_attributes.h b/include/linux/compiler_attributes.h
> index 225511b17223..84b1c970acb3 100644
> --- a/include/linux/compiler_attributes.h
> +++ b/include/linux/compiler_attributes.h
> @@ -27,7 +27,7 @@
>    */
>   #ifndef __has_attribute
>   # define __has_attribute(x) __GCC4_has_attribute_##x
> -# define __GCC4_has_attribute___assume_aligned__      (__GNUC_MINOR__ >= 9)
> +# define __GCC4_has_attribute___assume_aligned__      1
>   # define __GCC4_has_attribute___copy__                0
>   # define __GCC4_has_attribute___designated_init__     0
>   # define __GCC4_has_attribute___externally_visible__  1
> @@ -35,8 +35,8 @@
>   # define __GCC4_has_attribute___noclone__             1
>   # define __GCC4_has_attribute___no_profile_instrument_function__ 0
>   # define __GCC4_has_attribute___nonstring__           0
> -# define __GCC4_has_attribute___no_sanitize_address__ (__GNUC_MINOR__ >= 8)
> -# define __GCC4_has_attribute___no_sanitize_undefined__ (__GNUC_MINOR__ >= 9)
> +# define __GCC4_has_attribute___no_sanitize_address__ 1
> +# define __GCC4_has_attribute___no_sanitize_undefined__ 1
>   # define __GCC4_has_attribute___fallthrough__         0
>   #endif
>   
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO
  2021-06-21 23:18 ` [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO Nick Desaulniers
@ 2021-06-21 23:45   ` Nathan Chancellor
  2021-06-22  7:25   ` Peter Zijlstra
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 18+ messages in thread
From: Nathan Chancellor @ 2021-06-21 23:45 UTC (permalink / raw)
  To: Nick Desaulniers, Kees Cook
  Cc: Peter Zijlstra, Bill Wendling, Sami Tolvanen,
	Peter Oberparleiter, Masahiro Yamada, Miguel Ojeda,
	Luc Van Oostenryck, Ard Biesheuvel, Will Deacon, Arnd Bergmann,
	Andrew Morton, Rasmus Villemoes, linux-kernel, clang-built-linux,
	x86, Borislav Petkov, Martin Liska, Marco Elver, Jonathan Corbet,
	Fangrui Song, linux-doc, linux-kbuild, Dmitry Vyukov,
	johannes.berg, linux-toolchains, Heiko Carstens, Vasily Gorbik,
	Christian Borntraeger, linux-s390, linux-arm-kernel,
	Catalin Marinas



On 6/21/2021 4:18 PM, 'Nick Desaulniers' via Clang Built Linux wrote:
> We don't want compiler instrumentation to touch noinstr functions, which
> are annotated with the no_profile_instrument_function function
> attribute. Add a Kconfig test for this and make PGO and GCOV depend on
> it.
> 
> If an architecture is using noinstr, it should denote that via this
> Kconfig value. That makes Kconfigs that depend on noinstr able to
> express dependencies in an architecturally agnostic way.
> 
> Cc: Masahiro Yamada <masahiroy@kernel.org>
> Cc: Peter Oberparleiter <oberpar@linux.ibm.com>
> Link: https://lore.kernel.org/lkml/YMTn9yjuemKFLbws@hirez.programming.kicks-ass.net/
> Link: https://lore.kernel.org/lkml/YMcssV%2Fn5IBGv4f0@hirez.programming.kicks-ass.net/
> Suggested-by: Nathan Chancellor <nathan@kernel.org>
> Suggested-by: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>

Reviewed-by: Nathan Chancellor <nathan@kernel.org>

Small nit below.

> ---
> Changes V1 -> V2:
> * Add ARCH_WANTS_NO_INSTR
> * Change depdendencies to be !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
>    rather than list architectures explicitly, as per Nathan.
> * s/no_profile/no_profile_instrument_function/
> 
>   arch/Kconfig        | 7 +++++++
>   arch/arm64/Kconfig  | 1 +
>   arch/s390/Kconfig   | 1 +
>   arch/x86/Kconfig    | 1 +
>   init/Kconfig        | 3 +++
>   kernel/gcov/Kconfig | 1 +
>   kernel/pgo/Kconfig  | 3 ++-
>   7 files changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/Kconfig b/arch/Kconfig
> index 2b4109b0edee..2113c6b3b801 100644
> --- a/arch/Kconfig
> +++ b/arch/Kconfig
> @@ -285,6 +285,13 @@ config ARCH_THREAD_STACK_ALLOCATOR
>   config ARCH_WANTS_DYNAMIC_TASK_STRUCT
>   	bool
>   
> +config ARCH_WANTS_NO_INSTR
> +	bool
> +	help
> +	  An architecure should select this if the noinstr macro is being used on

Architecture

> +	  functions to denote that the toolchain should avoid instrumenting such
> +	  functions and is required for correctness.
> +
>   config ARCH_32BIT_OFF_T
>   	bool
>   	depends on !64BIT
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 9f1d8566bbf9..39bf982b06f8 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -93,6 +93,7 @@ config ARM64
>   	select ARCH_WANT_FRAME_POINTERS
>   	select ARCH_WANT_HUGE_PMD_SHARE if ARM64_4K_PAGES || (ARM64_16K_PAGES && !ARM64_VA_BITS_36)
>   	select ARCH_WANT_LD_ORPHAN_WARN
> +	select ARCH_WANTS_NO_INSTR
>   	select ARCH_HAS_UBSAN_SANITIZE_ALL
>   	select ARM_AMBA
>   	select ARM_ARCH_TIMER
> diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
> index b4c7c34069f8..bd60310f33b9 100644
> --- a/arch/s390/Kconfig
> +++ b/arch/s390/Kconfig
> @@ -117,6 +117,7 @@ config S390
>   	select ARCH_USE_BUILTIN_BSWAP
>   	select ARCH_USE_CMPXCHG_LOCKREF
>   	select ARCH_WANTS_DYNAMIC_TASK_STRUCT
> +	select ARCH_WANTS_NO_INSTR
>   	select ARCH_WANT_DEFAULT_BPF_JIT
>   	select ARCH_WANT_IPC_PARSE_VERSION
>   	select BUILDTIME_TABLE_SORT
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index da43fd046149..7d6a44bb9b0e 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -114,6 +114,7 @@ config X86
>   	select ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH
>   	select ARCH_WANT_DEFAULT_BPF_JIT	if X86_64
>   	select ARCH_WANTS_DYNAMIC_TASK_STRUCT
> +	select ARCH_WANTS_NO_INSTR
>   	select ARCH_WANT_HUGE_PMD_SHARE
>   	select ARCH_WANT_LD_ORPHAN_WARN
>   	select ARCH_WANTS_THP_SWAP		if X86_64
> diff --git a/init/Kconfig b/init/Kconfig
> index 1ea12c64e4c9..31397a7a45fb 100644
> --- a/init/Kconfig
> +++ b/init/Kconfig
> @@ -83,6 +83,9 @@ config TOOLS_SUPPORT_RELR
>   config CC_HAS_ASM_INLINE
>   	def_bool $(success,echo 'void foo(void) { asm inline (""); }' | $(CC) -x c - -c -o /dev/null)
>   
> +config CC_HAS_NO_PROFILE_FN_ATTR
> +	def_bool $(success,echo '__attribute__((no_profile_instrument_function)) int x();' | $(CC) -x c - -c -o /dev/null -Werror)
> +
>   config CONSTRUCTORS
>   	bool
>   
> diff --git a/kernel/gcov/Kconfig b/kernel/gcov/Kconfig
> index 58f87a3092f3..053447183ac5 100644
> --- a/kernel/gcov/Kconfig
> +++ b/kernel/gcov/Kconfig
> @@ -5,6 +5,7 @@ config GCOV_KERNEL
>   	bool "Enable gcov-based kernel profiling"
>   	depends on DEBUG_FS
>   	depends on !CC_IS_CLANG || CLANG_VERSION >= 110000
> +	depends on !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
>   	select CONSTRUCTORS
>   	default n
>   	help
> diff --git a/kernel/pgo/Kconfig b/kernel/pgo/Kconfig
> index d2053df1111c..ce7fe04f303d 100644
> --- a/kernel/pgo/Kconfig
> +++ b/kernel/pgo/Kconfig
> @@ -8,7 +8,8 @@ config PGO_CLANG
>   	bool "Enable clang's PGO-based kernel profiling"
>   	depends on DEBUG_FS
>   	depends on ARCH_SUPPORTS_PGO_CLANG
> -	depends on CC_IS_CLANG && CLANG_VERSION >= 120000
> +	depends on CC_IS_CLANG
> +	depends on !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
>   	help
>   	  This option enables clang's PGO (Profile Guided Optimization) based
>   	  code profiling to better optimize the kernel.
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO
  2021-06-21 23:18 [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO Nick Desaulniers
                   ` (2 preceding siblings ...)
  2021-06-21 23:18 ` [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO Nick Desaulniers
@ 2021-06-22  7:25 ` Peter Zijlstra
  2021-06-22 18:19 ` Kees Cook
  2021-06-23  6:15 ` Kees Cook
  5 siblings, 0 replies; 18+ messages in thread
From: Peter Zijlstra @ 2021-06-22  7:25 UTC (permalink / raw)
  To: Nick Desaulniers
  Cc: Kees Cook, Bill Wendling, Sami Tolvanen, Peter Oberparleiter,
	Masahiro Yamada, Miguel Ojeda, Nathan Chancellor,
	Luc Van Oostenryck, Ard Biesheuvel, Will Deacon, Arnd Bergmann,
	Andrew Morton, Rasmus Villemoes, linux-kernel, clang-built-linux,
	x86, Borislav Petkov, Martin Liska, Marco Elver, Jonathan Corbet,
	Fangrui Song, linux-doc, linux-kbuild, Dmitry Vyukov,
	johannes.berg, linux-toolchains, Heiko Carstens, Vasily Gorbik,
	Christian Borntraeger, linux-s390, linux-arm-kernel,
	Catalin Marinas

On Mon, Jun 21, 2021 at 04:18:19PM -0700, Nick Desaulniers wrote:
> Nick Desaulniers (3):
>   compiler_attributes.h: define __no_profile, add to noinstr
>   compiler_attributes.h: cleanups for GCC 4.9+
>   Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on
>     for GCOV and PGO

Thanks for sorting this Nick!

Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO
  2021-06-21 23:18 ` [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO Nick Desaulniers
  2021-06-21 23:45   ` Nathan Chancellor
@ 2021-06-22  7:25   ` Peter Zijlstra
  2021-06-22  8:09     ` Marco Elver
  2021-06-22  9:05   ` Mark Rutland
                     ` (2 subsequent siblings)
  4 siblings, 1 reply; 18+ messages in thread
From: Peter Zijlstra @ 2021-06-22  7:25 UTC (permalink / raw)
  To: Nick Desaulniers
  Cc: Kees Cook, Bill Wendling, Sami Tolvanen, Peter Oberparleiter,
	Masahiro Yamada, Miguel Ojeda, Nathan Chancellor,
	Luc Van Oostenryck, Ard Biesheuvel, Will Deacon, Arnd Bergmann,
	Andrew Morton, Rasmus Villemoes, linux-kernel, clang-built-linux,
	x86, Borislav Petkov, Martin Liska, Marco Elver, Jonathan Corbet,
	Fangrui Song, linux-doc, linux-kbuild, Dmitry Vyukov,
	johannes.berg, linux-toolchains, Heiko Carstens, Vasily Gorbik,
	Christian Borntraeger, linux-s390, linux-arm-kernel,
	Catalin Marinas

On Mon, Jun 21, 2021 at 04:18:22PM -0700, Nick Desaulniers wrote:
> We don't want compiler instrumentation to touch noinstr functions, which
> are annotated with the no_profile_instrument_function function
> attribute. Add a Kconfig test for this and make PGO and GCOV depend on
> it.
> 
> If an architecture is using noinstr, it should denote that via this
> Kconfig value. That makes Kconfigs that depend on noinstr able to
> express dependencies in an architecturally agnostic way.
> 
> Cc: Masahiro Yamada <masahiroy@kernel.org>
> Cc: Peter Oberparleiter <oberpar@linux.ibm.com>
> Link: https://lore.kernel.org/lkml/YMTn9yjuemKFLbws@hirez.programming.kicks-ass.net/
> Link: https://lore.kernel.org/lkml/YMcssV%2Fn5IBGv4f0@hirez.programming.kicks-ass.net/
> Suggested-by: Nathan Chancellor <nathan@kernel.org>
> Suggested-by: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
> ---
> Changes V1 -> V2:
> * Add ARCH_WANTS_NO_INSTR
> * Change depdendencies to be !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
>   rather than list architectures explicitly, as per Nathan.
> * s/no_profile/no_profile_instrument_function/
> 
>  arch/Kconfig        | 7 +++++++
>  arch/arm64/Kconfig  | 1 +
>  arch/s390/Kconfig   | 1 +
>  arch/x86/Kconfig    | 1 +
>  init/Kconfig        | 3 +++
>  kernel/gcov/Kconfig | 1 +
>  kernel/pgo/Kconfig  | 3 ++-
>  7 files changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/Kconfig b/arch/Kconfig
> index 2b4109b0edee..2113c6b3b801 100644
> --- a/arch/Kconfig
> +++ b/arch/Kconfig
> @@ -285,6 +285,13 @@ config ARCH_THREAD_STACK_ALLOCATOR
>  config ARCH_WANTS_DYNAMIC_TASK_STRUCT
>  	bool
>  
> +config ARCH_WANTS_NO_INSTR
> +	bool
> +	help
> +	  An architecure should select this if the noinstr macro is being used on
> +	  functions to denote that the toolchain should avoid instrumenting such
> +	  functions and is required for correctness.
> +
>  config ARCH_32BIT_OFF_T
>  	bool
>  	depends on !64BIT

There's also CC_HAS_WORKING_NOSANITIZE_ADDRESS in lib/Kconfig.kasan that
might want to be hooked into this, but that can be done separately I
suppose.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO
  2021-06-22  7:25   ` Peter Zijlstra
@ 2021-06-22  8:09     ` Marco Elver
  0 siblings, 0 replies; 18+ messages in thread
From: Marco Elver @ 2021-06-22  8:09 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Nick Desaulniers, Kees Cook, Bill Wendling, Sami Tolvanen,
	Peter Oberparleiter, Masahiro Yamada, Miguel Ojeda,
	Nathan Chancellor, Luc Van Oostenryck, Ard Biesheuvel,
	Will Deacon, Arnd Bergmann, Andrew Morton, Rasmus Villemoes,
	linux-kernel, clang-built-linux, x86, Borislav Petkov,
	Martin Liska, Jonathan Corbet, Fangrui Song, linux-doc,
	linux-kbuild, Dmitry Vyukov, johannes.berg, linux-toolchains,
	Heiko Carstens, Vasily Gorbik, Christian Borntraeger, linux-s390,
	linux-arm-kernel, Catalin Marinas

On Tue, 22 Jun 2021 at 09:26, Peter Zijlstra <peterz@infradead.org> wrote:
>
> On Mon, Jun 21, 2021 at 04:18:22PM -0700, Nick Desaulniers wrote:
> > We don't want compiler instrumentation to touch noinstr functions, which
> > are annotated with the no_profile_instrument_function function
> > attribute. Add a Kconfig test for this and make PGO and GCOV depend on
> > it.
> >
> > If an architecture is using noinstr, it should denote that via this
> > Kconfig value. That makes Kconfigs that depend on noinstr able to
> > express dependencies in an architecturally agnostic way.
> >
> > Cc: Masahiro Yamada <masahiroy@kernel.org>
> > Cc: Peter Oberparleiter <oberpar@linux.ibm.com>
> > Link: https://lore.kernel.org/lkml/YMTn9yjuemKFLbws@hirez.programming.kicks-ass.net/
> > Link: https://lore.kernel.org/lkml/YMcssV%2Fn5IBGv4f0@hirez.programming.kicks-ass.net/
> > Suggested-by: Nathan Chancellor <nathan@kernel.org>
> > Suggested-by: Peter Zijlstra <peterz@infradead.org>
> > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
> > ---
> > Changes V1 -> V2:
> > * Add ARCH_WANTS_NO_INSTR
> > * Change depdendencies to be !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
> >   rather than list architectures explicitly, as per Nathan.
> > * s/no_profile/no_profile_instrument_function/
> >
> >  arch/Kconfig        | 7 +++++++
> >  arch/arm64/Kconfig  | 1 +
> >  arch/s390/Kconfig   | 1 +
> >  arch/x86/Kconfig    | 1 +
> >  init/Kconfig        | 3 +++
> >  kernel/gcov/Kconfig | 1 +
> >  kernel/pgo/Kconfig  | 3 ++-
> >  7 files changed, 16 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/Kconfig b/arch/Kconfig
> > index 2b4109b0edee..2113c6b3b801 100644
> > --- a/arch/Kconfig
> > +++ b/arch/Kconfig
> > @@ -285,6 +285,13 @@ config ARCH_THREAD_STACK_ALLOCATOR
> >  config ARCH_WANTS_DYNAMIC_TASK_STRUCT
> >       bool
> >
> > +config ARCH_WANTS_NO_INSTR
> > +     bool
> > +     help
> > +       An architecure should select this if the noinstr macro is being used on
> > +       functions to denote that the toolchain should avoid instrumenting such
> > +       functions and is required for correctness.
> > +
> >  config ARCH_32BIT_OFF_T
> >       bool
> >       depends on !64BIT
>
> There's also CC_HAS_WORKING_NOSANITIZE_ADDRESS in lib/Kconfig.kasan that
> might want to be hooked into this, but that can be done separately I
> suppose.

KASAN already depends on this for all compiler instrumentation modes,
not just for 'noinstr' but also to avoid false positives. So it's not
just for noinstr's benefit, and we should not weaken the requirement
there.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO
  2021-06-21 23:18 ` [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO Nick Desaulniers
  2021-06-21 23:45   ` Nathan Chancellor
  2021-06-22  7:25   ` Peter Zijlstra
@ 2021-06-22  9:05   ` Mark Rutland
  2021-06-22 11:10     ` Will Deacon
  2021-06-22  9:33   ` Heiko Carstens
  2021-06-22  9:35   ` Peter Oberparleiter
  4 siblings, 1 reply; 18+ messages in thread
From: Mark Rutland @ 2021-06-22  9:05 UTC (permalink / raw)
  To: Nick Desaulniers, Catalin Marinas, Will Deacon
  Cc: Kees Cook, Peter Zijlstra, Bill Wendling, Sami Tolvanen,
	Peter Oberparleiter, Masahiro Yamada, Miguel Ojeda,
	Nathan Chancellor, Luc Van Oostenryck, Ard Biesheuvel,
	Arnd Bergmann, Andrew Morton, Rasmus Villemoes, linux-kernel,
	clang-built-linux, x86, Borislav Petkov, Martin Liska,
	Marco Elver, Jonathan Corbet, Fangrui Song, linux-doc,
	linux-kbuild, Dmitry Vyukov, johannes.berg, linux-toolchains,
	Heiko Carstens, Vasily Gorbik, Christian Borntraeger, linux-s390,
	linux-arm-kernel

On Mon, Jun 21, 2021 at 04:18:22PM -0700, Nick Desaulniers wrote:
> We don't want compiler instrumentation to touch noinstr functions, which
> are annotated with the no_profile_instrument_function function
> attribute. Add a Kconfig test for this and make PGO and GCOV depend on
> it.
> 
> If an architecture is using noinstr, it should denote that via this
> Kconfig value. That makes Kconfigs that depend on noinstr able to
> express dependencies in an architecturally agnostic way.
> 
> Cc: Masahiro Yamada <masahiroy@kernel.org>
> Cc: Peter Oberparleiter <oberpar@linux.ibm.com>
> Link: https://lore.kernel.org/lkml/YMTn9yjuemKFLbws@hirez.programming.kicks-ass.net/
> Link: https://lore.kernel.org/lkml/YMcssV%2Fn5IBGv4f0@hirez.programming.kicks-ass.net/
> Suggested-by: Nathan Chancellor <nathan@kernel.org>
> Suggested-by: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>

FWIW, this looks good to me:

Acked-by: Mark Rutland <mark.rutland@arm.com>

Catalin, Will, are you happy iwth the arm64 bit?

Thanks,
Makr.

> ---
> Changes V1 -> V2:
> * Add ARCH_WANTS_NO_INSTR
> * Change depdendencies to be !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
>   rather than list architectures explicitly, as per Nathan.
> * s/no_profile/no_profile_instrument_function/
> 
>  arch/Kconfig        | 7 +++++++
>  arch/arm64/Kconfig  | 1 +
>  arch/s390/Kconfig   | 1 +
>  arch/x86/Kconfig    | 1 +
>  init/Kconfig        | 3 +++
>  kernel/gcov/Kconfig | 1 +
>  kernel/pgo/Kconfig  | 3 ++-
>  7 files changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/Kconfig b/arch/Kconfig
> index 2b4109b0edee..2113c6b3b801 100644
> --- a/arch/Kconfig
> +++ b/arch/Kconfig
> @@ -285,6 +285,13 @@ config ARCH_THREAD_STACK_ALLOCATOR
>  config ARCH_WANTS_DYNAMIC_TASK_STRUCT
>  	bool
>  
> +config ARCH_WANTS_NO_INSTR
> +	bool
> +	help
> +	  An architecure should select this if the noinstr macro is being used on
> +	  functions to denote that the toolchain should avoid instrumenting such
> +	  functions and is required for correctness.
> +
>  config ARCH_32BIT_OFF_T
>  	bool
>  	depends on !64BIT
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 9f1d8566bbf9..39bf982b06f8 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -93,6 +93,7 @@ config ARM64
>  	select ARCH_WANT_FRAME_POINTERS
>  	select ARCH_WANT_HUGE_PMD_SHARE if ARM64_4K_PAGES || (ARM64_16K_PAGES && !ARM64_VA_BITS_36)
>  	select ARCH_WANT_LD_ORPHAN_WARN
> +	select ARCH_WANTS_NO_INSTR
>  	select ARCH_HAS_UBSAN_SANITIZE_ALL
>  	select ARM_AMBA
>  	select ARM_ARCH_TIMER
> diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
> index b4c7c34069f8..bd60310f33b9 100644
> --- a/arch/s390/Kconfig
> +++ b/arch/s390/Kconfig
> @@ -117,6 +117,7 @@ config S390
>  	select ARCH_USE_BUILTIN_BSWAP
>  	select ARCH_USE_CMPXCHG_LOCKREF
>  	select ARCH_WANTS_DYNAMIC_TASK_STRUCT
> +	select ARCH_WANTS_NO_INSTR
>  	select ARCH_WANT_DEFAULT_BPF_JIT
>  	select ARCH_WANT_IPC_PARSE_VERSION
>  	select BUILDTIME_TABLE_SORT
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index da43fd046149..7d6a44bb9b0e 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -114,6 +114,7 @@ config X86
>  	select ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH
>  	select ARCH_WANT_DEFAULT_BPF_JIT	if X86_64
>  	select ARCH_WANTS_DYNAMIC_TASK_STRUCT
> +	select ARCH_WANTS_NO_INSTR
>  	select ARCH_WANT_HUGE_PMD_SHARE
>  	select ARCH_WANT_LD_ORPHAN_WARN
>  	select ARCH_WANTS_THP_SWAP		if X86_64
> diff --git a/init/Kconfig b/init/Kconfig
> index 1ea12c64e4c9..31397a7a45fb 100644
> --- a/init/Kconfig
> +++ b/init/Kconfig
> @@ -83,6 +83,9 @@ config TOOLS_SUPPORT_RELR
>  config CC_HAS_ASM_INLINE
>  	def_bool $(success,echo 'void foo(void) { asm inline (""); }' | $(CC) -x c - -c -o /dev/null)
>  
> +config CC_HAS_NO_PROFILE_FN_ATTR
> +	def_bool $(success,echo '__attribute__((no_profile_instrument_function)) int x();' | $(CC) -x c - -c -o /dev/null -Werror)
> +
>  config CONSTRUCTORS
>  	bool
>  
> diff --git a/kernel/gcov/Kconfig b/kernel/gcov/Kconfig
> index 58f87a3092f3..053447183ac5 100644
> --- a/kernel/gcov/Kconfig
> +++ b/kernel/gcov/Kconfig
> @@ -5,6 +5,7 @@ config GCOV_KERNEL
>  	bool "Enable gcov-based kernel profiling"
>  	depends on DEBUG_FS
>  	depends on !CC_IS_CLANG || CLANG_VERSION >= 110000
> +	depends on !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
>  	select CONSTRUCTORS
>  	default n
>  	help
> diff --git a/kernel/pgo/Kconfig b/kernel/pgo/Kconfig
> index d2053df1111c..ce7fe04f303d 100644
> --- a/kernel/pgo/Kconfig
> +++ b/kernel/pgo/Kconfig
> @@ -8,7 +8,8 @@ config PGO_CLANG
>  	bool "Enable clang's PGO-based kernel profiling"
>  	depends on DEBUG_FS
>  	depends on ARCH_SUPPORTS_PGO_CLANG
> -	depends on CC_IS_CLANG && CLANG_VERSION >= 120000
> +	depends on CC_IS_CLANG
> +	depends on !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
>  	help
>  	  This option enables clang's PGO (Profile Guided Optimization) based
>  	  code profiling to better optimize the kernel.
> -- 
> 2.32.0.288.g62a8d224e6-goog
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO
  2021-06-21 23:18 ` [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO Nick Desaulniers
                     ` (2 preceding siblings ...)
  2021-06-22  9:05   ` Mark Rutland
@ 2021-06-22  9:33   ` Heiko Carstens
  2021-06-22  9:35   ` Peter Oberparleiter
  4 siblings, 0 replies; 18+ messages in thread
From: Heiko Carstens @ 2021-06-22  9:33 UTC (permalink / raw)
  To: Nick Desaulniers
  Cc: Kees Cook, Peter Zijlstra, Bill Wendling, Sami Tolvanen,
	Peter Oberparleiter, Masahiro Yamada, Miguel Ojeda,
	Nathan Chancellor, Luc Van Oostenryck, Ard Biesheuvel,
	Will Deacon, Arnd Bergmann, Andrew Morton, Rasmus Villemoes,
	linux-kernel, clang-built-linux, x86, Borislav Petkov,
	Martin Liska, Marco Elver, Jonathan Corbet, Fangrui Song,
	linux-doc, linux-kbuild, Dmitry Vyukov, johannes.berg,
	linux-toolchains, Vasily Gorbik, Christian Borntraeger,
	linux-s390, linux-arm-kernel, Catalin Marinas

On Mon, Jun 21, 2021 at 04:18:22PM -0700, Nick Desaulniers wrote:
> We don't want compiler instrumentation to touch noinstr functions, which
> are annotated with the no_profile_instrument_function function
> attribute. Add a Kconfig test for this and make PGO and GCOV depend on
> it.
> 
> If an architecture is using noinstr, it should denote that via this
> Kconfig value. That makes Kconfigs that depend on noinstr able to
> express dependencies in an architecturally agnostic way.
> 
> Cc: Masahiro Yamada <masahiroy@kernel.org>
> Cc: Peter Oberparleiter <oberpar@linux.ibm.com>
> Link: https://lore.kernel.org/lkml/YMTn9yjuemKFLbws@hirez.programming.kicks-ass.net/
> Link: https://lore.kernel.org/lkml/YMcssV%2Fn5IBGv4f0@hirez.programming.kicks-ass.net/
> Suggested-by: Nathan Chancellor <nathan@kernel.org>
> Suggested-by: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
> ---
> Changes V1 -> V2:
> * Add ARCH_WANTS_NO_INSTR
> * Change depdendencies to be !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
>   rather than list architectures explicitly, as per Nathan.
> * s/no_profile/no_profile_instrument_function/
> 
>  arch/Kconfig        | 7 +++++++
>  arch/arm64/Kconfig  | 1 +
>  arch/s390/Kconfig   | 1 +
>  arch/x86/Kconfig    | 1 +
>  init/Kconfig        | 3 +++
>  kernel/gcov/Kconfig | 1 +
>  kernel/pgo/Kconfig  | 3 ++-
>  7 files changed, 16 insertions(+), 1 deletion(-)

For s390:
Acked-by: Heiko Carstens <hca@linux.ibm.com>

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO
  2021-06-21 23:18 ` [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO Nick Desaulniers
                     ` (3 preceding siblings ...)
  2021-06-22  9:33   ` Heiko Carstens
@ 2021-06-22  9:35   ` Peter Oberparleiter
  4 siblings, 0 replies; 18+ messages in thread
From: Peter Oberparleiter @ 2021-06-22  9:35 UTC (permalink / raw)
  To: Nick Desaulniers, Kees Cook
  Cc: Peter Zijlstra, Bill Wendling, Sami Tolvanen, Masahiro Yamada,
	Miguel Ojeda, Nathan Chancellor, Luc Van Oostenryck,
	Ard Biesheuvel, Will Deacon, Arnd Bergmann, Andrew Morton,
	Rasmus Villemoes, linux-kernel, clang-built-linux, x86,
	Borislav Petkov, Martin Liska, Marco Elver, Jonathan Corbet,
	Fangrui Song, linux-doc, linux-kbuild, Dmitry Vyukov,
	johannes.berg, linux-toolchains, Heiko Carstens, Vasily Gorbik,
	Christian Borntraeger, linux-s390, linux-arm-kernel,
	Catalin Marinas

On 22.06.2021 01:18, Nick Desaulniers wrote:
> We don't want compiler instrumentation to touch noinstr functions, which
> are annotated with the no_profile_instrument_function function
> attribute. Add a Kconfig test for this and make PGO and GCOV depend on
> it.
> 
> If an architecture is using noinstr, it should denote that via this
> Kconfig value. That makes Kconfigs that depend on noinstr able to
> express dependencies in an architecturally agnostic way.
> 
> Cc: Masahiro Yamada <masahiroy@kernel.org>
> Cc: Peter Oberparleiter <oberpar@linux.ibm.com>
> Link: https://lore.kernel.org/lkml/YMTn9yjuemKFLbws@hirez.programming.kicks-ass.net/
> Link: https://lore.kernel.org/lkml/YMcssV%2Fn5IBGv4f0@hirez.programming.kicks-ass.net/
> Suggested-by: Nathan Chancellor <nathan@kernel.org>
> Suggested-by: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>

Looks good to me - thanks for resolving this problem!

Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com>


Regards,
  Peter

-- 
Peter Oberparleiter
Linux on Z Development - IBM Germany

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO
  2021-06-22  9:05   ` Mark Rutland
@ 2021-06-22 11:10     ` Will Deacon
  0 siblings, 0 replies; 18+ messages in thread
From: Will Deacon @ 2021-06-22 11:10 UTC (permalink / raw)
  To: Mark Rutland
  Cc: Nick Desaulniers, Catalin Marinas, Kees Cook, Peter Zijlstra,
	Bill Wendling, Sami Tolvanen, Peter Oberparleiter,
	Masahiro Yamada, Miguel Ojeda, Nathan Chancellor,
	Luc Van Oostenryck, Ard Biesheuvel, Arnd Bergmann, Andrew Morton,
	Rasmus Villemoes, linux-kernel, clang-built-linux, x86,
	Borislav Petkov, Martin Liska, Marco Elver, Jonathan Corbet,
	Fangrui Song, linux-doc, linux-kbuild, Dmitry Vyukov,
	johannes.berg, linux-toolchains, Heiko Carstens, Vasily Gorbik,
	Christian Borntraeger, linux-s390, linux-arm-kernel

On Tue, Jun 22, 2021 at 10:05:40AM +0100, Mark Rutland wrote:
> On Mon, Jun 21, 2021 at 04:18:22PM -0700, Nick Desaulniers wrote:
> > We don't want compiler instrumentation to touch noinstr functions, which
> > are annotated with the no_profile_instrument_function function
> > attribute. Add a Kconfig test for this and make PGO and GCOV depend on
> > it.
> > 
> > If an architecture is using noinstr, it should denote that via this
> > Kconfig value. That makes Kconfigs that depend on noinstr able to
> > express dependencies in an architecturally agnostic way.
> > 
> > Cc: Masahiro Yamada <masahiroy@kernel.org>
> > Cc: Peter Oberparleiter <oberpar@linux.ibm.com>
> > Link: https://lore.kernel.org/lkml/YMTn9yjuemKFLbws@hirez.programming.kicks-ass.net/
> > Link: https://lore.kernel.org/lkml/YMcssV%2Fn5IBGv4f0@hirez.programming.kicks-ass.net/
> > Suggested-by: Nathan Chancellor <nathan@kernel.org>
> > Suggested-by: Peter Zijlstra <peterz@infradead.org>
> > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
> 
> FWIW, this looks good to me:
> 
> Acked-by: Mark Rutland <mark.rutland@arm.com>
> 
> Catalin, Will, are you happy iwth the arm64 bit?

Looks fine to me.

Will

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO
  2021-06-21 23:18 [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO Nick Desaulniers
                   ` (3 preceding siblings ...)
  2021-06-22  7:25 ` [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO Peter Zijlstra
@ 2021-06-22 18:19 ` Kees Cook
  2021-06-23  6:15 ` Kees Cook
  5 siblings, 0 replies; 18+ messages in thread
From: Kees Cook @ 2021-06-22 18:19 UTC (permalink / raw)
  To: Nick Desaulniers
  Cc: Peter Zijlstra, Bill Wendling, Sami Tolvanen,
	Peter Oberparleiter, Masahiro Yamada, Miguel Ojeda,
	Nathan Chancellor, Luc Van Oostenryck, Ard Biesheuvel,
	Will Deacon, Arnd Bergmann, Andrew Morton, Rasmus Villemoes,
	linux-kernel, clang-built-linux, x86, Borislav Petkov,
	Martin Liska, Marco Elver, Jonathan Corbet, Fangrui Song,
	linux-doc, linux-kbuild, Dmitry Vyukov, johannes.berg,
	linux-toolchains, Heiko Carstens, Vasily Gorbik,
	Christian Borntraeger, linux-s390, linux-arm-kernel,
	Catalin Marinas

On Mon, Jun 21, 2021 at 04:18:19PM -0700, Nick Desaulniers wrote:
> Add a new function annotation __no_profile that expands to
> __attribute__((__no_profile_instrument_function__)) and Kconfig values
> CC_HAS_NO_PROFILE_FN_ATTR and ARCH_WANTS_NO_INSTR. Make GCOV and PGO
> depend on either !ARCH_WANTS_NO_INSTR or CC_HAS_NO_PROFILE_FN_ATTR.

Awesome; thanks everyone! I'm doing a Clang rebuild now, and will do
kernel testing and push this to my for-next/clang/features tree shortly.

-- 
Kees Cook

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO
  2021-06-21 23:18 [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO Nick Desaulniers
                   ` (4 preceding siblings ...)
  2021-06-22 18:19 ` Kees Cook
@ 2021-06-23  6:15 ` Kees Cook
  2021-06-24 19:36   ` Nick Desaulniers
  5 siblings, 1 reply; 18+ messages in thread
From: Kees Cook @ 2021-06-23  6:15 UTC (permalink / raw)
  To: Nick Desaulniers
  Cc: Kees Cook, Catalin Marinas, Vasily Gorbik, Ard Biesheuvel,
	Rasmus Villemoes, linux-arm-kernel, Nathan Chancellor,
	Fangrui Song, linux-kbuild, linux-doc, linux-kernel, linux-s390,
	Peter Oberparleiter, Borislav Petkov, Luc Van Oostenryck,
	Marco Elver, Christian Borntraeger, Masahiro Yamada,
	Peter Zijlstra, Heiko Carstens, Andrew Morton, Miguel Ojeda,
	Dmitry Vyukov, Bill Wendling, Arnd Bergmann, johannes.berg,
	clang-built-linux, Jonathan Corbet, Martin Liska,
	linux-toolchains, x86, Sami Tolvanen, Will Deacon

On Mon, 21 Jun 2021 16:18:19 -0700, Nick Desaulniers wrote:
> The kernel has been using noinstr for correctness to politely request
> that the compiler avoid adding various forms of instrumentation to
> certain functions.
> 
> GCOV and PGO can both instrument functions, yet the function attribute
> to disable such instrumentation (no_profile_instrument_function) was not
> being used to suppress such implementation. Also, clang only just
> recently gained support for no_profile_instrument_function. GCC has
> supported that since 7.1+.
> 
> [...]

Applied to for-next/clang/features, thanks!

[1/3] compiler_attributes.h: define __no_profile, add to noinstr
      https://git.kernel.org/kees/c/380d53c45ff2
[2/3] compiler_attributes.h: cleanups for GCC 4.9+
      https://git.kernel.org/kees/c/ae4d682dfd33
[3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO
      https://git.kernel.org/kees/c/51c2ee6d121c

Note that I've tweaked the series slightly to move the PGO Kconfig change into
the PGO patch.

-- 
Kees Cook


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO
  2021-06-23  6:15 ` Kees Cook
@ 2021-06-24 19:36   ` Nick Desaulniers
  0 siblings, 0 replies; 18+ messages in thread
From: Nick Desaulniers @ 2021-06-24 19:36 UTC (permalink / raw)
  To: Kees Cook
  Cc: Catalin Marinas, Vasily Gorbik, Ard Biesheuvel, Rasmus Villemoes,
	linux-arm-kernel, Nathan Chancellor, Fangrui Song, linux-kbuild,
	linux-doc, linux-kernel, linux-s390, Peter Oberparleiter,
	Borislav Petkov, Luc Van Oostenryck, Marco Elver,
	Christian Borntraeger, Masahiro Yamada, Peter Zijlstra,
	Heiko Carstens, Andrew Morton, Miguel Ojeda, Dmitry Vyukov,
	Bill Wendling, Arnd Bergmann, johannes.berg, clang-built-linux,
	Jonathan Corbet, Martin Liska, linux-toolchains, x86,
	Sami Tolvanen, Will Deacon

On Tue, Jun 22, 2021 at 11:17 PM Kees Cook <keescook@chromium.org> wrote:
>
> On Mon, 21 Jun 2021 16:18:19 -0700, Nick Desaulniers wrote:
> > The kernel has been using noinstr for correctness to politely request
> > that the compiler avoid adding various forms of instrumentation to
> > certain functions.
> >
> > GCOV and PGO can both instrument functions, yet the function attribute
> > to disable such instrumentation (no_profile_instrument_function) was not
> > being used to suppress such implementation. Also, clang only just
> > recently gained support for no_profile_instrument_function. GCC has
> > supported that since 7.1+.
> >
> > [...]
>
> Applied to for-next/clang/features, thanks!
>
> [1/3] compiler_attributes.h: define __no_profile, add to noinstr
>       https://git.kernel.org/kees/c/380d53c45ff2
> [2/3] compiler_attributes.h: cleanups for GCC 4.9+
>       https://git.kernel.org/kees/c/ae4d682dfd33
> [3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO
>       https://git.kernel.org/kees/c/51c2ee6d121c
>
> Note that I've tweaked the series slightly to move the PGO Kconfig change into
> the PGO patch.

Ok, LGTM.
-- 
Thanks,
~Nick Desaulniers

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2021-06-24 19:36 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-21 23:18 [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO Nick Desaulniers
2021-06-21 23:18 ` [PATCH v2 1/3] compiler_attributes.h: define __no_profile, add to noinstr Nick Desaulniers
2021-06-21 23:41   ` Nathan Chancellor
2021-06-21 23:18 ` [PATCH v2 2/3] compiler_attributes.h: cleanups for GCC 4.9+ Nick Desaulniers
2021-06-21 23:31   ` Miguel Ojeda
2021-06-21 23:42   ` Nathan Chancellor
2021-06-21 23:18 ` [PATCH v2 3/3] Kconfig: add ARCH_WANTS_NO_INSTR+CC_HAS_NO_PROFILE_FN_ATTR, depend on for GCOV and PGO Nick Desaulniers
2021-06-21 23:45   ` Nathan Chancellor
2021-06-22  7:25   ` Peter Zijlstra
2021-06-22  8:09     ` Marco Elver
2021-06-22  9:05   ` Mark Rutland
2021-06-22 11:10     ` Will Deacon
2021-06-22  9:33   ` Heiko Carstens
2021-06-22  9:35   ` Peter Oberparleiter
2021-06-22  7:25 ` [PATCH v2 0/3] no_profile fn attr and Kconfig for GCOV+PGO Peter Zijlstra
2021-06-22 18:19 ` Kees Cook
2021-06-23  6:15 ` Kees Cook
2021-06-24 19:36   ` Nick Desaulniers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).