カーネル番犬の概要


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 !!
"); 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)
",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
", 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]
", local_bit, cpu, sched_clock()); if ((local_bit & (1 << cpu)) == 0) { /* printk("[WDK]: set WDT kick_bit
"); */ 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]
", 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]
", 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]
", 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
"); } else { pr_err("No watch dog driver is hooked
"); 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
", debug_sleep); #endif do_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
", 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_DETECT if ((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
"); cpus_kick_bit = 0xFFFF; /* Try to force to HWT */ } } #endif } pr_debug("[WDK] WDT kicker thread stop, cpu:%d, pid:%d
", 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)は20 s程度