Commit 5bc048a1 authored by Xiongfeng Wang's avatar Xiongfeng Wang Committed by Zheng Zengkai
Browse files

sdei_watchdog: refresh 'last_timestamp' when enabling nmi_watchdog



hulk inclusion
category: feature
bugzilla: 48046
CVE: NA

-------------------------------------------------------------------------

The trigger period of secure time is set by firmware. We need to check
the time_stamp every time the secure time fires to make sure the
hardlockup detection is not executed too soon. We need to refresh
'last_timestamp' to the current time when we enable the nmi_watchdog.
Otherwise, false hardlockup may be detected when the secure timer fires
the first time.

Signed-off-by: default avatarXiongfeng Wang <wangxiongfeng2@huawei.com>
Reviewed-by: default avatarHanjun Guo <guohanjun@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: default avatarXiongfeng Wang <wangxiongfeng2@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent cc19c0b3
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ int watchdog_nmi_enable(unsigned int cpu)
	if (!sdei_watchdog_registered)
		return -EINVAL;

	refresh_hld_last_timestamp();

	ret = sdei_api_event_enable(sdei_watchdog_event_num);
	if (ret) {
		pr_err("Enable NMI Watchdog failed on cpu%d\n",
+1 −0
Original line number Diff line number Diff line
@@ -206,6 +206,7 @@ u64 hw_nmi_get_sample_period(int watchdog_thresh);
#if defined(CONFIG_HARDLOCKUP_CHECK_TIMESTAMP) && \
    defined(CONFIG_HARDLOCKUP_DETECTOR)
void watchdog_update_hrtimer_threshold(u64 period);
void refresh_hld_last_timestamp(void);
#else
static inline void watchdog_update_hrtimer_threshold(u64 period) { }
#endif
+9 −0
Original line number Diff line number Diff line
@@ -89,6 +89,15 @@ static bool watchdog_check_timestamp(void)
	__this_cpu_write(last_timestamp, now);
	return true;
}

void refresh_hld_last_timestamp(void)
{
	ktime_t now;

	now = ktime_get_mono_fast_ns();
	__this_cpu_write(last_timestamp, now);

}
#else
static inline bool watchdog_check_timestamp(void)
{