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

[netbsd,09312] Re: Invalid VA in TX mbuf chain



筒井です。

<060410212936.M0113388@xxxxxxxxxxxxxxxxxxxxxx>の記事において
私は書きました。

> ちまちまと個人的な TODO list を片付けていて、今度は
> NetBSD/cobalt に対して巨大なファイルを ftp で get すると
> r5k_pdcache_wb_range() の中で trap: TLB miss で panic する
> http://mail-index.netbsd.org/port-cobalt/2005/12/27/0003.html
> というのを調べてます。
 :
> ここで MI の VM まわりの挙動について質問なんですが、
> bus_dmamap_load_mbuf() の時点では mbuf の VA は有効だったのに、
> bus_dmamap_sync() が呼ばれた時点ではその VA が無効になっている
> という現象は MI 側のカーネル VM の挙動として
>  (1)あり得る。よって MD 側が何とかしないといけない。
>  (2)あり得ない。MI 側のどこか、もしくは MD bus_dma ルーチンがおかしい。
> のどちらなのでしょう?

この件、 port-mips でも書いてますが、 options SOSEND_NO_LOAN をつけて
sys/kern/uipc_socket.c で sosend_loan() をしないようにすると
起きなくなるようです。

同じカーネルで use_sosend_loan=1 だと ftp での転送10回以内に
ほぼ 100%落ちますが、 use_sosend_loan=0 だと50回ほどやっても
落ちません。しかもなぜか use_sosend_loan=0 のときのほうが
転送速度はよくなります。

sosend_loan() で返ってくる mbuf のページは m_freem() するときに
soloanfree() が呼ばれて pmap_kremove() されるようですが、
tulip.c の tlp_start() では送信 mbuf を別の mbuf にコピー
していない限り bus_smamap_sync(,DMASYNC_PREWRITE) の前に
元の送信 mbuf に対して m_freem() を呼ぶところはないので
何が起こっているのかよくわかりません。

このへんをうまく追う方法ってなにかあるでしょうか。
---
Izumi Tsutsui