myk driver と DDI_DEFINE_STREAM_OPS と PSARC 2008/382 Fast Reboot

| トラックバック(0)

Nevada b99 にしたので、 myk driver を build し直そうと思い ON Consolidation を取りにいってみると ON Consolidation 20081006 がリリースされていたので、これを使ってみようかと。

http://dlc.sun.com/osol/on/downloads/20081006/
download 後、archive を展開して、Makefile.confgi の ONUTSDIR に ON Consolidationの PATH を設定して、何も考えずに make を実行
$ make
gcc -c -O3 -D__INLINE__=inline -DGEM_GCC_RUNTIME -ffreestanding -U_NO_LONGLONG -D_KERNEL  -U_ASM_INLINES -D_SYSCALL32 -D_SYSCALL32_IMPL  -Dsun -D__sun -D__SVR4  -DC2_AUDIT  -Wall -Wno-unknown-pragmas -Wno-missing-braces -Wno-sign-compare  -Wno-parentheses -Wno-uninitialized -Wno-implicit-function-declaration  -Wno-unused -Wno-trigraphs -Wno-char-subscripts -Wno-switch  -Wno-format -Werror -Di86pc   -DDEBUG -DDEBUG_LEVEL=1 -UGEM_DEBUG_LEVEL  -I/export/onnv/usr/src/uts/common -DGEM_CONFIG_POLLING -DGEM_CONFIG_GLDv3 -DGEM_CONFIG_VLAN_HW  -DGEM_CONFIG_CKSUM_OFFLOAD -DSOLARIS10  -Unotdef -UNEVER -UGEM_GCC_RUNTIME  -UGEM_COMPAT -USANITY -UGEM_CONFIG_FMA -UMODULE  -UGEM_CONFIG_RX_DIRECT -DGEM_CONFIG_TX_DIRECT  -UOS_PUTBACK  -UCONFIG_CKSUM_OFFLOAD -UCONFIG_LSO -DCONFIG_VLAN_HW -DVERSION='"2.6.2"' myk_gem.c -o i386/myk_gem.o
myk_gem.c:3519:28: macro "DDI_DEFINE_STREAM_OPS" requires 10 arguments, but only 9 given
myk_gem.c:3518: warning: type defaults to `int' in declaration of `DDI_DEFINE_STREAM_OPS'
myk_gem.c:3518: warning: data definition has no type or storage class
myk_gem.c:3598: error: `myk_ops' undeclared here (not in a function)
myk_gem.c:3598: error: initializer element is not constant
myk_gem.c:3598: error: (near initialization for `modldrv.drv_dev_ops')
*** Error code 1
make: Fatal error: Command failed for target `i386/myk_gem.o'
ん?なんか、error で止まったよ?いままで、そんなことなかったのに・・・
しかも、みたくない keyword が出てる気が・・・
myk_gem.c:3519:28: macro "DDI_DEFINE_STREAM_OPS" requires 10 arguments, but only 9 given
き、きた。きたよ DDI。
DDI という文字列見た瞬間、いつもなら、
DDI があらわれた!
さとうはにげだした!
なのですが、今回は、
DDI があらわれた!
さとうはにげだせなかった!
DDI のこうげき!
DDI のクリティカルヒット!
DDI のこうげきで 65535 ダメージ!
さとうはしんでしまった....
こんな感じ。

でも、メッセージをよく読むと、DDI_DEFINE_STREAM_OPS macro には 10個の argument が必要なんだけど、9 個しかないお?なんなの?しn(ry
って書いてありますね。リレイズかけてなかったけど、近くに Pixie がいるので、放置してたらもしかしたらレイズくれるかもくらいの感じですか(意味不明 (´∀`*)

で、myk_gem.c の問題の箇所を見てみると・・・
こんなんなってます。
#ifdef GEM_CONFIG_GLDv3
DDI_DEFINE_STREAM_OPS(myk_ops, nulldev, nulldev, mykattach, mykdetach,
    nodev, NULL, D_MP, NULL);
GLDv3 対応させると使われる macro のようですね。
でもって、9 個ですね。10 個にしないといけないのですが、どこに追加すればいいかわからない。
とりあえず、cvs.opensolaris.org で調べてみる。
keyword は、DDI_DEFINE_STREAM_OPS です。
みっけ。
http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/sys/devops.h#420

#define    DDI_DEFINE_STREAM_OPS(XXname, XXidentify, XXprobe, XXattach, XXdetach, XXreset, XXgetinfo, XXflag, XXstream_tab, XXquiesce) \
この macro は、devops.h で定義されており  history で見比べてみると、最後に XXquiesce ってものが追加されてますね。コメントには、PSARC 2008/382 Fast Reboot とあります。
Fast Reboot 関連の追加変更が発生したのでしょうか。
よくわかりません(´・ω・`)

とにかく、最後に何か追加すればいいのですね!というわけで、myk_gem.c の問題箇所の最後に NULL を追加し、10 個にしてみるとめでたく myk driver が build できました。
動作も特に問題なく。

【やったー!】

でも、NULL オチだとちょっと悲しいので、もう少し調べてみました。
他の driver 類はどうなってるのかなと?適当な driver 名(rge とか nge とか)と DDI_DEFINE_STREAM_OPS を key に検索開始。
rge driver でみっけ。
http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/io/rge/rge_main.c

DDI_DEFINE_STREAM_OPS(rge_dev_ops, nulldev, nulldev, rge_attach, rge_detach, nodev, NULL, D_MP, NULL, rge_quiesce);

なんか、rge_quiesce とかになってますね。nge とかでは、nge_quiesce となってたり。
rge_quiesce をおっかけると、quiesce(9E) なんて keyword とコメントに遭遇。
/*
   1905  * quiesce(9E) entry point.
   1906  *
   1907  * This function is called when the system is single-threaded at high
   1908  * PIL with preemption disabled. Therefore, this function must not be
   1909  * blocked.
   1910  *
   1911  * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
   1912  * DDI_FAILURE indicates an error condition and should almost never happen.
   1913  */
man -s 9E quiesce してみると、 device の interrupt 生成を抑止するための機能みたい。
( ´_ゝ`)フーンって感じ(わかってない)でやり過ごし、その他、 murayama-san's driver である sfe (DP83815/DP83816/SiS900 Fast Ethernet MAC driver for Solaris) が統合されているので、そちらを見てみる。
http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/io/sfe/sfe.c

   2297 DDI_DEFINE_STREAM_OPS(sfe_ops, nulldev, nulldev, sfeattach, sfedetach,
   2298     nodev, NULL, D_MP, NULL, ddi_quiesce_not_supported);
こちらでは、最後に ddi_quiesce_not_supported がついてますね。
さらに、ddi_quiesce_not_supported をたどっていくと、
http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/os/sunddi.c#ddi_quiesce_not_supported

   8926  * Initialization function for drivers that should implement quiesce()
   8927  * but haven't yet.
   8928  */
   8929 /* ARGSUSED */
   8930 int
   8931 ddi_quiesce_not_supported(dev_info_t *dip)
   8932 {
   8933     return (DDI_FAILURE);
   8934 }
   
とのことで、DDI_FAILURE を返すのでつね。
というわけで、quiesce に対応しているかどうかもわからないし、sfe driver も ddi_quiesce_not_supported になってるので、myk driver でも NULL ではなく ddi_quiesce_not_supported を追加することで探索を断念しました。

で、PSARC 2008/382 Fast Reboot ですが、これは、Nevada build 100 で追加される機能のようです。
PSARC 2008/382 Fast Reboot
http://www.opensolaris.org/os/community/arc/caselog/2008/382/mail
ん?じゃ、ddi_quiesce_not_supported をセットした driver が存在すると、Fast Reboot 使えないのかな。。。
あう(´・ω・`)

トラックバック(0)

トラックバックURL: http://solaris.sunfish.suginami.tokyo.jp/blog/mt/mt-tb.cgi/659

: Twitter Updates

    follow me on Twitter

    ウェブページ

    タグクラウド

    Techonrati

    Technorati search

    » リンクしているブログ

    Powered by Movable Type 4.23-ja