Loading...
#ifndef __ASM_SH_SMPLOCK_H #define __ASM_SH_SMPLOCK_H /* * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. */ #include <linux/config.h> #ifndef CONFIG_SMP #define lock_kernel() do { } while(0) #define unlock_kernel() do { } while(0) #define release_kernel_lock(task, cpu, depth) ((depth) = 1) #define reacquire_kernel_lock(task, cpu, depth) do { } while(0) #else #error "We do not support SMP on SH yet" /* * Default SMP lock implementation */ #include <linux/interrupt.h> #include <asm/spinlock.h> extern spinlock_t kernel_flag; /* * Getting the big kernel lock. * * This cannot happen asynchronously, * so we only need to worry about other * CPU's. */ extern __inline__ void lock_kernel(void) { if (!++current->lock_depth) spin_lock(&kernel_flag); } extern __inline__ void unlock_kernel(void) { if (--current->lock_depth < 0) spin_unlock(&kernel_flag); } /* * Release global kernel lock and global interrupt lock */ #define release_kernel_lock(task, cpu) \ do { \ if (task->lock_depth >= 0) \ spin_unlock(&kernel_flag); \ release_irqlock(cpu); \ __sti(); \ } while (0) /* * Re-acquire the kernel lock */ #define reacquire_kernel_lock(task) \ do { \ if (task->lock_depth >= 0) \ spin_lock(&kernel_flag); \ } while (0) #endif /* CONFIG_SMP */ #endif /* __ASM_SH_SMPLOCK_H */ |