Linux kernel PCI is_physfn的邏輯
-v0.1 2019.11.22 Sherlock init
Linux內核裏struct pci_dev裏有一個叫is_physfn的域段, 從名字上來看,這個域段可以
用來表示一個pci設備是不是PF。對應的有一個is_virtfn的域段。
顯然在驅動裏如果有的操作需要區分PF和VF, 我們可以用這個域段作爲判斷依據。但是,
實際上如果你去看pci代碼的實現,他的語義要以SRIOV cap存在爲前提的。
他的調用關係是:
pci_iov_init
+-> pci_find_ext_capability(dev, PCI_EXT_CAP_ID_SRIOV)
+-> sriov_init
+-> dev->is_physfn = 1
他的語義是pci設備只有在SRIOV cap存在的時候,纔有區分PF和VF的必要, 纔會去設定
is_physfn。
所以,如果我們用一套驅動同時支持PF和VF, 需要區分PF和VF的操作的時候,如果這時
系統裏有SRIOV cap時,依然可以用is_phyfn這個標記。當系統裏沒有SRIOV cap時,is_physfn
和is_virtfn都不會設置,這時判斷就會錯。這樣的場景發生在PF和VF公用一套驅動,而且
VF直通到guest裏工作之時。
這種情況下,我們一般要在設備驅動裏增加新的標記位,明確的表示這是一個PF還是一個VF。
這個標記位只和設備相關,和SRIOV cap無關。