[Suzaku:01954] Re: Kernel エラー

mizo email@hidden
2010年 9月 6日 (月) 10:23:11 JST


溝渕です。

Nobuaki Sugishima wrote:
>  ハンドラを
> spin_lock_irqsave(&spin_lock, slFlag);
> 
> spin_lock_irqrestore(&spin_lock, slFlag);
> 
> で挟んでみたのですが、現象は変わりません。
> 
> これとは別にini_module()で
> spin_lock_init(&spin_lock);
> 
> my_open()で
> 
> spin_lock(&spin_lock);
> if ( access_num){
>  spin_unlock(&spin_lock);
>  return -EBUSY;
> }
> access_num ++;
> spin_unlock(&spin_lock);
> 
> をいれ、さらに割り込みハンドラを
> spin_lock(&spin_lock);
> spin_unlock(&spin_lock);
> で挟んでも見たですが、変わりません。
> 
> しかし全く変わらなかったわけではなく、前回報告したrunFlag=falseのところ
> にブレークアウトする正体不明の割り込みはなくなったようです。
> これがもたらすドライバエラーも出なくなりました。

spin_lock_irqsavel()は、スピンロックの取得を試み、成功した場合は外部割り込みを
禁止します。そのため、外部割り込みが入ってこなくなります。

> spin_lockの機能は__SMP__が実装されていないと効果がないそうですが、CPUが
> 一つしかないSUZAKUでは必要なものなのでしょうか?。

なぜspin_lock()を使用したいのでしょうか?外部割り込みを抑制したいとおっしゃって
いたので、spin_lock_irqsavel()を紹介しましたが、spin_lock()はご指摘の通り、SMPで
プリエンプト可能である場合に、スピンロックの取得を試みます。

外部割り込みの禁止を行ないたいのでしょうか?スピンロックを取得したいのでしょうか?

> とにかく割り込みそのものは所定クロックをカウントして自身でOUT命令を発
> 行、停止するメカニズムは問題なく動作しており、割り込みそのものの問題では
> ないことは明らかです。
> 
> 問題はすべて
> __raw_writel(slvReg1[i], addrAut);
> この1ステップに集約されました。
> 
> これが1,000回ほどで突然不能になる何らかの理由を探らなければなりませ
> ん。

「不能」とはどのような状況でしょうか?このステップを実行しても、HWからパルスが
認識できないということでしょうか?このステップを確実に通っていることは確認でき
ていますか?

ドライバ内で、open()時などに、この行を無限ループで実行してみてください。もし、
それでHWからパルスが確認できない場合は、HWを疑った方が良いかもしれません。

> 払出しクロックは100μsec、実測するとクロックIN後ジッターはありま
> すが約10μsecでハードへの出力が始まり、4回のStrobeが発行されてい
> る時間はトータルで1μsec弱、時間的にはCriticalではありません。
> 
> どうも出力内容が変化したところでエラーが発生しているようにも思えますが、
> 内容が間違えていても出力自体が行われなくなることは考えにくいところです。

ここで言う「エラー」と、「__raw_writel(slvReg1[i], addrAut);が不能になる」のは
同じ現象でしょうか?

> 何か示唆がありましたらお願いします。




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