I've got similar panic right after skype start Disabling of SMAP via loader tunable workarounded the panic for me. Applying of the patch make skype eating 100%CPU in unkillable state. tail of ktrace dump 1238 skype CALL linux_gettid 1238 skype RET linux_gettid 101123/0x18b03 1238 skype CALL linux_sys_futex(0x3301edc,0x84,0x1,0x7fffffff,0x3301ec0,0x2) 1238 skype RET linux_sys_futex 0 1238 skype CALL linux_sys_futex(0x33b0fac,0x80,0x1,0,0x33b0f90,0x1) 1238 skype CALL linux_sys_futex(0x3301edc,0x80,0x1,0,0x3301ec0,0x1) 1238 skype RET linux_sys_futex -1 errno -11 Resource temporarily unavailable 1238 skype CALL linux_sys_futex(0x3301ec0,0x81,0x1,0x3301ec0,0x33b02c8,0xffffc168) 1238 skype RET linux_sys_futex 0 1238 skype CALL linux_sys_futex(0x33b0fac,0x85,0x1,0x1,0x33b0fa8,0x4000001) -- here it stops -- ddb also shows that process is looping somewhere inside linux_sys_futex() KDB: enter: manual escape to debugger [ thread pid 11 tid 100014 ] Stopped at kdb_enter+0x3b: movq $0,kdb_why db> bt 1238 Tracing pid 1238 tid 101049 td 0xfffff80157a64000 cpustop_handler() at cpustop_handler+0x28/frame 0xfffffe00009d6df0 ipi_nmi_handler() at ipi_nmi_handler+0x44/frame 0xfffffe00009d6e10 trap() at trap+0x49/frame 0xfffffe00009d6f20 nmi_calltrap() at nmi_calltrap+0x8/frame 0xfffffe00009d6f20 --- trap 0x13, rip = 0xffffffff80709219, rsp = 0xfffffe00a8c906d0, rbp = 0xfffffe00a8c90750 --- witness_unlock() at witness_unlock+0x139/frame 0xfffffe00a8c90750 __mtx_unlock_flags() at __mtx_unlock_flags+0x5d/frame 0xfffffe00a8c90790 futex_put() at futex_put+0x134/frame 0xfffffe00a8c907c0 linux_sys_futex() at linux_sys_futex+0x609/frame 0xfffffe00a8c90880 ia32_syscall() at ia32_syscall+0x282/frame 0xfffffe00a8c909b0 int0x80_syscall_common() at int0x80_syscall_common+0x9c/frame 0x4000001 On 06.08.2018 15:03, Johannes Lundberg wrote: > On Sat, Aug 4, 2018 at 3:22 PM Konstantin Belousov <kostikbel_at_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 >> _at__at_ -78,6 +78,9 _at__at_ __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> >> _at__at_ -88,8 +91,6 _at__at_ __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) >> { >> _at__at_ -276,3 +277,48 _at__at_ 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 >> _at__at_ -38,7 +38,7 _at__at_ 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 >> _at__at_ -49,25 +49,58 _at__at_ 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 >> _at__at_ -85,9 +118,31 _at__at_ 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 >> _at__at_ -105,9 +160,51 _at__at_ 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 >> _at__at_ -116,13 +213,15 _at__at_ 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 >> _at__at_ -58,10 +58,12 _at__at_ __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> >> _at__at_ -822,3 +824,48 _at__at_ 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 >> _at__at_ -38,7 +38,7 _at__at_ 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 >> _at__at_ -49,25 +49,58 _at__at_ 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 >> _at__at_ -85,9 +118,31 _at__at_ 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 >> _at__at_ -105,9 +160,51 _at__at_ 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 >> _at__at_ -116,13 +213,15 _at__at_ 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) >> > _______________________________________________ > freebsd-current_at_freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/freebsd-current > To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org"Received on Mon Aug 06 2018 - 13:27:42 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:17 UTC