Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Aug 2018 13:03:46 +0100
From:      Johannes Lundberg <johalun0@gmail.com>
To:        Konstantin Belousov <kostikbel@gmail.com>
Cc:        freebsd-current <freebsd-current@freebsd.org>
Subject:   Re: Linux process causes kernel panic
Message-ID:  <CAECmPwu9eqH2UJo0LMNDj7nPXu7S1%2B9OWnd1swAabZLXcxo1Dg@mail.gmail.com>
In-Reply-To: <20180804142235.GM6049@kib.kiev.ua>
References:  <CAECmPwvAaSTimVyV1n%2B9PNKd_0JP6kLXnXyihoWEB3FHRHqa9w@mail.gmail.com> <20180803204250.GE6049@kib.kiev.ua> <CAECmPwt0kifzPFpgyYWJj7UvnUn2CGjUfQz2tuS5G0BYttTkZQ@mail.gmail.com> <20180804142235.GM6049@kib.kiev.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Aug 4, 2018 at 3:22 PM Konstantin Belousov <kostikbel@gmail.com>
wrote:

> On Sat, Aug 04, 2018 at 01:12:17PM +0100, Johannes Lundberg wrote:
> > No panic over night with that tunable so it seems you're on the right
> > track.
>
> Please try this, on top of r337316.
>

Been running boinc client now with 4 linux processes at 100% cpu load with
this patch for a while. So far so good.


> diff --git a/sys/amd64/linux/linux_machdep.c
> b/sys/amd64/linux/linux_machdep.c
> index 6c5b014853f..434ea0eac07 100644
> --- a/sys/amd64/linux/linux_machdep.c
> +++ b/sys/amd64/linux/linux_machdep.c
> @@ -78,6 +78,9 @@ __FBSDID("$FreeBSD$");
>  #include <vm/vm_kern.h>
>  #include <vm/vm_map.h>
>
> +#include <x86/ifunc.h>
> +#include <x86/sysarch.h>
> +
>  #include <amd64/linux/linux.h>
>  #include <amd64/linux/linux_proto.h>
>  #include <compat/linux/linux_emul.h>
> @@ -88,8 +91,6 @@ __FBSDID("$FreeBSD$");
>  #include <compat/linux/linux_signal.h>
>  #include <compat/linux/linux_util.h>
>
> -#include <x86/include/sysarch.h>
> -
>  int
>  linux_execve(struct thread *td, struct linux_execve_args *args)
>  {
> @@ -276,3 +277,48 @@ linux_set_cloned_tls(struct thread *td, void *desc)
>
>         return (0);
>  }
> +
> +int futex_xchgl_nosmap(int oparg, uint32_t *uaddr, int *oldval);
> +int futex_xchgl_smap(int oparg, uint32_t *uaddr, int *oldval);
> +DEFINE_IFUNC(, int, futex_xchgl, (int, uint32_t *, int *), static)
> +{
> +
> +       return ((cpu_stdext_feature & CPUID_STDEXT_SMAP) != 0 ?
> +           futex_xchgl_smap : futex_xchgl_nosmap);
> +}
> +
> +int futex_addl_nosmap(int oparg, uint32_t *uaddr, int *oldval);
> +int futex_addl_smap(int oparg, uint32_t *uaddr, int *oldval);
> +DEFINE_IFUNC(, int, futex_addl, (int, uint32_t *, int *), static)
> +{
> +
> +       return ((cpu_stdext_feature & CPUID_STDEXT_SMAP) != 0 ?
> +           futex_addl_smap : futex_addl_nosmap);
> +}
> +
> +int futex_orl_nosmap(int oparg, uint32_t *uaddr, int *oldval);
> +int futex_orl_smap(int oparg, uint32_t *uaddr, int *oldval);
> +DEFINE_IFUNC(, int, futex_orl, (int, uint32_t *, int *), static)
> +{
> +
> +       return ((cpu_stdext_feature & CPUID_STDEXT_SMAP) != 0 ?
> +           futex_orl_smap : futex_orl_nosmap);
> +}
> +
> +int futex_andl_nosmap(int oparg, uint32_t *uaddr, int *oldval);
> +int futex_andl_smap(int oparg, uint32_t *uaddr, int *oldval);
> +DEFINE_IFUNC(, int, futex_andl, (int, uint32_t *, int *), static)
> +{
> +
> +       return ((cpu_stdext_feature & CPUID_STDEXT_SMAP) != 0 ?
> +           futex_andl_smap : futex_andl_nosmap);
> +}
> +
> +int futex_xorl_nosmap(int oparg, uint32_t *uaddr, int *oldval);
> +int futex_xorl_smap(int oparg, uint32_t *uaddr, int *oldval);
> +DEFINE_IFUNC(, int, futex_xorl, (int, uint32_t *, int *), static)
> +{
> +
> +       return ((cpu_stdext_feature & CPUID_STDEXT_SMAP) != 0 ?
> +           futex_xorl_smap : futex_xorl_nosmap);
> +}
> diff --git a/sys/amd64/linux/linux_support.s
> b/sys/amd64/linux/linux_support.s
> index a9f02160be2..391f76414f2 100644
> --- a/sys/amd64/linux/linux_support.s
> +++ b/sys/amd64/linux/linux_support.s
> @@ -38,7 +38,7 @@ futex_fault:
>         movl    $-EFAULT,%eax
>         ret
>
> -ENTRY(futex_xchgl)
> +ENTRY(futex_xchgl_nosmap)
>         movq    PCPU(CURPCB),%r8
>         movq    $futex_fault,PCB_ONFAULT(%r8)
>         movq    $VM_MAXUSER_ADDRESS-4,%rax
> @@ -49,25 +49,58 @@ ENTRY(futex_xchgl)
>         xorl    %eax,%eax
>         movq    %rax,PCB_ONFAULT(%r8)
>         ret
> -END(futex_xchgl)
> +END(futex_xchgl_nosmap)
>
> -ENTRY(futex_addl)
> +ENTRY(futex_xchgl_smap)
>         movq    PCPU(CURPCB),%r8
>         movq    $futex_fault,PCB_ONFAULT(%r8)
>         movq    $VM_MAXUSER_ADDRESS-4,%rax
>         cmpq    %rax,%rsi
>         ja      futex_fault
> +       stac
> +       xchgl   %edi,(%rsi)
> +       clac
> +       movl    %edi,(%rdx)
> +       xorl    %eax,%eax
> +       movq    %rax,PCB_ONFAULT(%r8)
> +       ret
> +END(futex_xchgl_smap)
> +
> +ENTRY(futex_addl_nosmap)
> +       movq    PCPU(CURPCB),%r8
> +       movq    $futex_fault,PCB_ONFAULT(%r8)
> +       movq    $VM_MAXUSER_ADDRESS-4,%rax
> +       cmpq    %rax,%rsi
> +       ja      futex_fault
> +#ifdef SMP
> +       lock
> +#endif
> +       xaddl   %edi,(%rsi)
> +       movl    %edi,(%rdx)
> +       xorl    %eax,%eax
> +       movq    %rax,PCB_ONFAULT(%r8)
> +       ret
> +END(futex_addl_nosmap)
> +
> +ENTRY(futex_addl_smap)
> +       movq    PCPU(CURPCB),%r8
> +       movq    $futex_fault,PCB_ONFAULT(%r8)
> +       movq    $VM_MAXUSER_ADDRESS-4,%rax
> +       cmpq    %rax,%rsi
> +       ja      futex_fault
> +       stac
>  #ifdef SMP
>         lock
>  #endif
>         xaddl   %edi,(%rsi)
> +       clac
>         movl    %edi,(%rdx)
>         xorl    %eax,%eax
>         movq    %rax,PCB_ONFAULT(%r8)
>         ret
> -END(futex_addl)
> +END(futex_addl_smap)
>
> -ENTRY(futex_orl)
> +ENTRY(futex_orl_nosmap)
>         movq    PCPU(CURPCB),%r8
>         movq    $futex_fault,PCB_ONFAULT(%r8)
>         movq    $VM_MAXUSER_ADDRESS-4,%rax
> @@ -85,9 +118,31 @@ ENTRY(futex_orl)
>         xorl    %eax,%eax
>         movq    %rax,PCB_ONFAULT(%r8)
>         ret
> -END(futex_orl)
> +END(futex_orl_nosmap)
>
> -ENTRY(futex_andl)
> +ENTRY(futex_orl_smap)
> +       movq    PCPU(CURPCB),%r8
> +       movq    $futex_fault,PCB_ONFAULT(%r8)
> +       movq    $VM_MAXUSER_ADDRESS-4,%rax
> +       cmpq    %rax,%rsi
> +       ja      futex_fault
> +       movl    (%rsi),%eax
> +1:     movl    %eax,%ecx
> +       orl     %edi,%ecx
> +       stac
> +#ifdef SMP
> +       lock
> +#endif
> +       cmpxchgl %ecx,(%rsi)
> +       clac
> +       jnz     1b
> +       movl    %eax,(%rdx)
> +       xorl    %eax,%eax
> +       movq    %rax,PCB_ONFAULT(%r8)
> +       ret
> +END(futex_orl_smap)
> +
> +ENTRY(futex_andl_nosmap)
>         movq    PCPU(CURPCB),%r8
>         movq    $futex_fault,PCB_ONFAULT(%r8)
>         movq    $VM_MAXUSER_ADDRESS-4,%rax
> @@ -105,9 +160,51 @@ ENTRY(futex_andl)
>         xorl    %eax,%eax
>         movq    %rax,PCB_ONFAULT(%r8)
>         ret
> -END(futex_andl)
> +END(futex_andl_nosmap)
> +
> +ENTRY(futex_andl_smap)
> +       movq    PCPU(CURPCB),%r8
> +       movq    $futex_fault,PCB_ONFAULT(%r8)
> +       movq    $VM_MAXUSER_ADDRESS-4,%rax
> +       cmpq    %rax,%rsi
> +       ja      futex_fault
> +       movl    (%rsi),%eax
> +1:     movl    %eax,%ecx
> +       andl    %edi,%ecx
> +       stac
> +#ifdef SMP
> +       lock
> +#endif
> +       cmpxchgl %ecx,(%rsi)
> +       clac
> +       jnz     1b
> +       movl    %eax,(%rdx)
> +       xorl    %eax,%eax
> +       movq    %rax,PCB_ONFAULT(%r8)
> +       ret
> +END(futex_andl_smap)
> +
> +ENTRY(futex_xorl_nosmap)
> +       movq    PCPU(CURPCB),%r8
> +       movq    $futex_fault,PCB_ONFAULT(%r8)
> +       movq    $VM_MAXUSER_ADDRESS-4,%rax
> +       cmpq    %rax,%rsi
> +       ja      futex_fault
> +       movl    (%rsi),%eax
> +1:     movl    %eax,%ecx
> +       xorl    %edi,%ecx
> +#ifdef SMP
> +       lock
> +#endif
> +       cmpxchgl %ecx,(%rsi)
> +       jnz     1b
> +       movl    %eax,(%rdx)
> +       xorl    %eax,%eax
> +       movq    %rax,PCB_ONFAULT(%r8)
> +       ret
> +END(futex_xorl_nosmap)
>
> -ENTRY(futex_xorl)
> +ENTRY(futex_xorl_smap)
>         movq    PCPU(CURPCB),%r8
>         movq    $futex_fault,PCB_ONFAULT(%r8)
>         movq    $VM_MAXUSER_ADDRESS-4,%rax
> @@ -116,13 +213,15 @@ ENTRY(futex_xorl)
>         movl    (%rsi),%eax
>  1:     movl    %eax,%ecx
>         xorl    %edi,%ecx
> +       stac
>  #ifdef SMP
>         lock
>  #endif
>         cmpxchgl %ecx,(%rsi)
> +       clac
>         jnz     1b
>         movl    %eax,(%rdx)
>         xorl    %eax,%eax
>         movq    %rax,PCB_ONFAULT(%r8)
>         ret
> -END(futex_xorl)
> +END(futex_xorl_smap)
> diff --git a/sys/amd64/linux32/linux32_machdep.c
> b/sys/amd64/linux32/linux32_machdep.c
> index ce06be57e9f..61ecc87dc77 100644
> --- a/sys/amd64/linux32/linux32_machdep.c
> +++ b/sys/amd64/linux32/linux32_machdep.c
> @@ -58,10 +58,12 @@ __FBSDID("$FreeBSD$");
>  #include <sys/wait.h>
>
>  #include <machine/frame.h>
> +#include <machine/md_var.h>
>  #include <machine/pcb.h>
>  #include <machine/psl.h>
>  #include <machine/segments.h>
>  #include <machine/specialreg.h>
> +#include <x86/ifunc.h>
>
>  #include <vm/pmap.h>
>  #include <vm/vm.h>
> @@ -822,3 +824,48 @@ linux_set_thread_area(struct thread *td,
>
>         return (0);
>  }
> +
> +int futex_xchgl_nosmap(int oparg, uint32_t *uaddr, int *oldval);
> +int futex_xchgl_smap(int oparg, uint32_t *uaddr, int *oldval);
> +DEFINE_IFUNC(, int, futex_xchgl, (int, uint32_t *, int *), static)
> +{
> +
> +       return ((cpu_stdext_feature & CPUID_STDEXT_SMAP) != 0 ?
> +           futex_xchgl_smap : futex_xchgl_nosmap);
> +}
> +
> +int futex_addl_nosmap(int oparg, uint32_t *uaddr, int *oldval);
> +int futex_addl_smap(int oparg, uint32_t *uaddr, int *oldval);
> +DEFINE_IFUNC(, int, futex_addl, (int, uint32_t *, int *), static)
> +{
> +
> +       return ((cpu_stdext_feature & CPUID_STDEXT_SMAP) != 0 ?
> +           futex_addl_smap : futex_addl_nosmap);
> +}
> +
> +int futex_orl_nosmap(int oparg, uint32_t *uaddr, int *oldval);
> +int futex_orl_smap(int oparg, uint32_t *uaddr, int *oldval);
> +DEFINE_IFUNC(, int, futex_orl, (int, uint32_t *, int *), static)
> +{
> +
> +       return ((cpu_stdext_feature & CPUID_STDEXT_SMAP) != 0 ?
> +           futex_orl_smap : futex_orl_nosmap);
> +}
> +
> +int futex_andl_nosmap(int oparg, uint32_t *uaddr, int *oldval);
> +int futex_andl_smap(int oparg, uint32_t *uaddr, int *oldval);
> +DEFINE_IFUNC(, int, futex_andl, (int, uint32_t *, int *), static)
> +{
> +
> +       return ((cpu_stdext_feature & CPUID_STDEXT_SMAP) != 0 ?
> +           futex_andl_smap : futex_andl_nosmap);
> +}
> +
> +int futex_xorl_nosmap(int oparg, uint32_t *uaddr, int *oldval);
> +int futex_xorl_smap(int oparg, uint32_t *uaddr, int *oldval);
> +DEFINE_IFUNC(, int, futex_xorl, (int, uint32_t *, int *), static)
> +{
> +
> +       return ((cpu_stdext_feature & CPUID_STDEXT_SMAP) != 0 ?
> +           futex_xorl_smap : futex_xorl_nosmap);
> +}
> diff --git a/sys/amd64/linux32/linux32_support.s
> b/sys/amd64/linux32/linux32_support.s
> index bba0d8d5e71..981bba9f582 100644
> --- a/sys/amd64/linux32/linux32_support.s
> +++ b/sys/amd64/linux32/linux32_support.s
> @@ -38,7 +38,7 @@ futex_fault:
>         movl    $-EFAULT,%eax
>         ret
>
> -ENTRY(futex_xchgl)
> +ENTRY(futex_xchgl_nosmap)
>         movq    PCPU(CURPCB),%r8
>         movq    $futex_fault,PCB_ONFAULT(%r8)
>         movq    $VM_MAXUSER_ADDRESS-4,%rax
> @@ -49,25 +49,58 @@ ENTRY(futex_xchgl)
>         xorl    %eax,%eax
>         movq    %rax,PCB_ONFAULT(%r8)
>         ret
> -END(futex_xchgl)
> +END(futex_xchgl_nosmap)
>
> -ENTRY(futex_addl)
> +ENTRY(futex_xchgl_smap)
>         movq    PCPU(CURPCB),%r8
>         movq    $futex_fault,PCB_ONFAULT(%r8)
>         movq    $VM_MAXUSER_ADDRESS-4,%rax
>         cmpq    %rax,%rsi
>         ja      futex_fault
> +       stac
> +       xchgl   %edi,(%rsi)
> +       clac
> +       movl    %edi,(%rdx)
> +       xorl    %eax,%eax
> +       movq    %rax,PCB_ONFAULT(%r8)
> +       ret
> +END(futex_xchgl_smap)
> +
> +ENTRY(futex_addl_nosmap)
> +       movq    PCPU(CURPCB),%r8
> +       movq    $futex_fault,PCB_ONFAULT(%r8)
> +       movq    $VM_MAXUSER_ADDRESS-4,%rax
> +       cmpq    %rax,%rsi
> +       ja      futex_fault
> +#ifdef SMP
> +       lock
> +#endif
> +       xaddl   %edi,(%rsi)
> +       movl    %edi,(%rdx)
> +       xorl    %eax,%eax
> +       movq    %rax,PCB_ONFAULT(%r8)
> +       ret
> +END(futex_addl_nosmap)
> +
> +ENTRY(futex_addl_smap)
> +       movq    PCPU(CURPCB),%r8
> +       movq    $futex_fault,PCB_ONFAULT(%r8)
> +       movq    $VM_MAXUSER_ADDRESS-4,%rax
> +       cmpq    %rax,%rsi
> +       ja      futex_fault
> +       stac
>  #ifdef SMP
>         lock
>  #endif
>         xaddl   %edi,(%rsi)
> +       clac
>         movl    %edi,(%rdx)
>         xorl    %eax,%eax
>         movq    %rax,PCB_ONFAULT(%r8)
>         ret
> -END(futex_addl)
> +END(futex_addl_smap)
>
> -ENTRY(futex_orl)
> +ENTRY(futex_orl_nosmap)
>         movq    PCPU(CURPCB),%r8
>         movq    $futex_fault,PCB_ONFAULT(%r8)
>         movq    $VM_MAXUSER_ADDRESS-4,%rax
> @@ -85,9 +118,31 @@ ENTRY(futex_orl)
>         xorl    %eax,%eax
>         movq    %rax,PCB_ONFAULT(%r8)
>         ret
> -END(futex_orl)
> +END(futex_orl_nosmap)
>
> -ENTRY(futex_andl)
> +ENTRY(futex_orl_smap)
> +       movq    PCPU(CURPCB),%r8
> +       movq    $futex_fault,PCB_ONFAULT(%r8)
> +       movq    $VM_MAXUSER_ADDRESS-4,%rax
> +       cmpq    %rax,%rsi
> +       ja      futex_fault
> +       movl    (%rsi),%eax
> +1:     movl    %eax,%ecx
> +       orl     %edi,%ecx
> +       stac
> +#ifdef SMP
> +       lock
> +#endif
> +       cmpxchgl %ecx,(%rsi)
> +       clac
> +       jnz     1b
> +       movl    %eax,(%rdx)
> +       xorl    %eax,%eax
> +       movq    %rax,PCB_ONFAULT(%r8)
> +       ret
> +END(futex_orl_smap)
> +
> +ENTRY(futex_andl_nosmap)
>         movq    PCPU(CURPCB),%r8
>         movq    $futex_fault,PCB_ONFAULT(%r8)
>         movq    $VM_MAXUSER_ADDRESS-4,%rax
> @@ -105,9 +160,51 @@ ENTRY(futex_andl)
>         xorl    %eax,%eax
>         movq    %rax,PCB_ONFAULT(%r8)
>         ret
> -END(futex_andl)
> +END(futex_andl_nosmap)
> +
> +ENTRY(futex_andl_smap)
> +       movq    PCPU(CURPCB),%r8
> +       movq    $futex_fault,PCB_ONFAULT(%r8)
> +       movq    $VM_MAXUSER_ADDRESS-4,%rax
> +       cmpq    %rax,%rsi
> +       ja      futex_fault
> +       movl    (%rsi),%eax
> +1:     movl    %eax,%ecx
> +       andl    %edi,%ecx
> +       stac
> +#ifdef SMP
> +       lock
> +#endif
> +       cmpxchgl %ecx,(%rsi)
> +       clac
> +       jnz     1b
> +       movl    %eax,(%rdx)
> +       xorl    %eax,%eax
> +       movq    %rax,PCB_ONFAULT(%r8)
> +       ret
> +END(futex_andl_smap)
> +
> +ENTRY(futex_xorl_nosmap)
> +       movq    PCPU(CURPCB),%r8
> +       movq    $futex_fault,PCB_ONFAULT(%r8)
> +       movq    $VM_MAXUSER_ADDRESS-4,%rax
> +       cmpq    %rax,%rsi
> +       ja      futex_fault
> +       movl    (%rsi),%eax
> +1:     movl    %eax,%ecx
> +       xorl    %edi,%ecx
> +#ifdef SMP
> +       lock
> +#endif
> +       cmpxchgl %ecx,(%rsi)
> +       jnz     1b
> +       movl    %eax,(%rdx)
> +       xorl    %eax,%eax
> +       movq    %rax,PCB_ONFAULT(%r8)
> +       ret
> +END(futex_xorl_nosmap)
>
> -ENTRY(futex_xorl)
> +ENTRY(futex_xorl_smap)
>         movq    PCPU(CURPCB),%r8
>         movq    $futex_fault,PCB_ONFAULT(%r8)
>         movq    $VM_MAXUSER_ADDRESS-4,%rax
> @@ -116,13 +213,15 @@ ENTRY(futex_xorl)
>         movl    (%rsi),%eax
>  1:     movl    %eax,%ecx
>         xorl    %edi,%ecx
> +       stac
>  #ifdef SMP
>         lock
>  #endif
>         cmpxchgl %ecx,(%rsi)
> +       clac
>         jnz     1b
>         movl    %eax,(%rdx)
>         xorl    %eax,%eax
>         movq    %rax,PCB_ONFAULT(%r8)
>         ret
> -END(futex_xorl)
> +END(futex_xorl_smap)
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAECmPwu9eqH2UJo0LMNDj7nPXu7S1%2B9OWnd1swAabZLXcxo1Dg>