mutex subsystem, core
PATCH 6/8 mutex subsystem, core
mutex implementation, core files: just the basic subsystem, no users of it.
Signed-off-by Ingo Molnar <[email protected]>
----
include/linux/mutex.h | 100 +++++++++++ kernel/Makefile | 2 kernel/mutex.c | 453 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 554 insertions(+), 1 deletion(-)
include/linux/mutex.h new file +100 -0
@@ -0,0 +1,100 @@ +#ifndef __LINUX_MUTEX_H +#define __LINUX_MUTEX_H + +/* +* Mutexes: blocking mutual exclusion locks +* +* started by Ingo Molnar: +* +* Copyright (C) 2004, 2005 Red Hat, Inc., Ingo Molnar <[email protected]> +* +* This file contains the main data structure and API definitions. +*/ +#include <linux/config.h> +#include <asm/atomic.h> +#include <linux/list.h> +#include <linux/spinlock_types.h> + +/* +* Simple, straightforward mutexes with strict semantics: +* +* - only one task can hold the mutex at a time +* - only the owner can unlock the mutex +* - multiple unlocks are not permitted +* - recursive locking is not permitted +* - a mutex object must be initialized via the API +* - a mutex object must not be initialized via memset or copying +* - task may not exit with mutex held +* - memory areas where held locks reside must not be freed +* - held mutexes must not be reinitialized +* - mutexes may not be used in irq contexts +* +* These semantics are fully enforced when DEBUG_MUTEXES is +* enabled. Furthermore, besides enforcing the above rules, the mutex +* debugging code also implements a number of additional features +* that make lock debugging easier and faster: +* +* - uses symbolic names of mutexes, whenever they are printed in debug output +* - point-of-acquire tracking, symbolic lookup of function names +* - list of all locks held in the system, printout of them +* - owner tracking +* - detects self-recursing locks and prints out all relevant info +* - detects multi-task circular deadlocks and prints out all affected +* locks and tasks (and only those tasks) +*/ +struct mutex { +// 1: unlocked, 0: locked, negative: locked, possible waiters +atomic_t count; +spinlock_t wait_lock; +struct list_head wait_list; +#ifdef CONFIG_DEBUG_MUTEXES +struct thread_info *owner; +struct list_head held_list; +unsigned long acquire_ip; +const char *name; +void *magic; +#endif +}; + +/* +* This is the control structure for tasks blocked on mutex, +* which resides on the blocked task's kernel stack: +*/ +struct mutex_waiter { +struct list_head list; +struct thread_info *ti; +#ifdef CONFIG_DEBUG_MUTEXES +struct mutex *lock; +void *magic; +#endif +}; + +#ifdef CONFIG_DEBUG_MUTEXES +# include <linux/mutex-debug.h> +#else +# define __DEBUG_MUTEX_INITIALIZER (lockname) +# define mutex_init (sem) __mutex_init(sem, NULL) +# define mutex_debug_show_all_locks () do { } while (0) +# define mutex_debug_show_held_locks (p) do { } while (0) +# define mutex_debug_check_no_locks_held (task) do { } while (0) +# define mutex_debug_check_no_locks_freed (from, to) do { } while (0) +#endif + +#define __MUTEX_INITIALIZER (lockname) \ + { .count = ATOMIC_INIT(1) \ + , .wait_lock = SPIN_LOCK_UNLOCKED \ + , .wait_list = LIST_HEAD_INIT(lockname.wait_list) \ + __DEBUG_MUTEX_INITIALIZER(lockname) } + +#define DEFINE_MUTEX (mutexname) \ + struct mutex mutexname = __MUTEX_INITIALIZER(mutexname) + +extern void FASTCALL (__mutex_init (struct mutex *lock,const char *name)); + +extern void FASTCALL (mutex_lock (struct mutex *lock)); +extern int FASTCALL (mutex_lock_interruptible (struct mutex *lock)); +extern int FASTCALL (mutex_trylock (struct mutex *lock)); +extern void FASTCALL (mutex_unlock (struct mutex *lock)); +extern int FASTCALL (mutex_is_locked (struct mutex *lock)); + +#endif
kernel/Makefile +1 -1
@@ -7,7 +7,7 @@ obj-y = sched.o fork.o exec_domain.o sysctl.o capability.o ptrace.o timer.o user.o \ signal.o sys.o kmod.o workqueue.o pid.o \ rcupdate.o intermodule.o extable.o params.o posix-timers.o \ - kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o + kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o obj-$(CONFIG_FUTEX) += futex.o obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
kernel/mutex.c new file +453 -0
453 lines not on this page · raw message