内核看门狗简介

来源:互联网 发布:苹果数据漫游要打开吗 编辑:程序博客网 时间:2024/04/29 22:14

MTK 平台:wd_common_drv.c

static int kwdt_thread(void *arg){struct sched_param param = {.sched_priority = 99 };struct rtc_time tm;struct timeval tv = { 0 };/* android time */struct rtc_time tm_android;struct timeval tv_android = { 0 };int cpu = 0;int local_bit = 0, loc_need_config = 0, loc_timeout = 0;struct wd_api *loc_wk_wdt = NULL;sched_setscheduler(current, SCHED_FIFO, ¶m);set_current_state(TASK_INTERRUPTIBLE);for (;;) {if (kthread_should_stop()) {pr_err("[WDK] kthread_should_stop do !!\n");break;}spin_lock(&lock);cpu = smp_processor_id();loc_wk_wdt = g_wd_api;loc_need_config = g_need_config;loc_timeout = g_timeout;spin_unlock(&lock);/* printk("fwq loc_wk_wdt(%x),loc_wk_wdt->ready(%d)\n",loc_wk_wdt ,loc_wk_wdt->ready); */if (loc_wk_wdt && loc_wk_wdt->ready && g_enable) {if (loc_need_config) {/* daul  mode */loc_wk_wdt->wd_config(WDT_DUAL_MODE, loc_timeout);spin_lock(&lock);g_need_config = 0;spin_unlock(&lock);}/* pr_debug("[WDK]  cpu-task=%d, current_pid=%d\n",  wk_tsk[cpu]->pid,  current->pid); *//*to avoid wk_tsk[cpu] had not created out */if (wk_tsk[cpu] != 0) {if (wk_tsk[cpu]->pid == current->pid) {/* only process WDT info if thread-x is on cpu-x */spin_lock(&lock);local_bit = kick_bit;printk_deferred("[WDK], local_bit:0x%x, cpu:%d,RT[%lld]\n",local_bit, cpu, sched_clock());if ((local_bit & (1 << cpu)) == 0) {/* printk("[WDK]: set  WDT kick_bit\n"); */local_bit |= (1 << cpu);/* aee_rr_rec_wdk_kick_jiffies(jiffies); */}printk_deferred    ("[WDK], local_bit:0x%x, cpu:%d, check bit0x:%x, lasthpg_cpu:%d, lasthpg_act:%d, lasthpg_t:%lld, RT[%lld]\n",     local_bit, cpu, wk_check_kick_bit(), lasthpg_cpu, lasthpg_act, lasthpg_t, sched_clock());if (local_bit == wk_check_kick_bit()) {printk_deferred("[WDK]: kick Ex WDT,RT[%lld]\n",sched_clock());mtk_wdt_restart(WD_TYPE_NORMAL);/* for KICK external wdt */local_bit = 0;}kick_bit = local_bit;spin_unlock(&lock);if (local_bit == wk_check_kick_bit()) {printk_deferred("[WDK]: kick Ex WDT,RT[%lld]\n",sched_clock());mtk_wdt_restart(WD_TYPE_NORMAL);/* for KICK external wdt */local_bit = 0;}}}} else if (0 == g_enable) {pr_debug("WDK stop to kick\n");} else {pr_err("No watch dog driver is hooked\n");BUG();}/*to avoid wk_tsk[cpu] had not created out */if (wk_tsk[cpu] != 0) {if (wk_tsk[cpu]->pid == current->pid) {#if (DEBUG_WDK == 1)msleep_interruptible(debug_sleep * 1000);pr_debug("WD kicker woke up %d\n", debug_sleep);#endifdo_gettimeofday(&tv);tv_android = tv;rtc_time_to_tm(tv.tv_sec, &tm);tv_android.tv_sec -= sys_tz.tz_minuteswest * 60;rtc_time_to_tm(tv_android.tv_sec, &tm_android);printk_deferred    ("[thread:%d][RT:%lld] %d-%02d-%02d %02d:%02d:%02d.%u UTC;"     "android time %d-%02d-%02d %02d:%02d:%02d.%03d\n",     current->pid, sched_clock(), tm.tm_year + 1900, tm.tm_mon + 1,     tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec,     (unsigned int)tv.tv_usec, tm_android.tm_year + 1900,     tm_android.tm_mon + 1, tm_android.tm_mday, tm_android.tm_hour,     tm_android.tm_min, tm_android.tm_sec,     (unsigned int)tv_android.tv_usec);}}msleep_interruptible((g_kinterval) * 1000);#ifdef CONFIG_MTK_AEE_POWERKEY_HANG_DETECTif ((cpu == 0) && (wk_tsk[cpu]->pid == current->pid)) {/* only effect at cpu0 */if (aee_kernel_wdt_kick_api(g_kinterval) == WDT_PWK_HANG_FORCE_HWT) {printk_deferred("power key trigger HWT\n");cpus_kick_bit = 0xFFFF;/* Try to force to HWT */}}#endif}pr_debug("[WDK] WDT kicker thread stop, cpu:%d, pid:%d\n", cpu, current->pid);return 0;}

log信息:

03-22 19:32:48.433 <4>[ 1243.156500]  (0)[184:wdtk-0][WDK], local_bit:0x1, cpu:0, check bit0x:f, lasthpg_cpu:3, lasthpg_act:1, lasthpg_t:1241783575417, RT[1243156495036]
03-22 19:40:14.882 <4>[ 1243.166510]  (1)[186:wdtk-1][WDK], local_bit:0x3, cpu:1, check bit0x:f, lasthpg_cpu:3, lasthpg_act:1, lasthpg_t:1241783575417, RT[1243166504728]

03-22 19:40:14.891 <4>[ 1243.176509]  (2)[187:wdtk-2][WDK], local_bit:0x7, cpu:2, check bit0x:f, lasthpg_cpu:3, lasthpg_act:1, lasthpg_t:1241783575417, RT[1243176503959]
03-22 19:40:14.921 <4>[ 1243.206501]  (3)[188:wdtk-3][WDK], local_bit:0xf, cpu:3, check bit0x:f, lasthpg_cpu:3, lasthpg_act:1, lasthpg_t:1241783575417, RT[1243206495498]

03-22 19:40:34.881 <4>[ 1263.166505]  (0)[184:wdtk-0][WDK], local_bit:0x1, cpu:0, check bit0x:f, lasthpg_cpu:3, lasthpg_act:1, lasthpg_t:1245090018348, RT[1263166500007]
03-22 19:40:34.891 <4>[ 1263.176500]  (1)[186:wdtk-1][WDK], local_bit:0x3, cpu:1, check bit0x:f, lasthpg_cpu:3, lasthpg_act:1, lasthpg_t:1245090018348, RT[1263176491084]

03-22 19:40:34.902 <4>[ 1263.186523]  (2)[187:wdtk-2][WDK], local_bit:0x7, cpu:2, check bit0x:f, lasthpg_cpu:3, lasthpg_act:1, lasthpg_t:1245090018348, RT[1263186517314]
 03-22 19:40:34.931 <4>[ 1263.216497]  (3)[188:wdtk-3][WDK], local_bit:0xf, cpu:3, check bit0x:f, lasthpg_cpu:3, lasthpg_act:1, lasthpg_t:1245090018348, RT[1263216491930]

从log 看每个CPU喂狗时间间隔(RT)大概在20s


0 0
原创粉丝点击