mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 12:57:53 +00:00
f70405afc9
Modelled after lockdep_assert_held() and lockdep_assert_held_write(), but are always active, even when lockdep is disabled. Of course, they don't test that _this_ thread is the owner, but it's sufficient to catch many bugs and doesn't incur the same performance penalty as lockdep. Acked-by: "Peter Zijlstra (Intel)" <peterz@infradead.org> Acked-by: Waiman Long <longman@redhat.com> Acked-by: "Darrick J. Wong" <djwong@kernel.org> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: "Matthew Wilcox (Oracle)" <willy@infradead.org> Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
44 lines
1,020 B
C
44 lines
1,020 B
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
#ifndef _LINUX_RWBASE_RT_H
|
|
#define _LINUX_RWBASE_RT_H
|
|
|
|
#include <linux/rtmutex.h>
|
|
#include <linux/atomic.h>
|
|
|
|
#define READER_BIAS (1U << 31)
|
|
#define WRITER_BIAS (1U << 30)
|
|
|
|
struct rwbase_rt {
|
|
atomic_t readers;
|
|
struct rt_mutex_base rtmutex;
|
|
};
|
|
|
|
#define __RWBASE_INITIALIZER(name) \
|
|
{ \
|
|
.readers = ATOMIC_INIT(READER_BIAS), \
|
|
.rtmutex = __RT_MUTEX_BASE_INITIALIZER(name.rtmutex), \
|
|
}
|
|
|
|
#define init_rwbase_rt(rwbase) \
|
|
do { \
|
|
rt_mutex_base_init(&(rwbase)->rtmutex); \
|
|
atomic_set(&(rwbase)->readers, READER_BIAS); \
|
|
} while (0)
|
|
|
|
|
|
static __always_inline bool rw_base_is_locked(const struct rwbase_rt *rwb)
|
|
{
|
|
return atomic_read(&rwb->readers) != READER_BIAS;
|
|
}
|
|
|
|
static inline void rw_base_assert_held_write(const struct rwbase_rt *rwb)
|
|
{
|
|
WARN_ON(atomic_read(&rwb->readers) != WRITER_BIAS);
|
|
}
|
|
|
|
static __always_inline bool rw_base_is_contended(const struct rwbase_rt *rwb)
|
|
{
|
|
return atomic_read(&rwb->readers) > 0;
|
|
}
|
|
|
|
#endif /* _LINUX_RWBASE_RT_H */
|