From 7aa331d83b8dd23d3ca7530fa582cec528df274a Mon Sep 17 00:00:00 2001 From: John Hodge Date: Tue, 29 Nov 2011 23:19:05 +0800 Subject: [PATCH] Kernel - Disable nested locks in x86, added workqueue to build --- Kernel/Makefile | 2 +- Kernel/arch/x86/include/arch.h | 8 ----- Kernel/arch/x86/lib.c | 60 +--------------------------------- 3 files changed, 2 insertions(+), 68 deletions(-) diff --git a/Kernel/Makefile b/Kernel/Makefile index 900a46e6..fc76c47f 100644 --- a/Kernel/Makefile +++ b/Kernel/Makefile @@ -44,7 +44,7 @@ BUILDINFO_SRC := $(OBJDIR)buildinfo.c$(OBJSUFFIX) OBJ := $(addprefix arch/$(ARCHDIR)/,$(A_OBJ)) OBJ += heap.o drvutil.o logging.o debug.o lib.o adt.o time.o OBJ += messages.o modules.o syscalls.o system.o -OBJ += threads.o mutex.o semaphore.o +OBJ += threads.o mutex.o semaphore.o workqueue.o OBJ += drv/vterm.o drv/proc.o drv/fifo.o drv/iocache.o drv/pci.o OBJ += binary.o bin/elf.o bin/pe.o OBJ += vfs/main.o vfs/open.o vfs/acls.o vfs/dir.o vfs/io.o vfs/mount.o diff --git a/Kernel/arch/x86/include/arch.h b/Kernel/arch/x86/include/arch.h index 95a734f7..9307ada3 100644 --- a/Kernel/arch/x86/include/arch.h +++ b/Kernel/arch/x86/include/arch.h @@ -14,7 +14,6 @@ #define INVLPTR ((void*)-1) // Allow nested spinlocks? -#define STACKED_LOCKS 2 // 0: No, 1: Per-CPU, 2: Per-Thread #define LOCK_DISABLE_INTS 1 // - Processor/Machine Specific Features @@ -41,18 +40,11 @@ * \brief Short Spinlock structure */ struct sShortSpinlock { - #if STACKED_LOCKS == 2 - volatile void *Lock; //!< Lock value - #else volatile int Lock; //!< Lock value - #endif #if LOCK_DISABLE_INTS int IF; //!< Interrupt state on call to SHORTLOCK #endif - #if STACKED_LOCKS - int Depth; - #endif }; // === MACROS === diff --git a/Kernel/arch/x86/lib.c b/Kernel/arch/x86/lib.c index 5c2bf648..5a86e442 100644 --- a/Kernel/arch/x86/lib.c +++ b/Kernel/arch/x86/lib.c @@ -45,13 +45,7 @@ int IS_LOCKED(struct sShortSpinlock *Lock) */ int CPU_HAS_LOCK(struct sShortSpinlock *Lock) { - #if STACKED_LOCKS == 1 return Lock->Lock == GetCPUNum() + 1; - #elif STACKED_LOCKS == 2 - return Lock->Lock == Proc_GetCurThread(); - #else - return 0; - #endif } /** @@ -70,32 +64,12 @@ int CPU_HAS_LOCK(struct sShortSpinlock *Lock) void SHORTLOCK(struct sShortSpinlock *Lock) { int v = 1; - #if LOCK_DISABLE_INTS int IF; - #endif - #if STACKED_LOCKS == 1 int cpu = GetCPUNum() + 1; - #elif STACKED_LOCKS == 2 - void *thread = Proc_GetCurThread(); - #endif - #if LOCK_DISABLE_INTS // Save interrupt state __ASM__ ("pushf;\n\tpop %0" : "=r"(IF)); IF &= 0x200; // AND out all but the interrupt flag - #endif - - #if STACKED_LOCKS == 1 - if( Lock->Lock == cpu ) { - Lock->Depth ++; - return ; - } - #elif STACKED_LOCKS == 2 - if( Lock->Lock == thread ) { - Lock->Depth ++; - return ; - } - #endif #if TRACE_LOCKS if( Lock != &glDebug_Lock && Lock != &glThreadListLock ) @@ -107,32 +81,11 @@ void SHORTLOCK(struct sShortSpinlock *Lock) // Wait for another CPU to release while(v) { - // CMPXCHG: - // If r/m32 == EAX, set ZF and set r/m32 = r32 - // Else, clear ZF and set EAX = r/m32 - #if STACKED_LOCKS == 1 - __ASM__("lock cmpxchgl %2, (%3)" - : "=a"(v) - : "a"(0), "r"(cpu), "r"(&Lock->Lock) - ); - #elif STACKED_LOCKS == 2 - __ASM__("lock cmpxchgl %2, (%3)" - : "=a"(v) - : "a"(0), "r"(thread), "r"(&Lock->Lock) - ); - #else - __ASM__("xchgl %%eax, (%%edi)":"=a"(v):"a"(1),"D"(&Lock->Lock)); - #endif - - #if LOCK_DISABLE_INTS - if( v ) __ASM__("sti"); // Re-enable interrupts - #endif + __ASM__("xchgl %%eax, (%%edi)":"=a"(v):"a"(cpu),"D"(&Lock->Lock)); } - #if LOCK_DISABLE_INTS __ASM__("cli"); Lock->IF = IF; - #endif #if TRACE_LOCKS if( Lock != &glDebug_Lock && Lock != &glThreadListLock ) @@ -149,13 +102,6 @@ void SHORTLOCK(struct sShortSpinlock *Lock) */ void SHORTREL(struct sShortSpinlock *Lock) { - #if STACKED_LOCKS - if( Lock->Depth ) { - Lock->Depth --; - return ; - } - #endif - #if TRACE_LOCKS if( Lock != &glDebug_Lock && Lock != &glThreadListLock ) { @@ -164,7 +110,6 @@ void SHORTREL(struct sShortSpinlock *Lock) } #endif - #if LOCK_DISABLE_INTS // Lock->IF can change anytime once Lock->Lock is zeroed if(Lock->IF) { Lock->Lock = 0; @@ -173,9 +118,6 @@ void SHORTREL(struct sShortSpinlock *Lock) else { Lock->Lock = 0; } - #else - Lock->Lock = 0; - #endif } // === DEBUG IO === -- 2.20.1