做网站商城需要什么,网站设计远程培训,肥城网站建设,小红书推广文案说明
理论上#xff1a;不管IC是单核还是多核#xff0c;只要watchdog有被循环feed#xff0c;就不会触发超时重启#xff0c;因此watchdog在SMP机制下的多核环境显得比较宽松#xff0c;只要任意核存活#xff08;喂狗#xff09;就不会重启设备。
实际情况
有客户反…说明
理论上不管IC是单核还是多核只要watchdog有被循环feed就不会触发超时重启因此watchdog在SMP机制下的多核环境显得比较宽松只要任意核存活喂狗就不会重启设备。
实际情况
有客户反馈多核环境下SMP机制管理有核hang住了但是设备没有重启。在SMP机制管理的8核arm平台上实测现象
有核crash特意使核上跑的程序crashSMP能检测到并且所有核都会被stopwatchdog能重启设备。有核hang住特意使核上跑的程序hang住设备会非常卡smp机制中的调度会每隔一段时间打印一次timeout但是由于主核正常喂狗正常不会触发watchdog重启系统如下
[ 433.562934] rcu: INFO: rcu_sched detected stalls on CPUs/tasks:
[ 433.568883] rcu: 1-...0: (16 ticks this GP) idlee3a/0/0x3 softirq98/98 fqs10498
[ 433.576660] (detected by 0, t21007 jiffies, g-935, q16)
[ 433.582255] Task dump for CPU 1:
[ 433.585495] task:swapper/1 state:R running task stack:15152 pid: 0 ppid: 1 flags:0x0000000a
[ 433.595460] Call trace:
[ 433.597917] __switch_to0xb8/0xe8
[ 433.601332] 0xffffff8100130c00根据一些测试现象推测有核卡住设备非常卡是因为smp调度时调度过程是阻塞的但是有超时smp调度过程就会卡住很久只有超时后其它进程才能得到调度将触发smp调度的操作放到wdt驱动的喂狗函数中这样就会触发watchdog重启系统smp调度阻塞住喂狗了。
结论
IC生产无法确保每个核都是一样稳定如果多核IC中有少数核稳定性稍微差点可能会出现部分核hang住因此需要watchdog来检测这种情况并重启。
实现
同构多核使用SMP机制管理下kenerl启动之前只有主核在运行kernel启动过程中再由kernel bringup其它核因此kernel运行前的固件uboot等不需要做检测。
SMP机制下多核确活机制严格模式
在多核SMP管理环境下确认多核是否alive只要任意核hang住重启设备。
思路
通过SMP机制发送核间中断给每个核每个核收到中断后将一个全局CPU 位图变量打上标志表示核正在运行。发送核间中断让每个核执行同一个函数
// 每个核都会运行该函数
static void cpu_alive(void *passed_regs)
{...
}smp_call_function(cpu_alive, NULL, 0);
smp_wmb();第一版做法每次喂狗前发送SMP调度请求等待所有核运行完成。
static cpumask_t cpus_alive CPU_MASK_NONE;#ifdef CONFIG_SMP
static void cpu_alive(void *passed_regs)
{int cpu smp_processor_id();pr_debug(cpu[%d] setmask \n, cpu);cpumask_set_cpu(cpu, cpus_alive);
}
#endif// watchdog驱动喂狗函数
static int dw_wdt_ping(struct watchdog_device *wdd)
{ struct dw_wdt *dw_wdt to_dw_wdt(wdd);#ifdef CONFIG_SMPunsigned int msecs;unsigned int ncpus;cpus_alive CPU_MASK_NONE;ncpus num_online_cpus() - 1;pr_debug(Sending IPI to other cpus...\n);smp_call_function(cpu_alive, NULL, 0);smp_wmb();// 阻塞1s 等待所有核执行完成msecs 1000; // 1swhile ((cpumask_weight(cpus_alive) ncpus) (--msecs 0)) {cpu_relax();mdelay(1);}if (cpumask_weight(cpus_alive) ncpus)
#endifwritel(WDOG_COUNTER_RESTART_KICK_VALUE, dw_wdt-regs WDOG_COUNTER_RESTART_REG_OFFSET);return 0;
}问题
阻塞1s等待所有核执行完成如果存在核执行超时了会导致误判。如果将阻塞时间拉长喂狗时间和wdt timeout时间需要空出该时间。
新版本每次喂狗前检查上一次喂狗后发送SMP调度请求后的CPU 位图数据喂狗再发送一次SMP调度请求。
static cpumask_t cpus_alive CPU_MASK_NONE;#ifdef CONFIG_SMP
static void cpu_alive(void *passed_regs)
{ int cpu smp_processor_id();pr_debug(cpu[%d] setmask \n, cpu);cpumask_set_cpu(cpu, cpus_alive);
}
#endifstatic int dw_wdt_ping(struct watchdog_device *wdd)
{struct dw_wdt *dw_wdt to_dw_wdt(wdd);static int isFirst 1;#ifdef CONFIG_SMPunsigned int ncpus;ncpus num_online_cpus() - 1;if ((isFirst 1) || cpumask_weight(cpus_alive) ncpus) {
#endifwritel(WDOG_COUNTER_RESTART_KICK_VALUE, dw_wdt-regs WDOG_COUNTER_RESTART_REG_OFFSET);#ifdef CONFIG_SMPisFirst 0;cpus_alive CPU_MASK_NONE;smp_call_function(cpu_alive, NULL, 0);smp_wmb();}
#endifreturn 0;
}好处等待所有核执行SMP请求和间隔喂狗并行起来了不必像串行一样多花一个等待时间。