--- x/drivers/net/wireless/mac80211_hwsim.c 2022-07-31 16:20:11.823504700 +0800 +++ y/drivers/net/wireless/mac80211_hwsim.c 2022-07-31 16:22:14.130567900 +0800 @@ -1788,8 +1788,9 @@ mac80211_hwsim_beacon(struct hrtimer *ti bcn_int -= data->bcn_delta; data->bcn_delta = 0; } - hrtimer_forward(&data->beacon_timer, hrtimer_get_expires(timer), - ns_to_ktime(bcn_int * NSEC_PER_USEC)); + + hrtimer_forward_now(&data->beacon_timer, ns_to_ktime(bcn_int * NSEC_PER_USEC)); + return HRTIMER_RESTART; } --- x/kernel/time/hrtimer.c 2022-07-31 15:07:43.454730700 +0800 +++ y/kernel/time/hrtimer.c 2022-07-31 16:04:56.920080400 +0800 @@ -1480,6 +1480,7 @@ static void __run_hrtimer(struct hrtimer { enum hrtimer_restart (*fn)(struct hrtimer *); bool expires_in_hardirq; + unsigned long ts; int restart; lockdep_assert_held(&cpu_base->lock); @@ -1515,9 +1516,13 @@ static void __run_hrtimer(struct hrtimer raw_spin_unlock_irqrestore(&cpu_base->lock, flags); trace_hrtimer_expire_entry(timer, now); expires_in_hardirq = lockdep_hrtimer_enter(timer); + ts = jiffies + 4; restart = fn(timer); + if (time_after(jiffies, ts)) + pr_warn("On CPU%u hrtimer %ps took more than 4 ticks\n", cpu_base->cpu, fn); + lockdep_hrtimer_exit(expires_in_hardirq); trace_hrtimer_expire_exit(timer); raw_spin_lock_irq(&cpu_base->lock); --- x/net/wireless/ibss.c 2022-07-31 17:31:48.574469700 +0800 +++ y/net/wireless/ibss.c 2022-07-31 17:33:54.724578800 +0800 @@ -33,7 +33,7 @@ void __cfg80211_ibss_joined(struct net_d bss = cfg80211_get_bss(wdev->wiphy, channel, bssid, NULL, 0, IEEE80211_BSS_TYPE_IBSS, IEEE80211_PRIVACY_ANY); - if (WARN_ON(!bss)) + if (!bss) return; if (wdev->current_bss) {