All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH -tip v6 1/2] irq: Make irqentry text section unconditional
@ 2017-07-28 12:24 Masami Hiramatsu
  2017-07-28 12:25 ` [PATCH -tip v6 2/2] [BUGFIX] kprobes/x86: Do not jump-optimize kprobes on irq entry code Masami Hiramatsu
  2017-07-28 13:59 ` [PATCH -tip v6 1/2] irq: Make irqentry text section unconditional Masami Hiramatsu
  0 siblings, 2 replies; 3+ messages in thread
From: Masami Hiramatsu @ 2017-07-28 12:24 UTC (permalink / raw
  To: Ingo Molnar, Thomas Gleixner
  Cc: Francis Deslauriers, mathieu.desnoyers, Ingo Molnar,
	H . Peter Anvin, x86, Masami Hiramatsu,
	Ananth N Mavinakayanahalli, Anil S Keshavamurthy,
	David S . Miller, linux-kernel

Generate irqentry and softirqentry text sections without
any configs. This will add above extra sections, but
no performace impact.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Suggested-by: Ingo Molnar <mingo@kernel.org>
---
 arch/arm/include/asm/traps.h      |    7 -------
 arch/arm64/include/asm/traps.h    |    7 -------
 arch/x86/entry/entry_64.S         |    9 ++-------
 include/asm-generic/sections.h    |    4 ++++
 include/asm-generic/vmlinux.lds.h |    8 --------
 include/linux/interrupt.h         |   14 +-------------
 6 files changed, 7 insertions(+), 42 deletions(-)

diff --git a/arch/arm/include/asm/traps.h b/arch/arm/include/asm/traps.h
index f555bb3664dc..683d9230984a 100644
--- a/arch/arm/include/asm/traps.h
+++ b/arch/arm/include/asm/traps.h
@@ -18,7 +18,6 @@ struct undef_hook {
 void register_undef_hook(struct undef_hook *hook);
 void unregister_undef_hook(struct undef_hook *hook);
 
-#ifdef CONFIG_FUNCTION_GRAPH_TRACER
 static inline int __in_irqentry_text(unsigned long ptr)
 {
 	extern char __irqentry_text_start[];
@@ -27,12 +26,6 @@ static inline int __in_irqentry_text(unsigned long ptr)
 	return ptr >= (unsigned long)&__irqentry_text_start &&
 	       ptr < (unsigned long)&__irqentry_text_end;
 }
-#else
-static inline int __in_irqentry_text(unsigned long ptr)
-{
-	return 0;
-}
-#endif
 
 static inline int in_exception_text(unsigned long ptr)
 {
diff --git a/arch/arm64/include/asm/traps.h b/arch/arm64/include/asm/traps.h
index 02e9035b0685..47a9066f7c86 100644
--- a/arch/arm64/include/asm/traps.h
+++ b/arch/arm64/include/asm/traps.h
@@ -37,18 +37,11 @@ void unregister_undef_hook(struct undef_hook *hook);
 
 void arm64_notify_segfault(struct pt_regs *regs, unsigned long addr);
 
-#ifdef CONFIG_FUNCTION_GRAPH_TRACER
 static inline int __in_irqentry_text(unsigned long ptr)
 {
 	return ptr >= (unsigned long)&__irqentry_text_start &&
 	       ptr < (unsigned long)&__irqentry_text_end;
 }
-#else
-static inline int __in_irqentry_text(unsigned long ptr)
-{
-	return 0;
-}
-#endif
 
 static inline int in_exception_text(unsigned long ptr)
 {
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index aa58155187c5..5e41396efbbf 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -766,13 +766,8 @@ apicinterrupt3 \num trace(\sym) smp_trace(\sym)
 #endif
 
 /* Make sure APIC interrupt handlers end up in the irqentry section: */
-#if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN)
-# define PUSH_SECTION_IRQENTRY	.pushsection .irqentry.text, "ax"
-# define POP_SECTION_IRQENTRY	.popsection
-#else
-# define PUSH_SECTION_IRQENTRY
-# define POP_SECTION_IRQENTRY
-#endif
+#define PUSH_SECTION_IRQENTRY	.pushsection .irqentry.text, "ax"
+#define POP_SECTION_IRQENTRY	.popsection
 
 .macro apicinterrupt num sym do_sym
 PUSH_SECTION_IRQENTRY
diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
index 532372c6cf15..e5da44eddd2f 100644
--- a/include/asm-generic/sections.h
+++ b/include/asm-generic/sections.h
@@ -27,6 +27,8 @@
  *	__kprobes_text_start, __kprobes_text_end
  *	__entry_text_start, __entry_text_end
  *	__ctors_start, __ctors_end
+ *	__irqentry_text_start, __irqentry_text_end
+ *	__softirqentry_text_start, __softirqentry_text_end
  */
 extern char _text[], _stext[], _etext[];
 extern char _data[], _sdata[], _edata[];
@@ -39,6 +41,8 @@ extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[];
 extern char __kprobes_text_start[], __kprobes_text_end[];
 extern char __entry_text_start[], __entry_text_end[];
 extern char __start_rodata[], __end_rodata[];
+extern char __irqentry_text_start[], __irqentry_text_end[];
+extern char __softirqentry_text_start[], __softirqentry_text_end[];
 
 /* Start and end of .ctors section - used for constructor calls. */
 extern char __ctors_start[], __ctors_end[];
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index fffc9bdae025..438b014c192f 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -483,25 +483,17 @@
 		*(.entry.text)						\
 		VMLINUX_SYMBOL(__entry_text_end) = .;
 
-#if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN)
 #define IRQENTRY_TEXT							\
 		ALIGN_FUNCTION();					\
 		VMLINUX_SYMBOL(__irqentry_text_start) = .;		\
 		*(.irqentry.text)					\
 		VMLINUX_SYMBOL(__irqentry_text_end) = .;
-#else
-#define IRQENTRY_TEXT
-#endif
 
-#if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN)
 #define SOFTIRQENTRY_TEXT						\
 		ALIGN_FUNCTION();					\
 		VMLINUX_SYMBOL(__softirqentry_text_start) = .;		\
 		*(.softirqentry.text)					\
 		VMLINUX_SYMBOL(__softirqentry_text_end) = .;
-#else
-#define SOFTIRQENTRY_TEXT
-#endif
 
 /* Section used for early init (in .S files) */
 #define HEAD_TEXT  *(.head.text)
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
index a2fddddb0d60..59ba11661b6e 100644
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -18,6 +18,7 @@
 #include <linux/atomic.h>
 #include <asm/ptrace.h>
 #include <asm/irq.h>
+#include <asm/sections.h>
 
 /*
  * These correspond to the IORESOURCE_IRQ_* defines in
@@ -726,7 +727,6 @@ extern int early_irq_init(void);
 extern int arch_probe_nr_irqs(void);
 extern int arch_early_irq_init(void);
 
-#if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN)
 /*
  * We want to know which function is an entrypoint of a hardirq or a softirq.
  */
@@ -734,16 +734,4 @@ extern int arch_early_irq_init(void);
 #define __softirq_entry  \
 	__attribute__((__section__(".softirqentry.text")))
 
-/* Limits of hardirq entrypoints */
-extern char __irqentry_text_start[];
-extern char __irqentry_text_end[];
-/* Limits of softirq entrypoints */
-extern char __softirqentry_text_start[];
-extern char __softirqentry_text_end[];
-
-#else
-#define __irq_entry
-#define __softirq_entry
-#endif
-
 #endif

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

* [PATCH -tip v6 2/2] [BUGFIX] kprobes/x86: Do not jump-optimize kprobes on irq entry code
  2017-07-28 12:24 [PATCH -tip v6 1/2] irq: Make irqentry text section unconditional Masami Hiramatsu
@ 2017-07-28 12:25 ` Masami Hiramatsu
  2017-07-28 13:59 ` [PATCH -tip v6 1/2] irq: Make irqentry text section unconditional Masami Hiramatsu
  1 sibling, 0 replies; 3+ messages in thread
From: Masami Hiramatsu @ 2017-07-28 12:25 UTC (permalink / raw
  To: Ingo Molnar, Thomas Gleixner
  Cc: Francis Deslauriers, mathieu.desnoyers, Ingo Molnar,
	H . Peter Anvin, x86, Masami Hiramatsu,
	Ananth N Mavinakayanahalli, Anil S Keshavamurthy,
	David S . Miller, linux-kernel

Since the kernel segment registers are not prepared at the
entry of irq-entry code, if a kprobe on such code is
jump-optimized, accessing per-cpu variables may cause
kernel panic.
However, if the kprobe is not optimized, it kicks int3
exception and set segment registers correctly.

This checks probe-address and if it is in irq-entry code,
it prohibits optimizing such kprobes. This means we can
continuously probing such interrupt handlers by kprobes
but it is not optimized anymore.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Reported-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Tested-by: Francis Deslauriers <francis.deslauriers@efficios.com>
---
 Changes in v6:
  - Update for unconditional irqentry.
---
 arch/x86/kernel/kprobes/opt.c |    9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c
index 69ea0bc1cfa3..4f98aad38237 100644
--- a/arch/x86/kernel/kprobes/opt.c
+++ b/arch/x86/kernel/kprobes/opt.c
@@ -39,6 +39,7 @@
 #include <asm/insn.h>
 #include <asm/debugreg.h>
 #include <asm/set_memory.h>
+#include <asm/sections.h>
 
 #include "common.h"
 
@@ -251,10 +252,12 @@ static int can_optimize(unsigned long paddr)
 
 	/*
 	 * Do not optimize in the entry code due to the unstable
-	 * stack handling.
+	 * stack handling and registers setup.
 	 */
-	if ((paddr >= (unsigned long)__entry_text_start) &&
-	    (paddr <  (unsigned long)__entry_text_end))
+	if (((paddr >= (unsigned long)__entry_text_start) &&
+	     (paddr <  (unsigned long)__entry_text_end)) ||
+	    ((paddr >= (unsigned long)__irqentry_text_start) &&
+	     (paddr <  (unsigned long)__irqentry_text_end)))
 		return 0;
 
 	/* Check there is enough space for a relative jump. */

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

* Re: [PATCH -tip v6 1/2] irq: Make irqentry text section unconditional
  2017-07-28 12:24 [PATCH -tip v6 1/2] irq: Make irqentry text section unconditional Masami Hiramatsu
  2017-07-28 12:25 ` [PATCH -tip v6 2/2] [BUGFIX] kprobes/x86: Do not jump-optimize kprobes on irq entry code Masami Hiramatsu
@ 2017-07-28 13:59 ` Masami Hiramatsu
  1 sibling, 0 replies; 3+ messages in thread
From: Masami Hiramatsu @ 2017-07-28 13:59 UTC (permalink / raw
  To: Masami Hiramatsu
  Cc: Ingo Molnar, Thomas Gleixner, Francis Deslauriers,
	mathieu.desnoyers, Ingo Molnar, H . Peter Anvin, x86,
	Ananth N Mavinakayanahalli, Anil S Keshavamurthy,
	David S . Miller, linux-kernel

On Fri, 28 Jul 2017 21:24:54 +0900
Masami Hiramatsu <mhiramat@kernel.org> wrote:

> Generate irqentry and softirqentry text sections without
> any configs. This will add above extra sections, but
> no performace impact.
> 
> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> Suggested-by: Ingo Molnar <mingo@kernel.org>
> ---
>  arch/arm/include/asm/traps.h      |    7 -------
>  arch/arm64/include/asm/traps.h    |    7 -------
>  arch/x86/entry/entry_64.S         |    9 ++-------
>  include/asm-generic/sections.h    |    4 ++++
>  include/asm-generic/vmlinux.lds.h |    8 --------
>  include/linux/interrupt.h         |   14 +-------------
>  6 files changed, 7 insertions(+), 42 deletions(-)

Oops, I forgot to fix x86 unwind code.
I'll update this to fix in_entry_code() unconditional.

Thanks,

> 
> diff --git a/arch/arm/include/asm/traps.h b/arch/arm/include/asm/traps.h
> index f555bb3664dc..683d9230984a 100644
> --- a/arch/arm/include/asm/traps.h
> +++ b/arch/arm/include/asm/traps.h
> @@ -18,7 +18,6 @@ struct undef_hook {
>  void register_undef_hook(struct undef_hook *hook);
>  void unregister_undef_hook(struct undef_hook *hook);
>  
> -#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>  static inline int __in_irqentry_text(unsigned long ptr)
>  {
>  	extern char __irqentry_text_start[];
> @@ -27,12 +26,6 @@ static inline int __in_irqentry_text(unsigned long ptr)
>  	return ptr >= (unsigned long)&__irqentry_text_start &&
>  	       ptr < (unsigned long)&__irqentry_text_end;
>  }
> -#else
> -static inline int __in_irqentry_text(unsigned long ptr)
> -{
> -	return 0;
> -}
> -#endif
>  
>  static inline int in_exception_text(unsigned long ptr)
>  {
> diff --git a/arch/arm64/include/asm/traps.h b/arch/arm64/include/asm/traps.h
> index 02e9035b0685..47a9066f7c86 100644
> --- a/arch/arm64/include/asm/traps.h
> +++ b/arch/arm64/include/asm/traps.h
> @@ -37,18 +37,11 @@ void unregister_undef_hook(struct undef_hook *hook);
>  
>  void arm64_notify_segfault(struct pt_regs *regs, unsigned long addr);
>  
> -#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>  static inline int __in_irqentry_text(unsigned long ptr)
>  {
>  	return ptr >= (unsigned long)&__irqentry_text_start &&
>  	       ptr < (unsigned long)&__irqentry_text_end;
>  }
> -#else
> -static inline int __in_irqentry_text(unsigned long ptr)
> -{
> -	return 0;
> -}
> -#endif
>  
>  static inline int in_exception_text(unsigned long ptr)
>  {
> diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
> index aa58155187c5..5e41396efbbf 100644
> --- a/arch/x86/entry/entry_64.S
> +++ b/arch/x86/entry/entry_64.S
> @@ -766,13 +766,8 @@ apicinterrupt3 \num trace(\sym) smp_trace(\sym)
>  #endif
>  
>  /* Make sure APIC interrupt handlers end up in the irqentry section: */
> -#if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN)
> -# define PUSH_SECTION_IRQENTRY	.pushsection .irqentry.text, "ax"
> -# define POP_SECTION_IRQENTRY	.popsection
> -#else
> -# define PUSH_SECTION_IRQENTRY
> -# define POP_SECTION_IRQENTRY
> -#endif
> +#define PUSH_SECTION_IRQENTRY	.pushsection .irqentry.text, "ax"
> +#define POP_SECTION_IRQENTRY	.popsection
>  
>  .macro apicinterrupt num sym do_sym
>  PUSH_SECTION_IRQENTRY
> diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
> index 532372c6cf15..e5da44eddd2f 100644
> --- a/include/asm-generic/sections.h
> +++ b/include/asm-generic/sections.h
> @@ -27,6 +27,8 @@
>   *	__kprobes_text_start, __kprobes_text_end
>   *	__entry_text_start, __entry_text_end
>   *	__ctors_start, __ctors_end
> + *	__irqentry_text_start, __irqentry_text_end
> + *	__softirqentry_text_start, __softirqentry_text_end
>   */
>  extern char _text[], _stext[], _etext[];
>  extern char _data[], _sdata[], _edata[];
> @@ -39,6 +41,8 @@ extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[];
>  extern char __kprobes_text_start[], __kprobes_text_end[];
>  extern char __entry_text_start[], __entry_text_end[];
>  extern char __start_rodata[], __end_rodata[];
> +extern char __irqentry_text_start[], __irqentry_text_end[];
> +extern char __softirqentry_text_start[], __softirqentry_text_end[];
>  
>  /* Start and end of .ctors section - used for constructor calls. */
>  extern char __ctors_start[], __ctors_end[];
> diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
> index fffc9bdae025..438b014c192f 100644
> --- a/include/asm-generic/vmlinux.lds.h
> +++ b/include/asm-generic/vmlinux.lds.h
> @@ -483,25 +483,17 @@
>  		*(.entry.text)						\
>  		VMLINUX_SYMBOL(__entry_text_end) = .;
>  
> -#if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN)
>  #define IRQENTRY_TEXT							\
>  		ALIGN_FUNCTION();					\
>  		VMLINUX_SYMBOL(__irqentry_text_start) = .;		\
>  		*(.irqentry.text)					\
>  		VMLINUX_SYMBOL(__irqentry_text_end) = .;
> -#else
> -#define IRQENTRY_TEXT
> -#endif
>  
> -#if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN)
>  #define SOFTIRQENTRY_TEXT						\
>  		ALIGN_FUNCTION();					\
>  		VMLINUX_SYMBOL(__softirqentry_text_start) = .;		\
>  		*(.softirqentry.text)					\
>  		VMLINUX_SYMBOL(__softirqentry_text_end) = .;
> -#else
> -#define SOFTIRQENTRY_TEXT
> -#endif
>  
>  /* Section used for early init (in .S files) */
>  #define HEAD_TEXT  *(.head.text)
> diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
> index a2fddddb0d60..59ba11661b6e 100644
> --- a/include/linux/interrupt.h
> +++ b/include/linux/interrupt.h
> @@ -18,6 +18,7 @@
>  #include <linux/atomic.h>
>  #include <asm/ptrace.h>
>  #include <asm/irq.h>
> +#include <asm/sections.h>
>  
>  /*
>   * These correspond to the IORESOURCE_IRQ_* defines in
> @@ -726,7 +727,6 @@ extern int early_irq_init(void);
>  extern int arch_probe_nr_irqs(void);
>  extern int arch_early_irq_init(void);
>  
> -#if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN)
>  /*
>   * We want to know which function is an entrypoint of a hardirq or a softirq.
>   */
> @@ -734,16 +734,4 @@ extern int arch_early_irq_init(void);
>  #define __softirq_entry  \
>  	__attribute__((__section__(".softirqentry.text")))
>  
> -/* Limits of hardirq entrypoints */
> -extern char __irqentry_text_start[];
> -extern char __irqentry_text_end[];
> -/* Limits of softirq entrypoints */
> -extern char __softirqentry_text_start[];
> -extern char __softirqentry_text_end[];
> -
> -#else
> -#define __irq_entry
> -#define __softirq_entry
> -#endif
> -
>  #endif
> 


-- 
Masami Hiramatsu <mhiramat@kernel.org>

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

end of thread, other threads:[~2017-07-28 13:59 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-28 12:24 [PATCH -tip v6 1/2] irq: Make irqentry text section unconditional Masami Hiramatsu
2017-07-28 12:25 ` [PATCH -tip v6 2/2] [BUGFIX] kprobes/x86: Do not jump-optimize kprobes on irq entry code Masami Hiramatsu
2017-07-28 13:59 ` [PATCH -tip v6 1/2] irq: Make irqentry text section unconditional Masami Hiramatsu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.