[linux-users: 108907] Re: kernel : Disabling IRQ#64について

kawasaki @ wwing.net kawasaki @ wwing.net
2012年 7月 26日 (木) 16:37:53 JST


こんにちは。

僕の書き方が悪かったかもしれませんが、割り込みハンドラが
処理した場合は IRQ_NONE ではなく、IRQ_HANDLED を返す必要が
あります。

これは割り込みを共有している場合、どの割り込みハンドラも
IRQ_HANDLEDを返さなかった場合には、その割り込みを無効化するという
使用だったと思います。

従って、誰もIRQ_HANDLEDを返さなかった場合には、実際には割り込みを
処理していたとしても、一定回数鵜の割り込み後、最終的にカーネルから
「割り込みを処理していない」という判断をされてしまいます。

ということで、もし割り込みハンドラで IRQ_NONE を返しているようでしたら
IRQ_HANDLED を返すようにしてはいかがでしょうか?

また、カーネル内、特に割り込みハンドラからファイルへの書き込みは、可能であれば
避けた方が良いかと思います。(デッドロックやを含め様々な理由により、正しく
使用しないと別の問題が起こる可能性がありますので)

ではでは。
--
川崎
kawasaki at wwing.net


From:  Hiromi Ogawa <h-ogawa @ elwsc.co.jp>:

> 皆さんから教えて頂いた内容から
> ドライバ内にある、IRQ_NONEを戻り値して設定している箇所に
> プログラムを入れて、 var/log/message ファイルにログを
> 出力させようと考えております。
>
> ドライバからファイルに書き込むには、何の関数を使用すると
> 良いのでしょうか?
>
> 御存知の方がいましたら、御教授願います。
>
> 宜しくお願い致します。
>
>
>
> (2012/07/26 10:27), kawasaki @ wwing.net wrote:
>> こんにちは。川崎と申します。
>>
>> うろ覚えなのですが、64番のIRQを割り込みハンドラで処理をした後に
>> 戻り値として
>> IRQ_HANDLED
>> を返していらっしゃいますでしょうか?
>>
>> 下記リンクにあるように、割り込みを無視(または処理しなかった)数が
>> 一定数に達すると、その割り込みをDisableしていたような記憶が
>> あります。
>> http://lxr.linux.no/linux+v2.6.32.24/kernel/irq/spurious.c#L258
>>
>> 外しているかもしれませんが、ご参考になれば。
>>
>> --
>> Tatsuo Kawasaki
>> kawasaki at wwing.net
>>
>> Sent: Hiromi Ogawa <h-ogawa @ elwsc.co.jp>:
>>
>>> ありがとうございます。
>>>
>>> 指定の割り込み番号が、何か原因で禁止された事なのですね。
>>>
>>> もう少し、情報を取得してみます。
>>>
>>> また、不明な箇所が発生したらレスさせて頂きます。
>>>
>>>
>>>
>>>
>>>
>>> (2012/07/24 21:30), KISHIMOTO, Makoto wrote:
>>>> ドライバを作っておられるということで、基本的な所はわかっておられると
>>>> 思いますが、何らかの理由で変な(?)タイミングで割り込みが発生したか、
>>>> カーネルのハンドラが呼ばれるかして、「へんな割り込みが発生したから、
>>>> この割り込みを禁止にしたぞ」という意味で、カーネルがメッセージを
>>>> 吐いています。
>>>>
>>>> このメッセージにともなう症状としては、必ずしもリセットがかかるとは
>>>> 限らないので、リセットがかかるということ自体が何らかのヒントかも
>>>> しれません。
>>>>
>>>>> IRQは周辺機器の接続に割り当てられたポート番号みたいなものです。
>>>>> カーネルのその無効にする設定をオフにすれば有効(enabled)に
>>>>> なるかと思われますし、ドライバの設定を64以外の空いている番号に
>>>>> すればそれでも通るかと思われます。
>>>>
>>>>>> シリアルボードのドライバを作成したところ、時々
>>>>>> kernel : Disabling IRQ#64
>>>>>> が発生して、Linuxがリブートする現象が発生しております。
>>>>>>
>>>>>> IRQ#64
>>>>>> の64は、ボードに割り当てられた割り込みです。
>>>>>>
>>>>>> マシンはHP社のGEN8を使用しています。
>>>>>> Linuxは、Red Hat Enterprise Linux 6.1を使用しています。
>>>>>>
>>>>>> /var/log/messagesを見ると
>>>>>> Disabling IRQ #64に至るまでのCall Traceが残っているのですが、
>>>>>> 最終的に、__report_bad_irqに至り、"Disabling IRQ #64"となっています。
>>>>>>
>>>>>> この "Disabling IRQ #64" は、どの様な時に発生するのでしょうか?
>>>>>> また、着眼すべきポイントを御存知でしたら御教授願います。
>>>> _______________________________________________
>>>> linux-users mailing list
>>>> linux-users @ listserv.linux.or.jp
>>>> http://listserv.linux.or.jp/mailman/listinfo/linux-users
>>>>
>>>>
>>>
>>> _______________________________________________
>>> linux-users mailing list
>>> linux-users @ listserv.linux.or.jp
>>> http://listserv.linux.or.jp/mailman/listinfo/linux-users
>>>
>>
>> _______________________________________________
>> linux-users mailing list
>> linux-users @ listserv.linux.or.jp
>> http://listserv.linux.or.jp/mailman/listinfo/linux-users
>>
>>
>
> _______________________________________________
> linux-users mailing list
> linux-users @ listserv.linux.or.jp
> http://listserv.linux.or.jp/mailman/listinfo/linux-users
>




linux-users メーリングリストの案内