X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Flinux%2Frwsem.h;h=bfb98888500290d3c945f93e2f544de1384bcacb;hb=9464c7cf61b9433057924c36e6e02f303a00e768;hp=7b524b4109a039a5cf065d60af824fa4d2fb0ff0;hpb=41689045f6a3cbe0550e1d34e9cc20d2e8c432ba;p=linux-2.6.git diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h index 7b524b410..bfb988885 100644 --- a/include/linux/rwsem.h +++ b/include/linux/rwsem.h @@ -9,8 +9,11 @@ #include +#define RWSEM_DEBUG 0 + #ifdef __KERNEL__ +#include #include #include #include @@ -24,71 +27,89 @@ struct rw_semaphore; #include /* use an arch-specific implementation */ #endif +#ifndef rwsemtrace +#if RWSEM_DEBUG +extern void FASTCALL(rwsemtrace(struct rw_semaphore *sem, const char *str)); +#else +#define rwsemtrace(SEM,FMT) +#endif +#endif + /* * lock for reading */ -extern void down_read(struct rw_semaphore *sem); +static inline void down_read(struct rw_semaphore *sem) +{ + might_sleep(); + rwsemtrace(sem,"Entering down_read"); + __down_read(sem); + rwsemtrace(sem,"Leaving down_read"); +} /* * trylock for reading -- returns 1 if successful, 0 if contention */ -extern int down_read_trylock(struct rw_semaphore *sem); +static inline int down_read_trylock(struct rw_semaphore *sem) +{ + int ret; + rwsemtrace(sem,"Entering down_read_trylock"); + ret = __down_read_trylock(sem); + rwsemtrace(sem,"Leaving down_read_trylock"); + return ret; +} /* * lock for writing */ -extern void down_write(struct rw_semaphore *sem); +static inline void down_write(struct rw_semaphore *sem) +{ + might_sleep(); + rwsemtrace(sem,"Entering down_write"); + __down_write(sem); + rwsemtrace(sem,"Leaving down_write"); +} /* * trylock for writing -- returns 1 if successful, 0 if contention */ -extern int down_write_trylock(struct rw_semaphore *sem); +static inline int down_write_trylock(struct rw_semaphore *sem) +{ + int ret; + rwsemtrace(sem,"Entering down_write_trylock"); + ret = __down_write_trylock(sem); + rwsemtrace(sem,"Leaving down_write_trylock"); + return ret; +} /* * release a read lock */ -extern void up_read(struct rw_semaphore *sem); +static inline void up_read(struct rw_semaphore *sem) +{ + rwsemtrace(sem,"Entering up_read"); + __up_read(sem); + rwsemtrace(sem,"Leaving up_read"); +} /* * release a write lock */ -extern void up_write(struct rw_semaphore *sem); +static inline void up_write(struct rw_semaphore *sem) +{ + rwsemtrace(sem,"Entering up_write"); + __up_write(sem); + rwsemtrace(sem,"Leaving up_write"); +} /* * downgrade write lock to read lock */ -extern void downgrade_write(struct rw_semaphore *sem); - -#ifdef CONFIG_DEBUG_LOCK_ALLOC -/* - * nested locking. NOTE: rwsems are not allowed to recurse - * (which occurs if the same task tries to acquire the same - * lock instance multiple times), but multiple locks of the - * same lock class might be taken, if the order of the locks - * is always the same. This ordering rule can be expressed - * to lockdep via the _nested() APIs, but enumerating the - * subclasses that are used. (If the nesting relationship is - * static then another method for expressing nested locking is - * the explicit definition of lock class keys and the use of - * lockdep_set_class() at lock initialization time. - * See Documentation/lockdep-design.txt for more details.) - */ -extern void down_read_nested(struct rw_semaphore *sem, int subclass); -extern void down_write_nested(struct rw_semaphore *sem, int subclass); -/* - * Take/release a lock when not the owner will release it. - * - * [ This API should be avoided as much as possible - the - * proper abstraction for this case is completions. ] - */ -extern void down_read_non_owner(struct rw_semaphore *sem); -extern void up_read_non_owner(struct rw_semaphore *sem); -#else -# define down_read_nested(sem, subclass) down_read(sem) -# define down_write_nested(sem, subclass) down_write(sem) -# define down_read_non_owner(sem) down_read(sem) -# define up_read_non_owner(sem) up_read(sem) -#endif +static inline void downgrade_write(struct rw_semaphore *sem) +{ + rwsemtrace(sem,"Entering downgrade_write"); + __downgrade_write(sem); + rwsemtrace(sem,"Leaving downgrade_write"); +} #endif /* __KERNEL__ */ #endif /* _LINUX_RWSEM_H */