On Fri, Nov 10, 2023 at 05:21:22PM -0500, Waiman Long wrote:You are right. I got confused too.
On 11/10/23 15:41, Matthew Wilcox (Oracle) wrote:Uhhh ... I always get confused between assert and BUG_ON being opposite
static inline int rwsem_is_locked(struct rw_semaphore *sem)That is not correct. You mean "!= RWSEM_UNLOCKED_VALUE". Right?
{
- return atomic_long_read(&sem->count) != 0;
+ return atomic_long_read(&sem->count) != RWSEM_UNLOCKED_VALUE;
}
-#define RWSEM_UNLOCKED_VALUE 0L
-#define __RWSEM_COUNT_INIT(name) .count = ATOMIC_LONG_INIT(RWSEM_UNLOCKED_VALUE)
+static inline void rwsem_assert_held_nolockdep(const struct rw_semaphore *sem)
+{
+ WARN_ON(atomic_long_read(&sem->count) == RWSEM_UNLOCKED_VALUE);
+}
polarity, but I think it's correct.
We are asserting that the rwsem is locked (either for read or write).
That is, it is a bug if the rwsem is unlocked.
So WARN_ON(sem->count == UNLOCKED_VALUE) is correct. No?
The check for write lock ownership is accurate. OTOH, the locked check can have false positive and so is less reliable.
There are some inconsistency in the use of WARN_ON() and BUG_ON() in theI'll fix that up.
assertions. For PREEMPT_RT, held_write is a BUG_ON. For non-PREEMPT_RT, held
is a BUG_ON. It is not clear why one is BUG_ON and other one is WARN_ON. Is
there a rationale for that?
I see. Thanks for the explanation.
BTW, we can actually check if the current process is the write-lock owner ofWe actually don't want to do that. See patches 3/4 where I explain how
a rwsem, but not for a reader-owned rwsem.
XFS takes the XFS_ILOCK for write, then passes control to a workqueue
which asserts that the XFS_ILOCK is held for write. The thread which
took the rwsem for write waits for the workqueue and unlocks the rwsem.