AI智能摘要
以提升高通watchdog调试效率为目标,提出面向新手工程师的内核日志增强方案,通过驱动形式集成UTC时间、Top10中断、Watchdog进程状态、CPU可用与ping掩码、最近跨核调用等关键信息输出,精准定位中断风暴、CPU无响应等常见系统异常,显著加快问题分析进程。
此摘要由AI分析文章内容生成,仅供参考。

前言

本灵感诞生于 同事的 Qcom WD Debug增强方案,与相应工程师沟通后,感觉在高通watchdog的debug的时候有限的日志对于有经验的稳定性工程师来说,当前的日志已经足够。但是对于新手稳定性工程师来说,日志有限的确限制了问题分析的进度与难度,所以我开始思考如何将常遇到的问题能够在内核日志中输出,同步参考M/O/V的开源代码类似设计,所以本文聚焦常遇到的几类问题:

  1. 中断风暴(如何判断出现中断风暴?)

  2. Watchdog pet进程被调度了还卡死的情况

  3. Watchdog pet进程没有被调用的卡死情况

  4. 某CPU不响应

  5. 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函数中,在后面说明

打印watchdog进程的状态

部分内容涉及公司保密协议,暂不对外开放

此处内容已隐藏,「密码可见」