Eli, Am 12.03.2016 um 08:08 schrieb Eli Cooper: > Hi Richard, > > On 2016/3/10 4:44, Richard Weinberger wrote: >> Hmm, this needs rework. Having everything on the stack is not good. > > Okay, I'll rework the functions whose stack size is greater than the > warning threshold by using kmalloc.
I fear it is not that easy. Having a kmalloc() per context switch would be every expensive. Even for UML. >> Can you also create a selftest such that this bug cannot happen again? > > It seems that instead of writing a self-test showing this problem cannot > happen again, I wrote a test that manifested another bug that is not > directly related to my patch. > > Without applying my patch, the current UML should support XMM registers > because those are covered by _fpstate and PTRACE_GETFPREGS. But it > seemed that XMM registers are not restored after the signal handler returns. > > In the following quick test, the main loop should run indefinitely > despite XMM registers are modified by the signal handler. But in UML, > the loop breaks randomly within a minute or two, showing that the > registers are corrupted. So far I haven't found the cause. Any hints? Meh. :( Can you figure out whether the issue depends on the host kernel? i.e. try something older and Linus' tree. UML is a heavy user of ptrace(), maybe the recent FPU cleanup on x86 broke something. Thanks, //richard > Thanks, > Eli > > --- > /* test if signal handling preserves XMM registers */ > #include <stdio.h> > #include <unistd.h> > #include <signal.h> > > int count; > > void sighandler(int signum) > { > count++; > > /* alarm(1) without calling libc */ > asm("mov $0x1,%rdi"); > asm("mov $0x25,%rax"); > asm("syscall"); > > asm("movq $0xdeadbeef,%r11"); > /* the following two instructions > * modify xmm0 and xmm1 registers */ > asm("vmovq %r11,%xmm0"); > asm("vmovq %r11,%xmm1"); > } > > int main() > { > struct sigaction act; > double a = 3.14159, b = 2.71828; > > act.sa_handler = sighandler; > act.sa_flags = 0; > sigemptyset(&act.sa_mask); > sigaction(SIGALRM, &act, NULL); > > alarm(1); > > /* this loop should run indefinitely */ > while (a + b == a + b) ; > > printf("count = %d\n", count); > return 1; > } > ------------------------------------------------------------------------------ Transform Data into Opportunity. Accelerate data analysis in your applications with Intel Data Analytics Acceleration Library. Click to learn more. http://pubads.g.doubleclick.net/gampad/clk?id=278785111&iu=/4140 _______________________________________________ User-mode-linux-devel mailing list User-mode-linux-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel