在 Linux 內核編程中,container_of
是一個非常實用的宏,主要用于通過結構體的成員指針來獲取包含該成員的整個結構體的指針。rx_ring = container_of(napi, struct ipoib_recv_ring, napi);
在代碼中就是利用了這個宏,下面我們詳細分析它的作用和工作原理。
背景知識
在內核開發中,struct napi_struct
是用于 NAPI(New API)機制的數據結構。NAPI 是 Linux 網絡子系統中處理網絡數據包接收的一種高效機制,能夠減少中斷處理開銷,提高 CPU 利用率。而 struct ipoib_recv_ring
是一個封裝了 InfiniBand 接收隊列(QP,Queue Pair)相關信息的結構體,其中包含了 struct napi_struct
類型的成員變量 napi
。
container_of
宏的定義
container_of
宏的定義通常如下(以簡化版為例):
#define container_of(ptr, type, member) ({ \const typeof( ((type *)0)->member ) *__mptr &#