When using x86 specific rwsem correctly intepret rwsem->count.

This commit is contained in:
Brian Behlendorf 2009-12-01 15:47:27 -08:00
parent 4e5691faf6
commit 5652e7b497

View File

@ -47,9 +47,10 @@ typedef struct {
} krwlock_t; } krwlock_t;
/* /*
* For the generic and x86 implementations of rw-semaphores the following * For the generic implementations of rw-semaphores the following is
* is true. If your semaphore implementation internally represents the * true. If your semaphore implementation internally represents the
* semaphore state differently special case handling will be required. * semaphore state differently. Then special case handling will be
* required so RW_COUNT() provides these semantics:
* - if activity/count is 0 then there are no active readers or writers * - if activity/count is 0 then there are no active readers or writers
* - if activity/count is +ve then that is the number of active readers * - if activity/count is +ve then that is the number of active readers
* - if activity/count is -1 then there is one active writer * - if activity/count is -1 then there is one active writer
@ -63,9 +64,14 @@ typedef struct {
extern void __up_read_locked(struct rw_semaphore *); extern void __up_read_locked(struct rw_semaphore *);
extern int __down_write_trylock_locked(struct rw_semaphore *); extern int __down_write_trylock_locked(struct rw_semaphore *);
#else #else
# define RW_COUNT(rwp) (SEM(rwp)->count & RWSEM_ACTIVE_MASK) # ifdef _I386_RWSEM_H
# define rw_exit_locked(rwp) up_read(rwp) # define RW_COUNT(rwp) ((SEM(rwp)->count < 0) ? (-1) : \
# define rw_tryenter_locked(rwp) down_write_trylock(rwp) (SEM(rwp)->count & RWSEM_ACTIVE_MASK))
# else
# define RW_COUNT(rwp) (SEM(rwp)->count & RWSEM_ACTIVE_MASK)
# endif
# define rw_exit_locked(rwp) up_read(rwp)
# define rw_tryenter_locked(rwp) down_write_trylock(rwp)
#endif #endif
static inline kthread_t * static inline kthread_t *