Armadilloフォーラム

ACMによる繰り返しデコード時のfsi要因の不具合修正パッチ

at_ohsawa

2014年9月26日 12時04分

大澤です。

gstreamerを使用してACMによるデコードを繰り返し実行すると、ビデオストリーム
によっては 再起動 や gstreamerのエラー 等の不具合が発生する事を確認しています。
複数の要因があることは確認できているのですが、現在調査中です。

不具合の1つである、音声入出力FIFO(fsi)デバイスドライバのバグを修正する
パッチを作成しました。

このバグによる不具合が発生すると、下記のBacktraceが出力され最終的に
watchdog timedout によって再起動します。

下記のエラーメッセージが出た後に、Armadilloが再起動してしまう方はテスト
して頂けると助かります。

Unable to handle kernel NULL pointer dereference at virtual address 000000a0
pgd = c0004000
[000000a0] *pgd=00000000
Internal error: Oops: 17 [#1] PREEMPT ARM
Modules linked in:
CPU: 0    Not tainted  (3.4-at9 #1)
PC is at fsi_dma_do_work+0xb4/0x270
LR is at fsi_dma_do_work+0x94/0x270
pc : [<c034ed40>]    lr : [<c034ed20>]    psr: a0000013
sp : ccea1ef8  ip : 00000000  fp : ccea1f54
r10: 00000001  r9 : c100b6c0  r8 : d0b3a114
r7 : cc80d800  r6 : 00000000  r5 : d0ae75d0  r4 : d0b3a154
r3 : 00000000  r2 : 00000000  r1 : 00000001  r0 : c0562dd8
Flags: NzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
Control: 10c53c7d  Table: 44b9c059  DAC: 00000015
Process kworker/0:1 (pid: 11644, stack limit = 0xccea02e8)
Stack: (0xccea1ef8 to 0xccea2000)
1ee0:                                                       c000fc1c ccea0000
1f00: 00000001 00000780 d0b3a170 00000001 00000001 d0b3a108 ccea1f8c ccea1f58
1f20: c003f280 c0032758 00000000 c7ba9e40 c08da800 00000000 c08da805 d0b3a154
1f40: 00000009 c056d900 ccea1f8c ccea1f58 c0032798 c034ec98 c003f368 c00335ec
1f60: 00000000 c7ba9e40 ccea0000 c056d900 c7ba9e54 ccea0000 00000009 c056d900
1f80: ccea1fbc ccea1f90 c0033784 c00325ac 00000000 c0e5fef0 c7ba9e40 c00335b0
1fa0: 00000013 00000000 00000000 00000000 ccea1ff4 ccea1fc0 c00375a8 c00335bc
1fc0: c0e5fef0 00000000 c7ba9e40 00000000 ccea1fd0 ccea1fd0 00000000 c0e5fef0
1fe0: c0037514 c0020ed8 00000000 ccea1ff8 c0020ed8 c0037520 bede0fca 00000000
Backtrace:
[<c034ec8c>] (fsi_dma_do_work+0x0/0x270) from [<c0032798>] (process_one_work+0x1f8/0x370)
[<c00325a0>] (process_one_work+0x0/0x370) from [<c0033784>] (worker_thread+0x1d4/0x2f8)
[<c00335b0>] (worker_thread+0x0/0x2f8) from [<c00375a8>] (kthread+0x94/0xa0)
[<c0037514>] (kthread+0x0/0xa0) from [<c0020ed8>] (do_exit+0x0/0x75c)
 r6:c0020ed8 r5:c0037514 r4:c0e5fef0
(....省略)
0d60: c003773c 00000000 ccea0d84 ccea0d78 c03f2d18 c03f22f4 ccea0db4 ccea0d88
0d80: c0020fe0 c03f2ca0 ccea0000 ccea0e02 c003773c 00000000 ccea0db4 ccea0da8
0da0: c001d680 ccea0000 ccea0e34 ccea0db8 c00115c0 c0020ee4 ccerebooted by watchdog timedout.

パッチの適用方法:
対応バージョンは Linuxカーネル v3.4-at9 (2014年9月現在最新版) です。
それより古くても適用可能ですが、動作確認は行っていません。

添付のfix_fsi_resources_locking.patchをダウンロードして、
linuxカーネルのソースコードに適用し、ビルドしてください。

(適用例)

[ATDE ~/]$ cd ~/atmark-dist/linux-3.x
[ATDE ~/atmark-dist/linux-3.x]$ patch -p1 < fix_fsi_resources_locking.patch
ファイル ファイルの説明
fix_fsi_resources_locking.patch
コメント

大澤です。
前回のパッチでは修正が不十分だったため、spin_lockを取る区間を広げるよう
変更したパッチ (fix_fsi_resources_locking_v2.patch) を作成いたしました。

現在試験中ですが評価完了し次第、製品アップデートでカーネルを
バージョンアップする予定です。

ファイル ファイルの説明
fix_fsi_resources_locking_v2.patch 修正版パッチver.2