[Armadillo:09184] Re: Armadillo-4x0 のハードウェアWDT

Yasuhisa Nakamura email@hidden
2013年 9月 10日 (火) 18:21:56 JST


中村です。

原田さん、説明ありがとうございます。

> カーネルパニックが起きてもそのプロセスが死ぬだけで、

この説明には疑問があります(後述)が、

> 例えば、ドライバ内で、以下のように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:09183]で Makoto Harada さんは書きました:
> 原田です。
>
> (2013年09月08日 11:55), Yasuhisa Nakamura wrote:
>> 中村です。
>>
>> Armadillo-4x0のハードウェアウォッチドッグタイマの
>> 使い方を教えていただけないでしょうか?
>>
>> http://manual.atmark-techno.com/armadillo-4x0/armadillo-400_series_software_manual_ja-1.8.1/ch09.html#sec-watchdog-timer
>> に、次の説明があります。
>> ----- 引用 -----
>> Armadillo-400 シリーズで採用している i.MX25 プロセッサは、
>> 内蔵ウォッチドッグタイマーを有しています。
>> Armadillo-400 シリーズの標準ブートローダーでは、起動直後に
>> この内蔵ウォッチドッグタイマーを有効にします。標準状態での
>> タイムアウト時間は 10 秒に設定されます。
>> Linux カーネルでは、自動でウォッチドッグタイマーをキックします。
>> もし、何らかの要因で Linux カーネルがフリーズしてウォッチ
>> ドッグタイマーをキックできなくなりタイムアウトが発生すると、
>> システムリセットが発生します。
>> ----- 引用おわり -----
>>
>> これを読み、標準状態で何もしなくとも動作していて、
>> カーネルパニックなどのとき10秒で自動的に再起動するのかな?
>> と思い、panic()を使って故意にカーネルパニックを発生させて
>> みましたが、panic表示で停止したまま、いくら待っても
>> 何もおきませんでした。
>>
>
> カーネルパニックが起きてもそのプロセスが死ぬだけで、
> 実際にLinux自体は走り続けております。そのため、panic()を読んでも
> ウォッチドッグリセットはかかりません。
>
> 例えば、ドライバ内で、以下のようにARMのインタラプト機能自体を無効にした上で、
> 無限ループを実行すれば、ウォッチドッグリセットがかかると思います。
>
> local_irq_disable();
> while(1);
>
> (参考までに、簡単なテストモジュールを添付させて頂きます。
>  1. Makefile内のKERNEL_SRCを、ご使用の環境に変更
>  2. make
>  3. 作成されたdisable_interrupts.koファイルをftp等でArmadilloへ転送
>  4. Armadilloで、insmod disable_interrupts.ko
>  でお試し頂けます。)
>
>> MLの過去記事やArmadilloのサイトのサポートを探しても
>> これ以上の説明はなく、どうやって使うのか(どういうときに
>> 再起動(上の引用では「システムリセット」)がかかるのか)、
>> わかりません。
>>
>> ブートローダのソースで10秒を設定しているようなところは
>> みつけましたが、
>> 「Linux カーネルでは、自動でウォッチドッグタイマーをキックします」
>> という部分は、カーネルのどこでやっているのか(どこに設定が
>> あるのか)もわかってません。
>>
>
> linux-2.6.x/arch/arm/plat-mxc/time.c
> 内のmxc_timer_interrupt()(i.MX25のGPT(General Purpose Timer)の割り込みハンドラ)で、
> mxc_kick_wd()を呼び出し、ウォッチドッグタイマーをキックしにいっております。
>
>> 試していませんが、カーネルコンフィグに
>> CONFIG_WATCHDOG
>> CONFIG_MXC_WATCHDOG
>> などがあります。
>> これらは、デフォルトのまま有効にしていません。
>>
>
> CONFIG_WATCHDOG
> CONFIG_MXC_WATCHDOG
> はArmadillo-4x0では使用しておりません。
>
> ウォッチドッグタイマードライバは、以下にございます。
> linux-2.6.x/arch/arm/plat-mxc/wdog.c
>
> 標準状態では、ブートローダー(Hermit-At)内でウォッチドッグタイマーの設定(タイムアウト10秒)
> を行い、
> LinuxではGPTの割り込みハンドラでウォッチドッグをキックしにいく仕組みとなっております。
>
> (linux-2.6.x/arch/arm/plat-mxc/wdog.c内で、WDOG1_ENABLEを有効にすることで(標準では、undef
> されております)、
> mxc_wd_init()が呼び出されウォッチドッグタイマーの再初期化(タイムアウト4秒) を行うことが
> できます。)
>
>> このconfigのWDTの動作は、
>> http://armadillo.atmark-techno.com/howto/watchdog
>> に説明があるものと同じと思っていますが、
>> これと、このメール前半に書いたWDTとは別ものですよね?
>>
>> echo N > /proc/sys/kernel/panic
>> ("N"は秒数)
>> によるカーネルパニック時の自動再起動は動いていますので、
>> これでもいいのですが・・・
>>
>> よろしくお願いします。
>>
>




armadillo メーリングリストの案内