家のファイルサーバの 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.
こんなとこかな。
昨日一日、薬飲んで安静にしていたおかげで、熱はだいぶ下がりました。お腹は痛いままです。
熱が下がるとき(下がった後?)って滝のように汗をかきますが、今回は布団に人の形が見えるくらい汗が出ました。起きたら服がびしょびしょだし、自分でもびっくり。
まあ、それは良しとして。会社からもう一度インフルエンザの検査を受けろと言ってきました。2回もやって陰性でしたと言っても、もう一回だけやって欲しいと。もうほとんど熱もないし、そんなことしても無駄にお金がかかる(※)だけで意味がない、と伝えても、とにかくもう一回だけやって欲しいの一点張り。
検査代は後で会社が払ってくれると言うから、個人的に損はしませんけど…会社のやることは意味が分からん。まあ、逆らっても仕方ないので病院へ。
(※)インフルエンザの検査は基本的には熱があるときに受けるものです。熱がなければ、本来不要な検査を行ったことになりますので健康保険が効きません。つまり 10割負担です。
病院で体温を測ると 36.4℃でした。ド平熱もいいとこです。
お医者さんには、熱もないしインフルエンザの検査は実費になりますよ?それでもやります?って言われましたが、とにかく検査をお願いしました。理由?そんなの私にもわかりませんて。
結果は陰性でした。当たり前です!って感じで、お医者さんも若干呆れてました。ですよねー。
この不要な検査で 7千円以上飛んでいきました。MOTTAINAI よ!
それと、お腹痛かった件は腸炎と診断されました。新たにお腹に優しい薬が処方されておしまい。
合計:
本日:
< | 2009 | > | ||||
<< | < | 09 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | - | - | - |
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2016.
Powered by PHP 5.2.17.
using GD bundled (2.0.34 compatible)(png support.)