(toppers-users 2683) Re: Tinet でバスエラーが発生 (解決)

ABE Tsukasa abe @ jo.tomakomai-ct.ac.jp
2007年 10月 10日 (水) 18:59:30 JST


システムクリエイト 高橋様

苫小牧高専、情報工学科の阿部です。
ずいぶん時間が経ってしまいました。申し訳ありません。
現在 TINET リリース 1.4 の準備をしています。

さて、

>【現象】
>SH7616 のイーサネットコントローラは送受信バッファの先頭は16Byteアライメントで
>ないといけないがドライバはそうなっていない。そのため、大量のデータを短時間に
>送受信すると固定長メモリ管理が破綻しバスエラーが発生する。
>また、TINETも現状では対応できない状態である。

の件です。
時間が経っているため、認識不足があればお許しください。

>【対策】
>TINETが管理するバッファとは別にコントローラが送受信する16Byteアライメントの
>バッファを用意するのが本筋だと考えられるが、そうすると TINET の『速度を犠牲に
>してもメモリを節約する』という趣旨に反するため、TINETが用意するバッファを16Byte
>アライメント調節にできるように若干増やし、送信時はTINETで生成した送信データを
>コントローラが使用する位置へコピー、受信時はコントローラが受信したデータをTINET
>が扱う位置へコピーすることで解決することとする。
>なお、この際 IPヘッダのアドレスが 4Byteアライメントになるように注意する。
>
>実際の変更内容は下記の通り。
>
>1.TINET
> 1)新たに送受信バッファアライメントを指定する IF_ETHER_NIC_BUF_16BYTE_ALIGNMENT 
>   という定義を設ける。この定義を tinet_nic_defs.h に下記のように追加する。
>
>  #define IF_ETHER_NIC_BUF_16BYTE_ALIGNMENT  /* 送受信バッファは16Byteアライメント */
>
> 2)TINET は送受信バッファのアライメントに関して考慮していない。
>  送受信バッファは T_NET_BUF_IF_PDU などで下記のように定義されている。
>   typedef struct t_net_buf_if_pdu {
>    UB idix;   /* mpfid のインデックス */
>    UB unit;   /* インタフェース番号 */
>    UH len;   /* データの長さ  */
>   #if CPU_NET_ALIGN == 4 && IF_HDR_ALIGN != 4
>    UB align[4 - IF_HDR_ALIGN]; <--- ★これを増やす。
>   #endif
>    UB buf[IF_PDU_SIZE]; /* バッファ本体  */ <--- ★TINETが取り扱う送受信データ
>    } T_NET_BUF_IF_PDU;

この部分については、

#if CPU_NET_ALIGN == 4 && IF_HDR_ALIGN != 4
    UB align[IF_HDR_ALIGN];
#endif

と変更すると、

>  アライメントについては IF_HDR_ALIGN を指定することで IPアドレスを4Byte
>  アライメント調節にできるようになっているが、送受信バッファについては考慮
>  されていない。そこで、align を少し多めに取り、16Byteアライメントでかつ必要
>  な大きさのバッファを確保できるようにする。
>
>  実際には、若干トリッキーだが 下記のようにして align の大きさを 14 とする。
>  14という値は、16Byteアライメントの領域が確保でき、かつIPヘッダのIPアドレス
>  が4Byteアライメントなるようにした値である。
>
>  #if 0 /* 147行目 変更前 */
>   #define IF_HDR_ALIGN  2   /* ヘッダのアライン単位 */
>  #else /* 変更後 */
>   #ifdef IF_ETHER_NIC_BUF_16BYTE_ALIGNMENT
>    #define IF_HDR_ALIGN (-10)
>   #else
>    #define IF_HDR_ALIGN  2   /* ヘッダのアライン単位 */
>   #endif
>  #endif

この部分については、トリッキーなことをせずに、

#ifdef IF_ETHER_NIC_BUF_16BYTE_ALIGNMENT
    #define IF_HDR_ALIGN 14
#else
    #define IF_HDR_ALIGN 2   /* ヘッダのアライン単位 */
#endif

と出来ると思います。
なお、上記の部分は、tinet/net/ethernet.h と考えています。

対応が遅れ、大変申し訳ありませんが、
確認をお願いいたします。

--
.\" 苫小牧工業高等専門学校 情報工学科 教授 阿部 司
.\" E-mail: abe @ jo.tomakomai-ct.ac.jp  TEL/FAX: 0144-67-8937