[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: fxp at pci on arm32 and bus_dmamap_sync()



筒井です。

<200007031009.e63A9WU29338@edge.sky.yamashina.kyoto.jp>の記事において
taca@kyoto.jepro.co.jpさんは書きました。

> 試しに、FXP_NRFABUFSを64から256に増やしてみました。

> 変更前: 1度ももたないでpanicする。
> 変更後: 1度は持つが、3度は持たない。
> 
> といった具合いで多少変化がありました。

受信バッファが一杯になると変なことになるというのは確かみたいですね。

ただ、いろいろ考えてみると、以前書いたように host が
link_addr を書き換えている最中に fxp がそのアドレスを
読んでいるのではないかという推定は違うような気がしてきました。

link_addr は i82557var.h の FX_INIT_RFABUF() 中の

	__p_rfa = FXP_MTORFA(__p_m);                            \
	__v = htole32(__rxmap->dm_segs[0].ds_addr +             \
            RFA_ALIGNMENT_FUDGE);                               \
        FXP_RFASYNC((sc), __p_m,                                \
            BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);        \
        memcpy((void *)&__p_rfa->link_addr, &__v,               \
            sizeof(__v));                                       \

というように memcpy() で書き込むんですが、書き込む前の値は
0xffffffff なので、書換え中の値が fxp に読み込まれたとしても
都合よく別の memory pool 領域のアドレスにはならないような気が
します。("free list modified" の panic にはならない)

free された mbuf に対して fxp が転送をしてしまうという状況が
どういう場合に発生し得るか考えてみると、

1)driver が一つの mbuf をダブって複数の RFA の link_addr に設定した
2)fxp が転送をしている最中あるいは転送を始める前に driver が転送を
  キャンセルして mbuf を free した

等がありますが、ざっと source を見た感じでは問題なさそうです。

一つ気になるのが受信割り込みの no resouces (FXP_SCB_STATACK_RNR)が
発生した場合の処理ですが、 chip のマニュアルがないのでいまいち
よくわかりません。 FXP_SCB_STATACK_RNR が起きると、最終的に
fxp_intr() の do_transmit: の後で先頭の RFA のアドレスを
再設定しているんですが、その前に受信動作を停止させる必要が
あるんじゃないかという気がしてます。(実際は勝手に止まるのかも)

確認項目としては

1) FXP_SCB_STATACK_RNR の発生と panic との間に相関性はあるか
2) do_transmit: の FXP_SCB_COMMAND_RU_START の再設定の前に

	fxp_scb_wait(sc);
	CSR_WRITE_1(sc, FXP_CSR_SCB_COMMAND, FXP_SCB_COMMAND_RU_ABORT);

  とか足して受信部を停止させる(マニュアルがないのであてずっぽです)と
  どうなるか

とかでしょうか。

> こっちはDC-390の方ですが、BIOSが有効なときと無効なときでdiffを取ると、

>  pcscp0 at pci0 dev 17 function 0: PCI configuration registers:

>        I/O space accesses: on
> -      Memory space accesses: on
> +      Memory space accesses: off
>        Bus mastering: on

if_fxp_pci.c を見ると fxp には bug があって PCI space の map の
ところでごちゃごちゃやっているようです。なのでこのあたりはちょっと
気になりますね。

> といった具合いです。fxpの方は、

>      Base address register at 0x10
>        type: 32-bit prefetchable memory
> -      base: 0xee101000, size: 0x00001000
> +      base: 0xed101000, size: 0x00001000
>      Base address register at 0x14
>        type: i/o
>        base: 0x0000ec00, size: 0x00000020

fxp 側はとくに変わってないということですが、

1) if_fxp_pci.c で強制的に memh_valid = 0 して
   i/o mapped access を指定する
2) DC390 と fxp の PCI スロットにさしている順番を入れ換える

とかすると何か変わったりするんでしょうか? 
(あいかわらずこのへんよくわかってないです……)
---
Izumi Tsutsui
tsutsui@ceres.dti.ne.jp