History

locking/percpu-rwsem, lockdep: Make percpu-rwsem use its own lockdep_map

As preparation for replacing the embedded rwsem, give percpu-rwsem its own lockdep_map.

Peter Zijlstra committed 7 years ago

Commit 17510601 parent 810507f5 files · +37 −18Browse files

Showing the changes to include/linux (1 of 5 files). Show all

Unified · Split

include/linux/percpu-rwsem.h+19−10
@@ -15,8 +15,17 @@ struct percpu_rw_semaphore { · 14 unmodified lines
1515 struct rw_semaphore rw_sem; /* slowpath */
1616 struct rcuwait writer; /* blocked writer */
1717 int readers_block;
18+#ifdef CONFIG_DEBUG_LOCK_ALLOC
19+ struct lockdep_map dep_map;
20+#endif
1821 };
1922
23+#ifdef CONFIG_DEBUG_LOCK_ALLOC
24+#define __PERCPU_RWSEM_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname },
25+#else
26+#define __PERCPU_RWSEM_DEP_MAP_INIT(lockname)
27+#endif
28+
2029 #define __DEFINE_PERCPU_RWSEM(name, is_static) \
2130 static DEFINE_PER_CPU(unsigned int, __percpu_rwsem_rc_##name); \
2231 is_static struct percpu_rw_semaphore name = { \
@@ -24,7 +33,9 @@ is_static struct percpu_rw_semaphore name = { \ · 1 unmodified line
2433 .read_count = &__percpu_rwsem_rc_##name, \
2534 .rw_sem = __RWSEM_INITIALIZER(name.rw_sem), \
2635 .writer = __RCUWAIT_INITIALIZER(name.writer), \
36+ __PERCPU_RWSEM_DEP_MAP_INIT(name) \
2737 }
38+
2839 #define DEFINE_PERCPU_RWSEM(name) \
2940 __DEFINE_PERCPU_RWSEM(name, /* not static */)
3041 #define DEFINE_STATIC_PERCPU_RWSEM(name) \
@@ -37,7 +48,7 @@ static inline void percpu_down_read(struct percpu_rw_semaphore *sem) · 6 unmodified lines
3748 {
3849 might_sleep();
3950
40− rwsem_acquire_read(&sem->rw_sem.dep_map, 0, 0, _RET_IP_);
51+ rwsem_acquire_read(&sem->dep_map, 0, 0, _RET_IP_);
4152
4253 preempt_disable();
4354 /*
@@ -76,13 +87,15 @@ static inline int percpu_down_read_trylock(struct percpu_rw_semaphore *sem) · 32 unmodified lines
7687 */
7788
7889 if (ret)
79− rwsem_acquire_read(&sem->rw_sem.dep_map, 0, 1, _RET_IP_);
90+ rwsem_acquire_read(&sem->dep_map, 0, 1, _RET_IP_);
8091
8192 return ret;
8293 }
8394
8495 static inline void percpu_up_read(struct percpu_rw_semaphore *sem)
8596 {
97+ rwsem_release(&sem->dep_map, _RET_IP_);
98+
8699 preempt_disable();
87100 /*
88101 * Same as in percpu_down_read().
@@ -92,8 +105,6 @@ static inline void percpu_up_read(struct percpu_rw_semaphore *sem) · 3 unmodified lines
92105 else
93106 __percpu_up_read(sem); /* Unconditional memory barrier */
94107 preempt_enable();
95−
96− rwsem_release(&sem->rw_sem.dep_map, _RET_IP_);
97108 }
98109
99110 extern void percpu_down_write(struct percpu_rw_semaphore *);
@@ -110,15 +121,13 @@ extern void percpu_free_rwsem(struct percpu_rw_semaphore *); · 10 unmodified lines
110121 __percpu_init_rwsem(sem, #sem, &rwsem_key); \
111122 })
112123
113−#define percpu_rwsem_is_held(sem) lockdep_is_held(&(sem)->rw_sem)
114−
115−#define percpu_rwsem_assert_held(sem) \
116− lockdep_assert_held(&(sem)->rw_sem)
124+#define percpu_rwsem_is_held(sem) lockdep_is_held(sem)
125+#define percpu_rwsem_assert_held(sem) lockdep_assert_held(sem)
117126
118127 static inline void percpu_rwsem_release(struct percpu_rw_semaphore *sem,
119128 bool read, unsigned long ip)
120129 {
121− lock_release(&sem->rw_sem.dep_map, ip);
130+ lock_release(&sem->dep_map, ip);
122131 #ifdef CONFIG_RWSEM_SPIN_ON_OWNER
123132 if (!read)
124133 atomic_long_set(&sem->rw_sem.owner, RWSEM_OWNER_UNKNOWN);
@@ -128,7 +137,7 @@ static inline void percpu_rwsem_release(struct percpu_rw_semaphore *sem, · 3 unmodified lines
128137 static inline void percpu_rwsem_acquire(struct percpu_rw_semaphore *sem,
129138 bool read, unsigned long ip)
130139 {
131− lock_acquire(&sem->rw_sem.dep_map, 0, 1, read, 1, NULL, ip);
140+ lock_acquire(&sem->dep_map, 0, 1, read, 1, NULL, ip);
132141 #ifdef CONFIG_RWSEM_SPIN_ON_OWNER
133142 if (!read)
134143 atomic_long_set(&sem->rw_sem.owner, (long)current);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t