From owner-freebsd-current@freebsd.org Mon Aug 6 12:04:25 2018 Return-Path: Delivered-To: freebsd-current@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 826D81055A7D for ; Mon, 6 Aug 2018 12:04:25 +0000 (UTC) (envelope-from johalun0@gmail.com) Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id D459A759AA for ; Mon, 6 Aug 2018 12:04:24 +0000 (UTC) (envelope-from johalun0@gmail.com) Received: by mail-wr1-x430.google.com with SMTP id r16-v6so12095428wrt.11 for ; Mon, 06 Aug 2018 05:04:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=K2DRqp9LWtm7ybQ/xdeQYuUEBkuGcSQ1rK4+QVr120o=; b=u+HPqXAl7SooZGB0oot9OtgOUL9OOiCkkIm43ONUOWFmkofXGQ6mDmHGwApM5bNNbD h+DsQp8p97WVUlb198oNlAb6BOvRI4Tuq318jq5rJELoYaH8eip+TZ87H9DiOBn/y3jC O/2osoaSe81yNiUdjyD4uLmOT9rkbnxjFWswUnah+9fbGNW/ejj82HmbJ+HHJOvohnt1 wuyvXcQPvhArEbHl47ojH04sVpcJpV4t8lWREydudgJofKp6buTHh41cih6OckKnVOTI 6r/GlNLHZb8cCBI9M0Hc369uGJEPSLhiM9fuUts+vbXz4FE81PDiX2fLvZKxlqpIzNht vI2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=K2DRqp9LWtm7ybQ/xdeQYuUEBkuGcSQ1rK4+QVr120o=; b=npHXMqJRpKHys2s93Bb5m+08eExQGMyPbOJRT9z+/1CG0HZE1eWPlAZVlLxcPpn4XJ ePxuUdifuXesGhei3WyBOT2ObJyqIIguNkhMbPRXjg3jfr2azyem9TF8Lg6FVJZgbdD2 u1xpjJpcdjLPa+1dWMf6jfe6sZfu5QNMlSLzIScek4axXwVlJnxS2iZki8VFuz66PRzJ HD7AXdlvdpmCx5GV8ri75WkGoFVgk9PWCeniDXV28+68U+H7H5+xGpyiKZSnO3zEtvVZ C0x+0M1a4aDDZ3oTsSzi6NeUA2p+R3/CfVhqU16yz3dLIh6RyXJub1ywXeqIJoGkJqpc fw+A== X-Gm-Message-State: AOUpUlFfqIrfsDFMw9mQ04SxJbkDoE4jx5RuGWj+IvAQnsi5dZzp4hJW o2KRGgb8RzulmLK7aZpHxGZUNvENrTUTTk32h5Q= X-Google-Smtp-Source: AAOMgpfUFYYGnYdtVJObr2/ysx9JcH8b+gdOfN7cYpUCpv88LFqGblzG/ACAFPT4UCBehhiygFRWLFUzb5zRmb/9Scw= X-Received: by 2002:adf:e584:: with SMTP id l4-v6mr8841750wrm.190.1533557063634; Mon, 06 Aug 2018 05:04:23 -0700 (PDT) MIME-Version: 1.0 References: <20180803204250.GE6049@kib.kiev.ua> <20180804142235.GM6049@kib.kiev.ua> In-Reply-To: <20180804142235.GM6049@kib.kiev.ua> From: Johannes Lundberg Date: Mon, 6 Aug 2018 13:03:46 +0100 Message-ID: Subject: Re: Linux process causes kernel panic To: Konstantin Belousov Cc: freebsd-current Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.27 X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.27 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 06 Aug 2018 12:04:25 -0000 On Sat, Aug 4, 2018 at 3:22 PM Konstantin Belousov 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 > #include > > +#include > +#include > + > #include > #include > #include > @@ -88,8 +91,6 @@ __FBSDID("$FreeBSD$"); > #include > #include > > -#include > - > 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 > > #include > +#include > #include > #include > #include > #include > +#include > > #include > #include > @@ -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) >