Linux kernel PCI is_physfn的邏輯

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無關。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章