AI智能摘要
以提升高通watchdog调试效率为目标,提出面向新手工程师的内核日志增强方案,通过驱动形式集成UTC时间、Top10中断、Watchdog进程状态、CPU可用与ping掩码、最近跨核调用等关键信息输出,精准定位中断风暴、CPU无响应等常见系统异常,显著加快问题分析进程。
此摘要由AI分析文章内容生成,仅供参考。
前言
本灵感诞生于 同事的 Qcom WD Debug增强方案,与相应工程师沟通后,感觉在高通watchdog的debug的时候有限的日志对于有经验的稳定性工程师来说,当前的日志已经足够。但是对于新手稳定性工程师来说,日志有限的确限制了问题分析的进度与难度,所以我开始思考如何将常遇到的问题能够在内核日志中输出,同步参考M/O/V的开源代码类似设计,所以本文聚焦常遇到的几类问题:
中断风暴(如何判断出现中断风暴?)
Watchdog pet进程被调度了还卡死的情况
Watchdog pet进程没有被调用的卡死情况
某CPU不响应
others
设计方案
首先扩展的功能必须以驱动形式来保证可移植性,增加的日志仅在出现系统异常时进行收集
打印utc时间
static int print_utc_cnt = 0;
void qcom_show_utc_time(void)
{
long nsec_val = 0;
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)
struct timespec ts;
struct rtc_time tm;
getnstimeofday(&ts);
rtc_time_to_tm(ts.tv_sec, &tm);
nsec_val = ts.tv_nsec;
#else
struct timespec64 ts64;
struct rtc_time tm;
ktime_get_real_ts64(&ts64);
rtc_time64_to_tm(ts64.tv_sec, &tm);
nsec_val = ts64.tv_nsec;
#endif
if(print_utc_cnt > 2)
print_utc_cnt = 0;
else {
print_utc_cnt ++;
return;
}
WD_WARNING("!@WatchDog: %d-%02d-%02d %02d:%02d:%02d.%09lu UTC\n",
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec, nsec_val);
}函数功能:每4次输出一次utc时间
函数调用:qcom_wdt_kthread中每次喂狗时调用,pet time 15s,也就是1min输出一次utc时间打印
打印top10 irq
static void print_top10_irqs(void)
{
sort_irqs_delta();
WD_INFO("Top10 irqs since last: %d:%u; %d:%u; %d:%u; %d:%u; %d:%u; %d:%u; %d:%u; %d:%u; %d:%u; %d:%u; Total: %u\n",
irqno_sort[0], q_irq_counter.irqs_delta[irqno_sort[0]], irqno_sort[1], q_irq_counter.irqs_delta[irqno_sort[1]],
irqno_sort[2], q_irq_counter.irqs_delta[irqno_sort[2]], irqno_sort[3], q_irq_counter.irqs_delta[irqno_sort[3]],
irqno_sort[4], q_irq_counter.irqs_delta[irqno_sort[4]], irqno_sort[5], q_irq_counter.irqs_delta[irqno_sort[5]],
irqno_sort[6], q_irq_counter.irqs_delta[irqno_sort[6]], irqno_sort[7], q_irq_counter.irqs_delta[irqno_sort[7]],
irqno_sort[8], q_irq_counter.irqs_delta[irqno_sort[8]], irqno_sort[9], q_irq_counter.irqs_delta[irqno_sort[9]], q_irq_counter.all_irqs_delta);
}函数功能:打印从上次统计到现在的irq的发生次数,这是一个增量,所以可以很准确的判断是否存在中断异常
函数调用:集成在qcom_dump_wdog_cpu函数中,在后面说明