lock.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #undef TRACE_SYSTEM
  3. #define TRACE_SYSTEM lock
  4. #if !defined(_TRACE_LOCK_H) || defined(TRACE_HEADER_MULTI_READ)
  5. #define _TRACE_LOCK_H
  6. #include <linux/sched.h>
  7. #include <linux/tracepoint.h>
  8. /* flags for lock:contention_begin */
  9. #define LCB_F_SPIN (1U << 0)
  10. #define LCB_F_READ (1U << 1)
  11. #define LCB_F_WRITE (1U << 2)
  12. #define LCB_F_RT (1U << 3)
  13. #define LCB_F_PERCPU (1U << 4)
  14. #define LCB_F_MUTEX (1U << 5)
  15. #ifdef CONFIG_LOCKDEP
  16. #include <linux/lockdep.h>
  17. TRACE_EVENT(lock_acquire,
  18. TP_PROTO(struct lockdep_map *lock, unsigned int subclass,
  19. int trylock, int read, int check,
  20. struct lockdep_map *next_lock, unsigned long ip),
  21. TP_ARGS(lock, subclass, trylock, read, check, next_lock, ip),
  22. TP_STRUCT__entry(
  23. __field(unsigned int, flags)
  24. __string(name, lock->name)
  25. __field(void *, lockdep_addr)
  26. ),
  27. TP_fast_assign(
  28. __entry->flags = (trylock ? 1 : 0) | (read ? 2 : 0);
  29. __assign_str(name, lock->name);
  30. __entry->lockdep_addr = lock;
  31. ),
  32. TP_printk("%p %s%s%s", __entry->lockdep_addr,
  33. (__entry->flags & 1) ? "try " : "",
  34. (__entry->flags & 2) ? "read " : "",
  35. __get_str(name))
  36. );
  37. DECLARE_EVENT_CLASS(lock,
  38. TP_PROTO(struct lockdep_map *lock, unsigned long ip),
  39. TP_ARGS(lock, ip),
  40. TP_STRUCT__entry(
  41. __string( name, lock->name )
  42. __field( void *, lockdep_addr )
  43. ),
  44. TP_fast_assign(
  45. __assign_str(name, lock->name);
  46. __entry->lockdep_addr = lock;
  47. ),
  48. TP_printk("%p %s", __entry->lockdep_addr, __get_str(name))
  49. );
  50. DEFINE_EVENT(lock, lock_release,
  51. TP_PROTO(struct lockdep_map *lock, unsigned long ip),
  52. TP_ARGS(lock, ip)
  53. );
  54. #ifdef CONFIG_LOCK_STAT
  55. DEFINE_EVENT(lock, lock_contended,
  56. TP_PROTO(struct lockdep_map *lock, unsigned long ip),
  57. TP_ARGS(lock, ip)
  58. );
  59. DEFINE_EVENT(lock, lock_acquired,
  60. TP_PROTO(struct lockdep_map *lock, unsigned long ip),
  61. TP_ARGS(lock, ip)
  62. );
  63. #endif /* CONFIG_LOCK_STAT */
  64. #endif /* CONFIG_LOCKDEP */
  65. TRACE_EVENT(contention_begin,
  66. TP_PROTO(void *lock, unsigned int flags),
  67. TP_ARGS(lock, flags),
  68. TP_STRUCT__entry(
  69. __field(void *, lock_addr)
  70. __field(unsigned int, flags)
  71. ),
  72. TP_fast_assign(
  73. __entry->lock_addr = lock;
  74. __entry->flags = flags;
  75. ),
  76. TP_printk("%p (flags=%s)", __entry->lock_addr,
  77. __print_flags(__entry->flags, "|",
  78. { LCB_F_SPIN, "SPIN" },
  79. { LCB_F_READ, "READ" },
  80. { LCB_F_WRITE, "WRITE" },
  81. { LCB_F_RT, "RT" },
  82. { LCB_F_PERCPU, "PERCPU" },
  83. { LCB_F_MUTEX, "MUTEX" }
  84. ))
  85. );
  86. TRACE_EVENT(contention_end,
  87. TP_PROTO(void *lock, int ret),
  88. TP_ARGS(lock, ret),
  89. TP_STRUCT__entry(
  90. __field(void *, lock_addr)
  91. __field(int, ret)
  92. ),
  93. TP_fast_assign(
  94. __entry->lock_addr = lock;
  95. __entry->ret = ret;
  96. ),
  97. TP_printk("%p (ret=%d)", __entry->lock_addr, __entry->ret)
  98. );
  99. #endif /* _TRACE_LOCK_H */
  100. /* This part must be outside protection */
  101. #include <trace/define_trace.h>