[Armadillo:09185] Re: Armadillo-4x0 のハードウェアWDT
Makoto Harada
email@hidden
2013年 9月 10日 (火) 22:41:31 JST
原田です。
ご指摘ありがとうございます。
> カーネルパニックが起きてもそのプロセスが死ぬだけで、
>
> この説明には疑問があります(後述)が、
Oops発生時の動作と混同してしまいました。こちらの表現は訂正いたします。大変失礼致しました。
> 「そのプロセスが死ぬだけ」ではないですよね?
> コンソールは死にますし(コンソールではないtelnet接続で
> panicを起こさせてもシリアルコンソールが死にます)、
> telnetなどでつないでいる他の接続は全部動作しなくなり(
> 応答が何もないようです)、外部へのsyslog転送も停止、
> 外部からの新しいtelnetやftpの接続もできなくなります。
> 何もできなくなるので、どこまで死んでいるのかの確認が
> できないのですが、panic()しても外部からのpingには
> 応答するようです。
panic()関数を見ると、
- プリエンプティブ不可
- 割り込みを有効
- 無限ループ
となっていますので、panic()後は、割り込みハンドラの処理だけ実行できる状態と言えるかと思います。
-----------------------------------------------------------------
# linux-2.6.x/kernel/panic.c
NORET_TYPE void panic(const char * fmt, ...)
{
preempt_disable();
.....
.....
local_irq_enable();
for (i = 0;;) {
touch_softlockup_watchdog();
i += panic_blink(i);
mdelay(1);
i++;
}
}
-----------------------------------------------------------------
原田
(2013年09月10日 18:21), Yasuhisa Nakamura wrote:
> 中村です。
>
> 原田さん、説明ありがとうございます。
>
>> カーネルパニックが起きてもそのプロセスが死ぬだけで、
>
> この説明には疑問があります(後述)が、
>
>> 例えば、ドライバ内で、以下のようにARMのインタラプト機能自体を無効にした上で、
>> 無限ループを実行すれば、ウォッチドッグリセットがかかると思います。
>> local_irq_disable();
>> while(1);
>
> でリブートがかかることは確認できました。
>
>> (参考までに、簡単なテストモジュールを添付させて頂きます。
>
> わざわざ、ありがとうございます。
> 私が行ったpanic()テストも同じ方法です。
> init()でpanic()するようにしたドライバを作り、それをinsmodです。
>
>> linux-2.6.x/arch/arm/plat-mxc/time.c
> と
>> linux-2.6.x/arch/arm/plat-mxc/wdog.c
>
> 該当箇所を確認しました。
>
> 結局のところ、mxc_timer_interrupt()が発生しなくなるような
> クラッシュでないと、このWDTによるリブートは期待できない、
> ということですね。
>
> 前の私のメールの最後に書いた
>>> echo N > /proc/sys/kernel/panic
>>> ("N"は秒数)
>>> によるカーネルパニック時の自動再起動は動いていますので、
>
> これによるリブートはカーネルのタイマは生きていることが
> 前提のようですので、これと併用することにします。
>
>
> 最初の「カーネルパニックが起きてもそのプロセスが死ぬだけ」
> について。
>
> 「そのプロセスが死ぬだけ」ではないですよね?
> コンソールは死にますし(コンソールではないtelnet接続で
> panicを起こさせてもシリアルコンソールが死にます)、
> telnetなどでつないでいる他の接続は全部動作しなくなり(
> 応答が何もないようです)、外部へのsyslog転送も停止、
> 外部からの新しいtelnetやftpの接続もできなくなります。
> 何もできなくなるので、どこまで死んでいるのかの確認が
> できないのですが、panic()しても外部からのpingには
> 応答するようです。
>
armadillo メーリングリストの案内