Re: [PATCH bpf-next v3 3/5] error-injection: Separate error-injection from kprobe
On Wed, 10 Jan 2018 10:36:15 -0500 Josef Bacik wrote: > On Wed, Jan 10, 2018 at 07:18:05PM +0900, Masami Hiramatsu wrote: > > Since error-injection framework is not limited to be used > > by kprobes, nor bpf. Other kernel subsystems can use it > > freely for checking safeness of error-injection, e.g. > > livepatch, ftrace etc. > > So this separate error-injection framework from kprobes. > > > > Some differences has been made: > > > > - "kprobe" word is removed from any APIs/structures. > > - BPF_ALLOW_ERROR_INJECTION() is renamed to > > ALLOW_ERROR_INJECTION() since it is not limited for BPF too. > > - CONFIG_FUNCTION_ERROR_INJECTION is the config item of this > > feature. It is automatically enabled if the arch supports > > error injection feature for kprobe or ftrace etc. > > > > Signed-off-by: Masami Hiramatsu > > --- > > Changes in v3: > >- Fix a build error for asmlinkage on i386 by including compiler.h > >- Fix "CONFIG_FUNCTION_ERROR_INJECT" typo. > >- Separate CONFIG_MODULES dependent code > >- Add CONFIG_KPROBES dependency for arch_deref_entry_point() > >- Call error-injection init function in late_initcall stage. > >- Fix read-side mutex lock > >- Some cosmetic cleanups > > --- > > arch/Kconfig |2 > > arch/x86/Kconfig |2 > > arch/x86/include/asm/error-injection.h | 13 ++ > > arch/x86/kernel/kprobes/core.c | 14 -- > > arch/x86/lib/Makefile |1 > > arch/x86/lib/error-inject.c| 19 +++ > > fs/btrfs/disk-io.c |2 > > fs/btrfs/free-space-cache.c|2 > > include/asm-generic/error-injection.h | 20 +++ > > include/asm-generic/vmlinux.lds.h | 14 +- > > include/linux/bpf.h| 12 -- > > include/linux/error-injection.h| 21 +++ > > include/linux/kprobes.h|1 > > include/linux/module.h |6 - > > kernel/kprobes.c | 163 > > kernel/module.c|8 + > > kernel/trace/Kconfig |2 > > kernel/trace/bpf_trace.c |2 > > kernel/trace/trace_kprobe.c|3 > > lib/Kconfig.debug |4 + > > lib/Makefile |1 > > lib/error-inject.c | 213 > > > > 22 files changed, 315 insertions(+), 210 deletions(-) > > create mode 100644 arch/x86/include/asm/error-injection.h > > create mode 100644 arch/x86/lib/error-inject.c > > create mode 100644 include/asm-generic/error-injection.h > > create mode 100644 include/linux/error-injection.h > > create mode 100644 lib/error-inject.c > > > > diff --git a/arch/Kconfig b/arch/Kconfig > > index d3f4aaf9cb7a..97376accfb14 100644 > > --- a/arch/Kconfig > > +++ b/arch/Kconfig > > @@ -196,7 +196,7 @@ config HAVE_OPTPROBES > > config HAVE_KPROBES_ON_FTRACE > > bool > > > > -config HAVE_KPROBE_OVERRIDE > > +config HAVE_FUNCTION_ERROR_INJECTION > > bool > > > > config HAVE_NMI > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > > index 45dc6233f2b9..366b19cb79b7 100644 > > --- a/arch/x86/Kconfig > > +++ b/arch/x86/Kconfig > > @@ -154,7 +154,7 @@ config X86 > > select HAVE_KERNEL_XZ > > select HAVE_KPROBES > > select HAVE_KPROBES_ON_FTRACE > > - select HAVE_KPROBE_OVERRIDE > > + select HAVE_FUNCTION_ERROR_INJECTION > > select HAVE_KRETPROBES > > select HAVE_KVM > > select HAVE_LIVEPATCH if X86_64 > > diff --git a/arch/x86/include/asm/error-injection.h > > b/arch/x86/include/asm/error-injection.h > > new file mode 100644 > > index ..47b7a1296245 > > --- /dev/null > > +++ b/arch/x86/include/asm/error-injection.h > > @@ -0,0 +1,13 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > +#ifndef _ASM_ERROR_INJECTION_H > > +#define _ASM_ERROR_INJECTION_H > > + > > +#include > > +#include > > +#include > > +#include > > + > > +asmlinkage void just_return_func(void); > > +void override_function_with_return(struct pt_regs *regs); > > + > > +#endif /* _ASM_ERROR_INJECTION_H */ > > diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c > > index b02a377d5905..bd36f3c33cd0 100644 > > --- a/arch/x86/kernel/kprobes/core.c > > +++ b/arch/x86/kernel/kprobes/core.c > > @@ -1183,17 +1183,3 @@ int arch_trampoline_kprobe(struct kprobe *p) > > { > > return 0; > > } > > - > > -asmlinkage void override_func(void); > > -asm( > > - ".type override_func, @function\n" > > - "override_func:\n" > > - " ret\n" > > - ".size override_func, .-override_func\n" > > -); > > - > > -void arch_kprobe_override_function(struct pt_regs *regs) > > -{ > > - regs->ip = (unsigned long)&override_func; > > -} > > -NOKPROBE_SYMBOL(arch_kprobe_override_function); > > diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefil
Re: [PATCH bpf-next v3 3/5] error-injection: Separate error-injection from kprobe
On Wed, Jan 10, 2018 at 07:18:05PM +0900, Masami Hiramatsu wrote: > Since error-injection framework is not limited to be used > by kprobes, nor bpf. Other kernel subsystems can use it > freely for checking safeness of error-injection, e.g. > livepatch, ftrace etc. > So this separate error-injection framework from kprobes. > > Some differences has been made: > > - "kprobe" word is removed from any APIs/structures. > - BPF_ALLOW_ERROR_INJECTION() is renamed to > ALLOW_ERROR_INJECTION() since it is not limited for BPF too. > - CONFIG_FUNCTION_ERROR_INJECTION is the config item of this > feature. It is automatically enabled if the arch supports > error injection feature for kprobe or ftrace etc. > > Signed-off-by: Masami Hiramatsu > --- > Changes in v3: >- Fix a build error for asmlinkage on i386 by including compiler.h >- Fix "CONFIG_FUNCTION_ERROR_INJECT" typo. >- Separate CONFIG_MODULES dependent code >- Add CONFIG_KPROBES dependency for arch_deref_entry_point() >- Call error-injection init function in late_initcall stage. >- Fix read-side mutex lock >- Some cosmetic cleanups > --- > arch/Kconfig |2 > arch/x86/Kconfig |2 > arch/x86/include/asm/error-injection.h | 13 ++ > arch/x86/kernel/kprobes/core.c | 14 -- > arch/x86/lib/Makefile |1 > arch/x86/lib/error-inject.c| 19 +++ > fs/btrfs/disk-io.c |2 > fs/btrfs/free-space-cache.c|2 > include/asm-generic/error-injection.h | 20 +++ > include/asm-generic/vmlinux.lds.h | 14 +- > include/linux/bpf.h| 12 -- > include/linux/error-injection.h| 21 +++ > include/linux/kprobes.h|1 > include/linux/module.h |6 - > kernel/kprobes.c | 163 > kernel/module.c|8 + > kernel/trace/Kconfig |2 > kernel/trace/bpf_trace.c |2 > kernel/trace/trace_kprobe.c|3 > lib/Kconfig.debug |4 + > lib/Makefile |1 > lib/error-inject.c | 213 > > 22 files changed, 315 insertions(+), 210 deletions(-) > create mode 100644 arch/x86/include/asm/error-injection.h > create mode 100644 arch/x86/lib/error-inject.c > create mode 100644 include/asm-generic/error-injection.h > create mode 100644 include/linux/error-injection.h > create mode 100644 lib/error-inject.c > > diff --git a/arch/Kconfig b/arch/Kconfig > index d3f4aaf9cb7a..97376accfb14 100644 > --- a/arch/Kconfig > +++ b/arch/Kconfig > @@ -196,7 +196,7 @@ config HAVE_OPTPROBES > config HAVE_KPROBES_ON_FTRACE > bool > > -config HAVE_KPROBE_OVERRIDE > +config HAVE_FUNCTION_ERROR_INJECTION > bool > > config HAVE_NMI > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > index 45dc6233f2b9..366b19cb79b7 100644 > --- a/arch/x86/Kconfig > +++ b/arch/x86/Kconfig > @@ -154,7 +154,7 @@ config X86 > select HAVE_KERNEL_XZ > select HAVE_KPROBES > select HAVE_KPROBES_ON_FTRACE > - select HAVE_KPROBE_OVERRIDE > + select HAVE_FUNCTION_ERROR_INJECTION > select HAVE_KRETPROBES > select HAVE_KVM > select HAVE_LIVEPATCH if X86_64 > diff --git a/arch/x86/include/asm/error-injection.h > b/arch/x86/include/asm/error-injection.h > new file mode 100644 > index ..47b7a1296245 > --- /dev/null > +++ b/arch/x86/include/asm/error-injection.h > @@ -0,0 +1,13 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef _ASM_ERROR_INJECTION_H > +#define _ASM_ERROR_INJECTION_H > + > +#include > +#include > +#include > +#include > + > +asmlinkage void just_return_func(void); > +void override_function_with_return(struct pt_regs *regs); > + > +#endif /* _ASM_ERROR_INJECTION_H */ > diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c > index b02a377d5905..bd36f3c33cd0 100644 > --- a/arch/x86/kernel/kprobes/core.c > +++ b/arch/x86/kernel/kprobes/core.c > @@ -1183,17 +1183,3 @@ int arch_trampoline_kprobe(struct kprobe *p) > { > return 0; > } > - > -asmlinkage void override_func(void); > -asm( > - ".type override_func, @function\n" > - "override_func:\n" > - " ret\n" > - ".size override_func, .-override_func\n" > -); > - > -void arch_kprobe_override_function(struct pt_regs *regs) > -{ > - regs->ip = (unsigned long)&override_func; > -} > -NOKPROBE_SYMBOL(arch_kprobe_override_function); > diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile > index 7b181b61170e..171377b83be1 100644 > --- a/arch/x86/lib/Makefile > +++ b/arch/x86/lib/Makefile > @@ -26,6 +26,7 @@ lib-y += memcpy_$(BITS).o > lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o > lib-$(CONFIG_INSTRUCTION_DECODER) += insn.o inat.o insn-eval.o > lib-$