.. | .. |
---|
214 | 214 | * of dependencies wrong: they are either too broad (they need a class-split) |
---|
215 | 215 | * or they are too narrow (they suffer from a false class-split): |
---|
216 | 216 | */ |
---|
217 | | -#define lockdep_set_class(lock, key) \ |
---|
218 | | - lockdep_init_map_type(&(lock)->dep_map, #key, key, 0, \ |
---|
219 | | - (lock)->dep_map.wait_type_inner, \ |
---|
220 | | - (lock)->dep_map.wait_type_outer, \ |
---|
221 | | - (lock)->dep_map.lock_type) |
---|
| 217 | +#define lockdep_set_class(lock, key) \ |
---|
| 218 | + lockdep_init_map_type(LOCKDEP_ALT_DEPMAP(lock), #key, key, 0, \ |
---|
| 219 | + LOCKDEP_ALT_DEPMAP(lock)->wait_type_inner, \ |
---|
| 220 | + LOCKDEP_ALT_DEPMAP(lock)->wait_type_outer, \ |
---|
| 221 | + LOCKDEP_ALT_DEPMAP(lock)->lock_type) |
---|
222 | 222 | |
---|
223 | | -#define lockdep_set_class_and_name(lock, key, name) \ |
---|
224 | | - lockdep_init_map_type(&(lock)->dep_map, name, key, 0, \ |
---|
225 | | - (lock)->dep_map.wait_type_inner, \ |
---|
226 | | - (lock)->dep_map.wait_type_outer, \ |
---|
227 | | - (lock)->dep_map.lock_type) |
---|
| 223 | +#define lockdep_set_class_and_name(lock, key, name) \ |
---|
| 224 | + lockdep_init_map_type(LOCKDEP_ALT_DEPMAP(lock), name, key, 0, \ |
---|
| 225 | + LOCKDEP_ALT_DEPMAP(lock)->wait_type_inner, \ |
---|
| 226 | + LOCKDEP_ALT_DEPMAP(lock)->wait_type_outer, \ |
---|
| 227 | + LOCKDEP_ALT_DEPMAP(lock)->lock_type) |
---|
228 | 228 | |
---|
229 | | -#define lockdep_set_class_and_subclass(lock, key, sub) \ |
---|
230 | | - lockdep_init_map_type(&(lock)->dep_map, #key, key, sub, \ |
---|
231 | | - (lock)->dep_map.wait_type_inner, \ |
---|
232 | | - (lock)->dep_map.wait_type_outer, \ |
---|
233 | | - (lock)->dep_map.lock_type) |
---|
| 229 | +#define lockdep_set_class_and_subclass(lock, key, sub) \ |
---|
| 230 | + lockdep_init_map_type(LOCKDEP_ALT_DEPMAP(lock), #key, key, sub, \ |
---|
| 231 | + LOCKDEP_ALT_DEPMAP(lock)->wait_type_inner, \ |
---|
| 232 | + LOCKDEP_ALT_DEPMAP(lock)->wait_type_outer, \ |
---|
| 233 | + LOCKDEP_ALT_DEPMAP(lock)->lock_type) |
---|
234 | 234 | |
---|
235 | 235 | #define lockdep_set_subclass(lock, sub) \ |
---|
236 | | - lockdep_init_map_type(&(lock)->dep_map, #lock, (lock)->dep_map.key, sub,\ |
---|
237 | | - (lock)->dep_map.wait_type_inner, \ |
---|
238 | | - (lock)->dep_map.wait_type_outer, \ |
---|
239 | | - (lock)->dep_map.lock_type) |
---|
| 236 | + lockdep_init_map_type(LOCKDEP_ALT_DEPMAP(lock), #lock, \ |
---|
| 237 | + LOCKDEP_ALT_DEPMAP(lock)->key, sub, \ |
---|
| 238 | + LOCKDEP_ALT_DEPMAP(lock)->wait_type_inner, \ |
---|
| 239 | + LOCKDEP_ALT_DEPMAP(lock)->wait_type_outer, \ |
---|
| 240 | + LOCKDEP_ALT_DEPMAP(lock)->lock_type) |
---|
240 | 241 | |
---|
241 | 242 | #define lockdep_set_novalidate_class(lock) \ |
---|
242 | 243 | lockdep_set_class_and_name(lock, &__lockdep_no_validate__, #lock) |
---|
.. | .. |
---|
244 | 245 | /* |
---|
245 | 246 | * Compare locking classes |
---|
246 | 247 | */ |
---|
247 | | -#define lockdep_match_class(lock, key) lockdep_match_key(&(lock)->dep_map, key) |
---|
| 248 | +#define lockdep_match_class(lock, key) \ |
---|
| 249 | + lockdep_match_key(LOCKDEP_ALT_DEPMAP(lock), key) |
---|
248 | 250 | |
---|
249 | 251 | static inline int lockdep_match_key(struct lockdep_map *lock, |
---|
250 | 252 | struct lock_class_key *key) |
---|
.. | .. |
---|
282 | 284 | return lock_is_held_type(lock, -1); |
---|
283 | 285 | } |
---|
284 | 286 | |
---|
285 | | -#define lockdep_is_held(lock) lock_is_held(&(lock)->dep_map) |
---|
286 | | -#define lockdep_is_held_type(lock, r) lock_is_held_type(&(lock)->dep_map, (r)) |
---|
| 287 | +#define lockdep_is_held(lock) lock_is_held(LOCKDEP_ALT_DEPMAP(lock)) |
---|
| 288 | +#define lockdep_is_held_type(lock, r) lock_is_held_type(LOCKDEP_ALT_DEPMAP(lock), (r)) |
---|
287 | 289 | |
---|
288 | 290 | extern void lock_set_class(struct lockdep_map *lock, const char *name, |
---|
289 | 291 | struct lock_class_key *key, unsigned int subclass, |
---|
.. | .. |
---|
306 | 308 | #define lockdep_depth(tsk) (debug_locks ? (tsk)->lockdep_depth : 0) |
---|
307 | 309 | |
---|
308 | 310 | #define lockdep_assert_held(l) do { \ |
---|
309 | | - WARN_ON(debug_locks && !lockdep_is_held(l)); \ |
---|
| 311 | + WARN_ON(debug_locks && !LOCKDEP_HARD_DEBUG_RET(l, 1, lockdep_is_held(l))); \ |
---|
310 | 312 | } while (0) |
---|
311 | 313 | |
---|
312 | 314 | #define lockdep_assert_held_write(l) do { \ |
---|
313 | | - WARN_ON(debug_locks && !lockdep_is_held_type(l, 0)); \ |
---|
| 315 | + WARN_ON(debug_locks && !LOCKDEP_HARD_DEBUG_RET(l, 1, lockdep_is_held_type(l, 0))); \ |
---|
314 | 316 | } while (0) |
---|
315 | 317 | |
---|
316 | 318 | #define lockdep_assert_held_read(l) do { \ |
---|
317 | | - WARN_ON(debug_locks && !lockdep_is_held_type(l, 1)); \ |
---|
| 319 | + WARN_ON(debug_locks && !LOCKDEP_HARD_DEBUG_RET(l, 1, lockdep_is_held_type(l, 1))); \ |
---|
318 | 320 | } while (0) |
---|
319 | 321 | |
---|
320 | 322 | #define lockdep_assert_held_once(l) do { \ |
---|
321 | | - WARN_ON_ONCE(debug_locks && !lockdep_is_held(l)); \ |
---|
| 323 | + WARN_ON_ONCE(debug_locks && !LOCKDEP_HARD_DEBUG_RET(l, 1, lockdep_is_held(l))); \ |
---|
322 | 324 | } while (0) |
---|
323 | 325 | |
---|
324 | 326 | #define lockdep_recursing(tsk) ((tsk)->lockdep_recursion) |
---|
325 | 327 | |
---|
326 | | -#define lockdep_pin_lock(l) lock_pin_lock(&(l)->dep_map) |
---|
327 | | -#define lockdep_repin_lock(l,c) lock_repin_lock(&(l)->dep_map, (c)) |
---|
328 | | -#define lockdep_unpin_lock(l,c) lock_unpin_lock(&(l)->dep_map, (c)) |
---|
| 328 | +#define lockdep_pin_lock(l) LOCKDEP_HARD_DEBUG_RET(l, ({ struct pin_cookie cookie; cookie;} ), \ |
---|
| 329 | + lock_pin_lock(LOCKDEP_ALT_DEPMAP(l))) |
---|
| 330 | +#define lockdep_repin_lock(l,c) LOCKDEP_HARD_DEBUG(l,, lock_repin_lock(LOCKDEP_ALT_DEPMAP(l), (c))) |
---|
| 331 | +#define lockdep_unpin_lock(l,c) LOCKDEP_HARD_DEBUG(l,, lock_unpin_lock(LOCKDEP_ALT_DEPMAP(l), (c))) |
---|
329 | 332 | |
---|
330 | 333 | #else /* !CONFIG_LOCKDEP */ |
---|
331 | 334 | |
---|
.. | .. |
---|
552 | 555 | #ifdef CONFIG_PROVE_LOCKING |
---|
553 | 556 | # define might_lock(lock) \ |
---|
554 | 557 | do { \ |
---|
555 | | - typecheck(struct lockdep_map *, &(lock)->dep_map); \ |
---|
556 | | - lock_acquire(&(lock)->dep_map, 0, 0, 0, 1, NULL, _THIS_IP_); \ |
---|
557 | | - lock_release(&(lock)->dep_map, _THIS_IP_); \ |
---|
| 558 | + typecheck(struct lockdep_map *, LOCKDEP_ALT_DEPMAP(lock)); \ |
---|
| 559 | + lock_acquire(LOCKDEP_ALT_DEPMAP(lock), 0, 0, 0, 1, NULL, _THIS_IP_); \ |
---|
| 560 | + lock_release(LOCKDEP_ALT_DEPMAP(lock), _THIS_IP_); \ |
---|
558 | 561 | } while (0) |
---|
559 | 562 | # define might_lock_read(lock) \ |
---|
560 | 563 | do { \ |
---|
561 | | - typecheck(struct lockdep_map *, &(lock)->dep_map); \ |
---|
562 | | - lock_acquire(&(lock)->dep_map, 0, 0, 1, 1, NULL, _THIS_IP_); \ |
---|
563 | | - lock_release(&(lock)->dep_map, _THIS_IP_); \ |
---|
| 564 | + typecheck(struct lockdep_map *, LOCKDEP_ALT_DEPMAP(lock)); \ |
---|
| 565 | + lock_acquire(LOCKDEP_ALT_DEPMAP(lock), 0, 0, 1, 1, NULL, _THIS_IP_); \ |
---|
| 566 | + lock_release(LOCKDEP_ALT_DEPMAP(lock), _THIS_IP_); \ |
---|
564 | 567 | } while (0) |
---|
565 | 568 | # define might_lock_nested(lock, subclass) \ |
---|
566 | 569 | do { \ |
---|
567 | | - typecheck(struct lockdep_map *, &(lock)->dep_map); \ |
---|
568 | | - lock_acquire(&(lock)->dep_map, subclass, 0, 1, 1, NULL, \ |
---|
| 570 | + typecheck(struct lockdep_map *, LOCKDEP_ALT_DEPMAP(lock)); \ |
---|
| 571 | + lock_acquire(LOCKDEP_ALT_DEPMAP(lock), subclass, 0, 1, 1, NULL, \ |
---|
569 | 572 | _THIS_IP_); \ |
---|
570 | | - lock_release(&(lock)->dep_map, _THIS_IP_); \ |
---|
| 573 | + lock_release(LOCKDEP_ALT_DEPMAP(lock), _THIS_IP_); \ |
---|
571 | 574 | } while (0) |
---|
572 | 575 | |
---|
573 | 576 | DECLARE_PER_CPU(int, hardirqs_enabled); |
---|
.. | .. |
---|
576 | 579 | |
---|
577 | 580 | #define __lockdep_enabled (debug_locks && !this_cpu_read(lockdep_recursion)) |
---|
578 | 581 | |
---|
| 582 | +#define __lockdep_check_irqs_enabled() \ |
---|
| 583 | + ({ !hard_irqs_disabled() && \ |
---|
| 584 | + (running_oob() || this_cpu_read(hardirqs_enabled)); }) |
---|
| 585 | + |
---|
579 | 586 | #define lockdep_assert_irqs_enabled() \ |
---|
580 | | -do { \ |
---|
581 | | - WARN_ON_ONCE(__lockdep_enabled && !this_cpu_read(hardirqs_enabled)); \ |
---|
582 | | -} while (0) |
---|
| 587 | + do { \ |
---|
| 588 | + WARN_ON_ONCE(__lockdep_enabled && \ |
---|
| 589 | + !__lockdep_check_irqs_enabled()); \ |
---|
| 590 | + } while (0) |
---|
| 591 | + |
---|
| 592 | +#define __lockdep_check_irqs_disabled() \ |
---|
| 593 | + ({ hard_irqs_disabled() || \ |
---|
| 594 | + (running_inband() && !this_cpu_read(hardirqs_enabled)); }) |
---|
583 | 595 | |
---|
584 | 596 | #define lockdep_assert_irqs_disabled() \ |
---|
| 597 | + do { \ |
---|
| 598 | + WARN_ON_ONCE(__lockdep_enabled && \ |
---|
| 599 | + !__lockdep_check_irqs_disabled()); \ |
---|
| 600 | + } while (0) |
---|
| 601 | + |
---|
| 602 | +#define lockdep_read_irqs_state() \ |
---|
| 603 | + ({ this_cpu_read(hardirqs_enabled); }) |
---|
| 604 | + |
---|
| 605 | +#define lockdep_write_irqs_state(__state) \ |
---|
585 | 606 | do { \ |
---|
586 | | - WARN_ON_ONCE(__lockdep_enabled && this_cpu_read(hardirqs_enabled)); \ |
---|
| 607 | + this_cpu_write(hardirqs_enabled, __state); \ |
---|
587 | 608 | } while (0) |
---|
588 | 609 | |
---|
589 | 610 | #define lockdep_assert_in_irq() \ |
---|
.. | .. |
---|
596 | 617 | WARN_ON_ONCE(IS_ENABLED(CONFIG_PREEMPT_COUNT) && \ |
---|
597 | 618 | __lockdep_enabled && \ |
---|
598 | 619 | (preempt_count() != 0 || \ |
---|
599 | | - !this_cpu_read(hardirqs_enabled))); \ |
---|
| 620 | + __lockdep_check_irqs_disabled())); \ |
---|
600 | 621 | } while (0) |
---|
601 | 622 | |
---|
602 | 623 | #define lockdep_assert_preemption_disabled() \ |
---|
.. | .. |
---|
604 | 625 | WARN_ON_ONCE(IS_ENABLED(CONFIG_PREEMPT_COUNT) && \ |
---|
605 | 626 | __lockdep_enabled && \ |
---|
606 | 627 | (preempt_count() == 0 && \ |
---|
607 | | - this_cpu_read(hardirqs_enabled))); \ |
---|
| 628 | + __lockdep_check_irqs_enabled())); \ |
---|
608 | 629 | } while (0) |
---|
609 | 630 | |
---|
610 | 631 | #else |
---|
.. | .. |
---|
614 | 635 | |
---|
615 | 636 | # define lockdep_assert_irqs_enabled() do { } while (0) |
---|
616 | 637 | # define lockdep_assert_irqs_disabled() do { } while (0) |
---|
| 638 | +# define lockdep_read_irqs_state() 0 |
---|
| 639 | +# define lockdep_write_irqs_state(__state) do { (void)(__state); } while (0) |
---|
617 | 640 | # define lockdep_assert_in_irq() do { } while (0) |
---|
618 | 641 | |
---|
619 | 642 | # define lockdep_assert_preemption_enabled() do { } while (0) |
---|