From 2495095104de841f12a17aeb94207055f75ed897 Mon Sep 17 00:00:00 2001 From: Daniel Barlow Date: Sat, 19 Apr 2003 20:11:31 +0000 Subject: [PATCH] 0.pre8.75 SMP fix: mutex around all access to modify_ldt() function (necessary but not, I regret, sufficient to make it work on SMP) --- src/runtime/runtime.c | 3 +-- src/runtime/x86-linux-os.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 7b070c9..620e7b6 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -384,7 +384,6 @@ static void parent_do_garbage_collect(void) for_each_thread(th) { if(ptrace(PTRACE_ATTACH,th->pid,0,0)) { - fprintf(stderr,"attaching to %d ...",th->pid); perror("PTRACE_ATTACH"); } else waiting_threads++; @@ -421,7 +420,7 @@ static void parent_do_garbage_collect(void) * event to wait for */ fprintf(stderr, "%d was pseudo-atomic, letting it resume \n", th->pid); - SetTlSymbolValue(PSEUDO_ATOMIC_INTERRUPTED,1,th) ; + SetTlSymbolValue(PSEUDO_ATOMIC_INTERRUPTED,make_fixnum(1),th); if(ptrace(PTRACE_CONT,th->pid,0,0)) perror("PTRACE_CONT"); waiting_threads++; diff --git a/src/runtime/x86-linux-os.c b/src/runtime/x86-linux-os.c index 140f0fd..b952e6a 100644 --- a/src/runtime/x86-linux-os.c +++ b/src/runtime/x86-linux-os.c @@ -60,6 +60,8 @@ void debug_get_ldt() printf("%d bytes in ldt: print/x local_ldt_copy\n", n); } +lispobj modify_ldt_lock; /* protect all calls to modify_ldt */ + int arch_os_thread_init(struct thread *thread) { stack_t sigstack; #ifdef LISP_FEATURE_SB_THREAD @@ -70,6 +72,8 @@ int arch_os_thread_init(struct thread *thread) { 1, 0, 0, /* index, address, length filled in later */ 1, MODIFY_LDT_CONTENTS_DATA, 0, 0, 0, 1 }; + get_spinlock(&modify_ldt_lock,thread); + /* get next free ldt entry */ int n=modify_ldt(0,local_ldt_copy,sizeof local_ldt_copy); if(n) { @@ -81,7 +85,8 @@ int arch_os_thread_init(struct thread *thread) { ldt_entry.base_addr=(unsigned long) thread; ldt_entry.limit=dynamic_values_bytes; ldt_entry.limit_in_pages=0; - if (modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) + if (modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) { + modify_ldt_lock=0; /* modify_ldt call failed: something magical is not happening */ return -1; __asm__ __volatile__ ("movw %w0, %%fs" : : "q" @@ -89,6 +94,8 @@ int arch_os_thread_init(struct thread *thread) { + (1 << 2) /* TI set = LDT */ + 3)); /* privilege level */ thread->tls_cookie=n; + modify_ldt_lock=0; + if(n<0) return 0; #endif #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK @@ -130,9 +137,13 @@ int arch_os_thread_cleanup(struct thread *thread) { }; ldt_entry.entry_number=thread->tls_cookie; - if (modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) + get_spinlock(&modify_ldt_lock,thread); + if (modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) { + modify_ldt_lock=0; /* modify_ldt call failed: something magical is not happening */ return 0; + } + modify_ldt_lock=0; return 1; } -- 1.7.10.4