Re: [PATCH bpf-next v3 3/5] error-injection: Separate error-injection from kprobe

2018-01-10 Thread Masami Hiramatsu
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

2018-01-10 Thread Josef Bacik
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-$