家のファイルサーバのLinuxカーネルバージョンを2.6.30.5にアップデートしたところ、r8168 PCI-eギガビットイーサネットドライバがコンパイルできなくなりました。
原因は NAPIの関数名が一部変わったためです。netif_rx_xx系が廃止され、napi_xxへ移行しました。これによりnetif_rx_xx系を使用している部分がリンクエラーとなります。
もうひとつ原因があって irqreturn_tのtypedefがintからenum irqreturnへ変わり、IRQ_HANDLEDがマクロではなく列挙型になったためです。これにより2.4.xとのコンパチを保つための定番処理(※)の判定を誤って、irqreturn_tをvoidと定義してしまいます。
このため割り込みハンドラが値を返さない関数として定義されてしまい、ハンドラ内でreturn IRQ_HANDLED; などとしている部分がコンパイルエラーになります。
以上の変更点を踏まえたパッチは以下の通り。Realtekが提供しているr8168-8.012.00に当てます。
diff -r 2aec411ad986 src/r8168.h
--- a/src/r8168.h Sat Aug 29 04:02:18 2009 +0900
+++ b/src/r8168.h Fri Sep 04 23:14:44 2009 +0900
@@ -37,11 +37,13 @@
#define CHECKSUM_PARTIAL CHECKSUM_HW
#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
#ifndef IRQ_HANDLED
#define irqreturn_t void
#define IRQ_HANDLED
#define IRQ_NONE
#endif
+#endif /* #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) */
#ifndef HAVE_FREE_NETDEV
#define free_netdev(x) kfree(x)
@@ -251,7 +253,11 @@
#define RTL_GET_NETDEV(priv_ptr) struct net_device *dev = priv_ptr->dev;
#define RTL_RX_QUOTA(ndev, budget) budget
#define RTL_NAPI_QUOTA_UPDATE(ndev, work_done, budget)
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
+ #define RTL_NETIF_RX_COMPLETE(dev, napi) napi_complete(napi)
+ #define RTL_NETIF_RX_SCHEDULE_PREP(dev, napi) napi_schedule_prep(napi)
+ #define __RTL_NETIF_RX_SCHEDULE(dev, napi) __napi_schedule(napi)
+ #elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
#define RTL_NETIF_RX_COMPLETE(dev, napi) netif_rx_complete(dev, napi)
#define RTL_NETIF_RX_SCHEDULE_PREP(dev, napi) netif_rx_schedule_prep(dev, napi)
#define __RTL_NETIF_RX_SCHEDULE(dev, napi) __netif_rx_schedule(dev, napi)
このパッチを使う方がもしいましたら、ご自由にどうぞ。一応、我が家のファイルサーバ上では元気に動いております。が、ご利用の際は自己責任でよろしくお願いいたします。
今回紹介した変更点が、いつカーネルに取り込まれたかについてはLinux kernelのgitリポジトリを調べてね…というのはちょっと無責任ですので、紹介しておきます。
細かいログは参考の章に譲り、変更点がマージされた時期と関連するバージョンタグだけ挙げます。時間は全てUTC換算です。
従って私のパッチでは、NAPIはLinux 2.6.29未満であれば古いAPIを使い、irqreturn_tはLinux 2.6.30未満であれば古い定義を使うようにしています。
(※)irqreturn_tを使うハンドラを、古い2.4.x系とコードコンパチにするコードとして、カーネルのコメント中で紹介されていた方法です。r8168が悪いわけではありません。
以下はirqreturn_tが変化したときのログ。
----- マージ
commit a8416961d32d8bb757bcbb86b72042b66d044510
Merge: 6671de3 fc2869f
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date: Thu Mar 26 16:06:50 2009 -0700
Merge branch 'irq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/gi
t/tip/linux-2.6-tip
----- パッチ
commit bedd30d986a05e32dc3eab874e4b9ed8a38058bb
Author: Thomas Gleixner <tglx@linutronix.de>
Date: Tue Sep 30 23:14:27 2008 +0200
genirq: make irqreturn_t an enum
Impact: cleanup
Remove the 2.4 compabiliy cruft
もうひとつNAPIが変化したときのログ。
----- マージ
commit 8e91f178a2bb4a3e52e76f6263c251ffb816eb17
Merge: 8032b52 ea8dbdd
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date: Mon Mar 16 07:56:58 2009 -0700
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
----- パッチ
commit 9fae6c3f648e38f023b99b5f5a5280907b2e796e
Author: Ilya Yanok <yanok@emcraft.com>
Date: Fri Mar 13 09:51:46 2009 -0700
dnet: replace obsolete *netif_rx_* functions with *napi_*
*netif_rx_* functions is obsolete and removed in newer kernels so
we need to use corresponding *napi_* functions instead.
こんなとこかな。
昨日長々と書きましたが、実はRealtekのサイトにて公開されているr8168ドライバのバージョン8.014.00を使えばパッチもへったくれも必要ありませんでした。
他の変更(バグフィクスかな?)も入っているようなので、8.012.00にこだわる理由がなければさくっとアップデートした方が良いと思います。
まあ、一つの勉強にはなったけど、あんまり意味が無かったな…。
デスクトップマシンのメモリを1GBから3GBに増やそうと思い、DDR2 800の1GB x 2を買いました。デスクトップマシンは800でなく400だった気がするけど、値段はDDR2 800が一番安いので、これでいいのです。
で、今日Amazonからメモリが届いたので早速増設しようと思ったら、どう頑張っても挿せない。しかもスロットとメモリのピン数が違う??なんぞこれ。
嫌な予感がして、既に挿してあったメモリを確認すると、DDR2 400ではなくDDR 400でした。そんな馬鹿な…というか馬鹿は俺じゃね?
もう本当にありがとうございました。
メモリどうしよう。Transcend JetRam 1GB x 2です。悪い品ではないと思います。誰か使いません?
大下さんとサマーウォーズを見に行きました。
劇中に、買い物、公的手続き、会社設立、果ては軍事施設やインフラ(水道、電気)の制御…などなどオンラインで何でもできるOZ(オズ)システムが出てきます。
映画のストーリーとしてはOZが何者かに乗っ取られてメチャクチャになり、主人公とヒロイン、ヒロインの親戚一族が立ち向かうってなお話です。
舞台はヒロインの実家の片田舎です。大きく分けると、田舎を舞台にした人情系のお話と、OZを舞台にしたバトルのお話に分かれます。前者は文系、後者は理系の人が楽しめるかなと思います。
面白かったので気になる方は映画館へGO。まだ映画館でやってるはずです。
映画を見ていると、何でも出来る夢のシステムOZ(オズ)がうらやましく感じます。今の技術でOZの実現はできないのでしょうか。
軍事施設の制御などを除けば、OZって現在のオンラインサービスが全部一つになったようなもんです。実はOZの実現って技術的にはそう遠い話ではないと思われます。
一番面倒くさそうなのは、政治的な問題、OZの行く末を誰が決めるのか?って問題ですね。あれを入れる、これを入れない、でケンカになること間違いなしです。
過半数を取った勢いで民主党が様々な政策をぶち上げていますが、先週あたりホットな話題になっていた中小企業の借入金返済猶予について一考します。
中小企業の借入金返済猶予は、ざっくり言えば、中小企業が借りたお金を返す期限を延ばしますよ、だいたい3年くらいね。ってな法案です。もちろん詳細は未定なので、今後大きく変わる可能性があります。
昨今の不況で資金繰りに困っている中小企業を助けるつもりなのでしょうが、銀行からみれば貸した金が3年間返ってこなくなるわけで、これから貸す分については厳しく審査(=貸し渋り)したくなるでしょう。
その結果、金を借りられなくなった中小企業がぶっ潰れます。助けたはずが潰れてた…という逆効果になりませんかね。ちょっと心配です。
この政策をぶち上げた亀井さんは「今回の発言で株価が下がった銀行は銀行やる資格がない」とか「苦しくなった銀行には公的資金注入すればよい」とかのたまってるそうです(※)。
公的資金は沸いてくるもんじゃないから、国債で借金か、増税しかないわけですよ。選挙前に鳩山さんが言ってた「しばらくは増税しません」ってのが嘘じゃないなら、国債がさらに増えることになりそうです。
こんなんじゃ銀行が倒産する前に、いつか日本が倒産しますね。いや、もう倒産寸前か…。
(※)ソースはこの辺です。
朝日新聞 - 「私の発言で株価下がるような銀行は…」勢いづく亀井節
ロイター - 返済金猶予制度、苦しくなる金融機関には公的資金も=金融相
貸し渋る銀行への次の一手として、無理に貸し出させる法案が来そうです。しかしそんなことをしても焦げ付いて返ってこなくなるだけです。不良債権の山を抱えた銀行はぶっ潰れて、再び金融恐慌に真っ逆さまです。
まさか中小企業にお金を貸すときは国が担保する。なーんて法案作らないよね…?さすがにそんなばらまきはしないと信じて良いよね…?