NXPのQorIQシリーズのT1014プロセッサー*1は一コアなので、これのLinuxビルドでカーネルコンフィギュレーションのCONFIG_SMP(Symmetric Multi-Processing support)を無効にしたところ、ネットワークが使えなくなりました。 QorIQシリーズにはDPAA(Data Path Acceleration Architecture)というネットワーク高速化処理機構があります。DPAAはいくつかの機能から構成されるのですが、このうちのBMAN(Buffer manager)とQMAN(Queue manager)が CONFIG_SMP 無効で使えなくなるためでした。ドライバーの初期化が失敗します。カーネルログです。
bman_portal ff4000000.bman-portal: unable to set IRQ affinity bman_portal ff4000000.bman-portal: init_pcfg: Portal failure on cpu 0 bman_portal ff4000000.bman-portal: portal init failed qman_ccsr ffe318000.qman: Allocated PFDR 0x3c000000 0x2000000 qman_portal ff6000000.qman-portal: unable to set IRQ affinity qman_portal ff6000000.qman-portal: init_pcfg: Portal failure on cpu 0 qman_portal ff6000000.qman-portal: portal init failed fsl_dpa dpaa-ethernet.0: failing probe due to bman portals probe error
カーネルバージョン4.14*2で具体的に説明します(4.19*3も同じです)。
BMAN、QMANのドライバーはdrivers/soc/fsl/qbman/
にあります。BMANドライバーの初期化失敗までの流れです。
bman_portal.c: bman_portals_probed() ↓ bman_portal.c: init_pcfg() ↓ bman.c: bman_create_affine_portal() ↓ bman.c: bman_create_portal() ↓ dpaa_sys.h: dpaa_set_portal_irq_affinity() の irq_can_set_affinity() 呼出しが偽でエラー
このirq_can_set_affinity()
はinclude/linux/interrupt.h
で宣言されてますが、CONFIG_SMP 無効だと
static inline int irq_can_set_affinity(unsigned int irq) { return 0; }
と実装されているためです。 QMANドライバーも同じくこの関数呼び出しでエラーになります。
一コアだから CONFIG_SMP 無効にしたいところですが仕方ないですね。