Hi Ingo.
I have some programs that crash in 2.6.12-rc2-mm3. After seeing this: http://www.uwsg.iu.edu/hypermail/linux/kernel/0504.1/1091.html I tried to revert the sched-unlocked-context-switches.patch and indeed the problem goes away. Attached is the (crappy) test-case. If you can make it to say "All OK" then the problem is solved. Apparently the %fs gets trashed somewhere, any ideas?
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <signal.h> #include <linux/unistd.h> #include <asm/ldt.h> #include <asm/ucontext.h>
_syscall3(int, modify_ldt, int, func, void *, ptr, unsigned long, bytecount) static int set_ldt_entry(int entry, unsigned long base, unsigned int limit, int seg_32bit_flag, int contents, int read_only_flag, int limit_in_pages_flag, int seg_not_present, int useable) { struct modify_ldt_ldt_s ldt_info; ldt_info.entry_number = entry; ldt_info.base_addr = base; ldt_info.limit = limit; ldt_info.seg_32bit = seg_32bit_flag; ldt_info.contents = contents; ldt_info.read_exec_only = read_only_flag; ldt_info.limit_in_pages = limit_in_pages_flag; ldt_info.seg_not_present = seg_not_present; ldt_info.useable = useable; return modify_ldt(1, &ldt_info, sizeof(ldt_info)); } int main(int argc, char *argv[]) { unsigned short _ss, new_ss, fs; /* Get SS */ asm volatile( "movw %%ss, %0\n" :"=m"(_ss) ); /* Force to LDT */ new_ss = (_ss & 0xffff) | 4; /* Create the LDT entry */ set_ldt_entry(new_ss >> 3, 0, 0xfffff, 0, MODIFY_LDT_CONTENTS_DATA, 0, 1, 0, 0); asm ("movw %%fs, %0":"=m"(fs)); printf("fs1=0x%hx\n", fs); asm ("movw %0, %%fs"::"a"(new_ss)); asm ("movw %%fs, %0":"=m"(fs)); printf("fs2=0x%hx\n", fs); usleep(0); asm ("movw %%fs, %0":"=m"(fs)); printf("fs3=0x%hx\n", fs); if (fs != new_ss) printf("BUG!\n"); else printf("All OK\n"); return 0; }