📌 置頂: 請把任何比你弱勢的用路人當作你的至親對待。跟前車保持安全車距 (2秒以上)。

TIL: private data struct in Linux kernel

In

,

Tags:



by

在 Linux kernel 當中有許多的 common struct,例如說 ieee80211_txq 這樣的結構,透過這樣的方式,可以讓不同的 driver 重用相同的 struct。但是,針對每個不同的 driver,還是會有不同的 private data,這時候就會用 private data struct 的方式來處理。

例如說,struct ieee80211_txq 是 mac80211 中的 intermediate tx queue,目前有使用的 wireless driver 為 ath9k, ath10k 以及 mt76。struct ieee80211_txq 的整個結構為:

可以看到,除了前四個 member 外,最後還定義了一個 drv_priv,這是用來指向各個 driver 的 private data 的 member。以 ath9k 為例,這邊是指向一個 struct ath_atx_tid,ath10k 則是 struct ath10k_txq

以 ath9k 為例,這邊是在 sta_info_alloc 的地方 allocated:

先看 struct txq_info 的部份:

重點在於 int size = 這行,除了 allocate struct txq_info 的 size 之外,還加上了 private data 的 size (hw->txq_data_size),透過這樣的方式,讓每個 driver 可以使用自身會使用的 data。

範例程式碼:

可以嘗試使用 gdb 觀察不加上 struct foobar size 的狀況下,會有什麼問題。


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.