Messages in this thread | | | Date | Fri, 16 Oct 2009 09:28:41 +0800 | From | Cong Wang <> | Subject | Re: [Patch v5] rwsem: fix rwsem_is_locked() bugs |
| |
Andrew Morton wrote: > On Wed, 14 Oct 2009 05:52:22 -0400 > Amerigo Wang <amwang@redhat.com> wrote: > >> --- a/include/linux/rwsem-spinlock.h >> +++ b/include/linux/rwsem-spinlock.h >> @@ -68,11 +68,9 @@ extern int __down_write_trylock(struct rw_semaphore *sem); >> extern void __up_read(struct rw_semaphore *sem); >> extern void __up_write(struct rw_semaphore *sem); >> extern void __downgrade_write(struct rw_semaphore *sem); >> +extern int __rwsem_is_locked(struct rw_semaphore *sem); >> >> -static inline int rwsem_is_locked(struct rw_semaphore *sem) >> -{ >> - return (sem->activity != 0); >> -} >> +#define rwsem_is_locked(sem) __rwsem_is_locked(sem) >> >> #endif /* __KERNEL__ */ >> #endif /* _LINUX_RWSEM_SPINLOCK_H */ >> diff --git a/lib/rwsem-spinlock.c b/lib/rwsem-spinlock.c >> index 9df3ca5..7014306 100644 >> --- a/lib/rwsem-spinlock.c >> +++ b/lib/rwsem-spinlock.c >> @@ -17,6 +17,19 @@ struct rwsem_waiter { >> #define RWSEM_WAITING_FOR_WRITE 0x00000002 >> }; >> >> +int __rwsem_is_locked(struct rw_semaphore *sem) >> +{ >> + int ret = 1; >> + unsigned long flags; >> + >> + if (spin_trylock_irqsave(&sem->wait_lock, flags)) { >> + ret = (sem->activity != 0); >> + spin_unlock_irqrestore(&sem->wait_lock, flags); >> + } >> + return ret; >> +} >> +EXPORT_SYMBOL(__rwsem_is_locked); > > Why the macro tricks? Can we do
Yes, better.
Thanks for your patch!
> > --- a/include/linux/rwsem-spinlock.h~rwsem-fix-rwsem_is_locked-bugs-fix > +++ a/include/linux/rwsem-spinlock.h > @@ -68,9 +68,7 @@ extern int __down_write_trylock(struct r > extern void __up_read(struct rw_semaphore *sem); > extern void __up_write(struct rw_semaphore *sem); > extern void __downgrade_write(struct rw_semaphore *sem); > -extern int __rwsem_is_locked(struct rw_semaphore *sem); > - > -#define rwsem_is_locked(sem) __rwsem_is_locked(sem) > +extern int rwsem_is_locked(struct rw_semaphore *sem); > > #endif /* __KERNEL__ */ > #endif /* _LINUX_RWSEM_SPINLOCK_H */ > --- a/lib/rwsem-spinlock.c~rwsem-fix-rwsem_is_locked-bugs-fix > +++ a/lib/rwsem-spinlock.c > @@ -17,7 +17,7 @@ struct rwsem_waiter { > #define RWSEM_WAITING_FOR_WRITE 0x00000002 > }; > > -int __rwsem_is_locked(struct rw_semaphore *sem) > +int rwsem_is_locked(struct rw_semaphore *sem) > { > int ret = 1; > unsigned long flags; > @@ -28,7 +28,7 @@ int __rwsem_is_locked(struct rw_semaphor > } > return ret; > } > -EXPORT_SYMBOL(__rwsem_is_locked); > +EXPORT_SYMBOL(rwsem_is_locked); > > /* > * initialise the semaphore > _ >
| |