--- x/include/linux/hrtimer.h 2022-07-31 08:22:55.170197300 +0800 +++ y/include/linux/hrtimer.h 2022-07-31 09:35:26.448655000 +0800 @@ -124,6 +124,9 @@ struct hrtimer { u8 is_rel; u8 is_soft; u8 is_hard; +#ifdef CONFIG_LOCKDEP + struct lockdep_map lockdep_map; +#endif }; /** @@ -369,10 +372,34 @@ static inline void hrtimer_cancel_wait_r /* Exported timer functions: */ /* Initialize timers: */ -extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock, +extern void hrtimer_init_core(struct hrtimer *timer, clockid_t which_clock, enum hrtimer_mode mode); -extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id, + +extern void hrtimer_init_sleeper_core(struct hrtimer_sleeper *sl, clockid_t clock_id, enum hrtimer_mode mode); +#ifdef CONFIG_LOCKDEP +#define hrtimer_init(timer, clock, mode) \ + do { \ + static struct lock_class_key __key; \ + lockdep_init_map(&(timer)->lockdep_map, #timer, &__key, 0); \ + hrtimer_init_core(timer, clock, mode); \ + } while (0) +#define hrtimer_init_sleeper(sl, clock, mode) \ + do { \ + static struct lock_class_key __key; \ + lockdep_init_map(&(sl)->timer.lockdep_map, #sl, &__key, 0); \ + hrtimer_init_sleeper_core(sl, clock, mode); \ + } while (0) +#else +#define hrtimer_init(timer, clock, mode) \ + do { \ + hrtimer_init_core(timer, clock, mode); \ + } while (0) +#define hrtimer_init_sleeper(sl, clock, mode) \ + do { \ + hrtimer_init_sleeper_core(sl, clock, mode); \ + } while (0) +#endif #ifdef CONFIG_DEBUG_OBJECTS_TIMERS extern void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t which_clock, --- x/kernel/time/hrtimer.c 2022-07-31 08:26:20.764371900 +0800 +++ y/kernel/time/hrtimer.c 2022-07-31 09:59:33.927031500 +0800 @@ -1439,6 +1439,8 @@ int hrtimer_cancel(struct hrtimer *timer { int ret; + lock_map_acquire(&timer->lockdep_map); + lock_map_release(&timer->lockdep_map); do { ret = hrtimer_try_to_cancel(timer); @@ -1575,7 +1577,7 @@ static void __hrtimer_init(struct hrtime } /** - * hrtimer_init - initialize a timer to the given clock + * hrtimer_init_core - initialize a timer to the given clock * @timer: the timer to be initialized * @clock_id: the clock to be used * @mode: The modes which are relevant for initialization: @@ -1586,13 +1588,13 @@ static void __hrtimer_init(struct hrtime * but the PINNED bit is ignored as pinning happens * when the hrtimer is started */ -void hrtimer_init(struct hrtimer *timer, clockid_t clock_id, +void hrtimer_init_core(struct hrtimer *timer, clockid_t clock_id, enum hrtimer_mode mode) { debug_init(timer, clock_id, mode); __hrtimer_init(timer, clock_id, mode); } -EXPORT_SYMBOL_GPL(hrtimer_init); +EXPORT_SYMBOL_GPL(hrtimer_init_core); /* * A timer is active, when it is enqueued into the rbtree or the @@ -1682,7 +1684,9 @@ static void __run_hrtimer(struct hrtimer trace_hrtimer_expire_entry(timer, now); expires_in_hardirq = lockdep_hrtimer_enter(timer); + lock_map_acquire(&timer->lockdep_map); restart = fn(timer); + lock_map_release(&timer->lockdep_map); lockdep_hrtimer_exit(expires_in_hardirq); trace_hrtimer_expire_exit(timer); @@ -1999,19 +2003,19 @@ static void __hrtimer_init_sleeper(struc } /** - * hrtimer_init_sleeper - initialize sleeper to the given clock + * hrtimer_init_sleeper_core - initialize sleeper to the given clock * @sl: sleeper to be initialized * @clock_id: the clock to be used * @mode: timer mode abs/rel */ -void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id, +void hrtimer_init_sleeper_core(struct hrtimer_sleeper *sl, clockid_t clock_id, enum hrtimer_mode mode) { debug_init(&sl->timer, clock_id, mode); __hrtimer_init_sleeper(sl, clock_id, mode); } -EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); +EXPORT_SYMBOL_GPL(hrtimer_init_sleeper_core); int nanosleep_copyout(struct restart_block *restart, struct timespec64 *ts) {