Devlink 埠¶
devlink-port 是裝置上存在的埠。它具有裝置邏輯上獨立的入口/出口點。devlink 埠可以有多種型別。devlink 埠型別以及埠屬性描述了埠的代表意義。
裝置驅動程式如果想釋出 devlink 埠,需要設定 devlink 埠屬性並註冊 devlink 埠。
Devlink 埠型別如下所述。
型別 |
描述 |
|
任何型別的物理埠。這可以是 eswitch 物理埠或裝置上的任何其他物理埠。 |
|
表示 DSA 互連埠。 |
|
表示僅適用於 DSA 的 CPU 埠。 |
|
表示代表 PCI 物理功能 (PF) 埠的 eswitch 埠。 |
|
表示代表 PCI 虛擬功能 (VF) 埠的 eswitch 埠。 |
|
表示代表 PCI 子功能 (SF) 埠的 eswitch 埠。 |
|
表示 PCI 虛擬功能的虛擬埠。 |
Devlink 埠可以根據下面描述的鏈路層具有不同的型別。
型別 |
描述 |
|
當埠的鏈路層是乙太網時,驅動程式應設定此埠型別。 |
|
當埠的鏈路層是 InfiniBand 時,驅動程式應設定此埠型別。 |
|
當驅動程式應自動檢測埠型別時,使用者會指示此型別。 |
PCI 控制器¶
在大多數情況下,PCI 裝置只有一個控制器。一個控制器由潛在的多個物理功能、虛擬功能和子功能組成。一個功能由一個或多個埠組成。該埠由 devlink eswitch 埠表示。
但是,連線到多個 CPU 或多個 PCI 根複合體或 SmartNIC 的 PCI 裝置可能具有多個控制器。對於具有多個控制器的裝置,每個控制器都由唯一的控制器編號區分。eswitch 位於支援多個控制器埠的 PCI 裝置上。
具有兩個控制器的系統的示例檢視
---------------------------------------------------------
| |
| --------- --------- ------- ------- |
----------- | | vf(s) | | sf(s) | |vf(s)| |sf(s)| |
| server | | ------- ----/---- ---/----- ------- ---/--- ---/--- |
| pci rc |=== | pf0 |______/________/ | pf1 |___/_______/ |
| connect | | ------- ------- |
----------- | | controller_num=1 (no eswitch) |
------|--------------------------------------------------
(internal wire)
|
---------------------------------------------------------
| devlink eswitch ports and reps |
| ----------------------------------------------------- |
| |ctrl-0 | ctrl-0 | ctrl-0 | ctrl-0 | ctrl-0 |ctrl-0 | |
| |pf0 | pf0vfN | pf0sfN | pf1 | pf1vfN |pf1sfN | |
| ----------------------------------------------------- |
| |ctrl-1 | ctrl-1 | ctrl-1 | ctrl-1 | ctrl-1 |ctrl-1 | |
| |pf0 | pf0vfN | pf0sfN | pf1 | pf1vfN |pf1sfN | |
| ----------------------------------------------------- |
| |
| |
----------- | --------- --------- ------- ------- |
| smartNIC| | | vf(s) | | sf(s) | |vf(s)| |sf(s)| |
| pci rc |==| ------- ----/---- ---/----- ------- ---/--- ---/--- |
| connect | | | pf0 |______/________/ | pf1 |___/_______/ |
----------- | ------- ------- |
| |
| local controller_num=0 (eswitch) |
---------------------------------------------------------
在上面的示例中,外部控制器(由控制器編號 = 1 標識)沒有 eswitch。本地控制器(由控制器編號 = 0 標識)具有 eswitch。本地控制器上的 Devlink 例項具有兩個控制器的 eswitch devlink 埠。
功能配置¶
使用者可以在列舉 PCI 功能之前配置一個或多個功能屬性。通常,這意味著使用者應在為該功能建立特定於匯流排的裝置之前配置功能屬性。但是,啟用 SRIOV 後,將在 PCI 總線上建立虛擬功能裝置。因此,應在將虛擬功能裝置繫結到驅動程式之前配置功能屬性。對於子功能,這意味著使用者應在啟用埠功能之前配置埠功能屬性。
使用者可以使用 devlink port function set hw_addr 命令設定功能的硬體地址。對於乙太網埠功能,這意味著 MAC 地址。
使用者還可以使用 devlink port function set roce 命令設定功能的 RoCE 功能。
使用者還可以使用 devlink port function set migratable 命令將功能設定為可遷移。
使用者還可以使用 devlink port function set ipsec_crypto 命令設定功能的 IPsec 加密功能。
使用者還可以使用 devlink port function set ipsec_packet 命令設定功能的 IPsec 資料包功能。
使用者還可以使用 devlink port function set max_io_eqs 命令設定功能的最大 IO 事件佇列數。
功能屬性¶
MAC 地址設定¶
PCI VF/SF 的已配置 MAC 地址將由為 PCI VF/SF 建立的 netdevice 和 rdma 裝置使用。
獲取由其唯一 devlink 埠索引標識的 VF 的 MAC 地址
$ devlink port show pci/0000:06:00.0/2 pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 function: hw_addr 00:00:00:00:00:00設定由其唯一 devlink 埠索引標識的 VF 的 MAC 地址
$ devlink port function set pci/0000:06:00.0/2 hw_addr 00:11:22:33:44:55 $ devlink port show pci/0000:06:00.0/2 pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 function: hw_addr 00:11:22:33:44:55獲取由其唯一 devlink 埠索引標識的 SF 的 MAC 地址
$ devlink port show pci/0000:06:00.0/32768 pci/0000:06:00.0/32768: type eth netdev enp6s0pf0sf88 flavour pcisf pfnum 0 sfnum 88 function: hw_addr 00:00:00:00:00:00設定由其唯一 devlink 埠索引標識的 SF 的 MAC 地址
$ devlink port function set pci/0000:06:00.0/32768 hw_addr 00:00:00:00:88:88 $ devlink port show pci/0000:06:00.0/32768 pci/0000:06:00.0/32768: type eth netdev enp6s0pf0sf88 flavour pcisf pfnum 0 sfnum 88 function: hw_addr 00:00:00:00:88:88
RoCE 功能設定¶
並非所有 PCI VF/SF 都需要 RoCE 功能。
當停用 RoCE 功能時,可以節省每個 PCI VF/SF 的系統記憶體。
當用戶停用 VF/SF 的 RoCE 功能時,使用者應用程式無法透過此 VF/SF 傳送或接收任何 RoCE 資料包,並且此 PCI 的 RoCE GID 表將為空。
當使用埠功能屬性在裝置中停用 RoCE 功能時,VF/SF 驅動程式無法覆蓋它。
獲取 VF 裝置的 RoCE 功能
$ devlink port show pci/0000:06:00.0/2 pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 function: hw_addr 00:00:00:00:00:00 roce enable設定 VF 裝置的 RoCE 功能
$ devlink port function set pci/0000:06:00.0/2 roce disable $ devlink port show pci/0000:06:00.0/2 pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 function: hw_addr 00:00:00:00:00:00 roce disable
可遷移功能設定¶
即時遷移是將即時虛擬機器從一臺物理主機傳輸到另一臺物理主機,而不會中斷其正常操作的過程。
希望 PCI VF 能夠執行即時遷移的使用者需要顯式啟用 VF 可遷移功能。
當用戶啟用 VF 的可遷移功能,並且 HV 將 VF 繫結到具有遷移支援的 VFIO 驅動程式時,使用者可以將 VM 與此 VF 從一個 HV 遷移到另一個 HV。
但是,當啟用可遷移功能時,裝置將停用無法遷移的功能。因此,可遷移功能可能會對 VF 施加限制,因此讓使用者決定。
具有可遷移功能配置的 LM 示例:- 獲取 VF 裝置的可遷移功能
$ devlink port show pci/0000:06:00.0/2
pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1
function:
hw_addr 00:00:00:00:00:00 migratable disable
設定 VF 裝置的可遷移功能
$ devlink port function set pci/0000:06:00.0/2 migratable enable $ devlink port show pci/0000:06:00.0/2 pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 function: hw_addr 00:00:00:00:00:00 migratable enable將 VF 繫結到具有遷移支援的 VFIO 驅動程式
$ echo <pci_id> > /sys/bus/pci/devices/0000:08:00.0/driver/unbind $ echo mlx5_vfio_pci > /sys/bus/pci/devices/0000:08:00.0/driver_override $ echo <pci_id> > /sys/bus/pci/devices/0000:08:00.0/driver/bind
將 VF 附加到 VM。啟動 VM。執行即時遷移。
IPsec 加密功能設定¶
當用戶為 VF 啟用 IPsec 加密功能時,使用者應用程式可以將 XFRM 狀態加密操作(加密/解密)解除安裝到此 VF。
當停用 VF 的 IPsec 加密功能(預設)時,XFRM 狀態由核心中的軟體處理。
獲取 VF 裝置的 IPsec 加密功能
$ devlink port show pci/0000:06:00.0/2 pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 function: hw_addr 00:00:00:00:00:00 ipsec_crypto disabled設定 VF 裝置的 IPsec 加密功能
$ devlink port function set pci/0000:06:00.0/2 ipsec_crypto enable $ devlink port show pci/0000:06:00.0/2 pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 function: hw_addr 00:00:00:00:00:00 ipsec_crypto enabled
IPsec 資料包功能設定¶
當用戶為 VF 啟用 IPsec 資料包功能時,使用者應用程式可以將 XFRM 狀態和策略加密操作(加密/解密)解除安裝到此 VF,以及 IPsec 封裝。
當停用 VF 的 IPsec 資料包功能(預設)時,XFRM 狀態和策略由核心中的軟體處理。
獲取 VF 裝置的 IPsec 資料包功能
$ devlink port show pci/0000:06:00.0/2 pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 function: hw_addr 00:00:00:00:00:00 ipsec_packet disabled設定 VF 裝置的 IPsec 資料包功能
$ devlink port function set pci/0000:06:00.0/2 ipsec_packet enable $ devlink port show pci/0000:06:00.0/2 pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 function: hw_addr 00:00:00:00:00:00 ipsec_packet enabled
最大 IO 事件佇列設定¶
當用戶為 SF 或 VF 設定最大 IO 事件佇列數時,此類功能驅動程式僅限於使用強制數量的 IO 事件佇列。
IO 事件佇列傳遞與 IO 佇列相關的事件,包括網路裝置傳送和接收佇列(txq 和 rxq)和 RDMA 佇列對 (QP)。例如,netdevice 通道和 RDMA 裝置完成向量的數量是從功能的 IO 事件佇列派生的。通常,驅動程式使用的中斷向量數量受到每個裝置的 IO 事件佇列數量的限制,因為每個 IO 事件佇列都連線到一箇中斷向量。
獲取 VF 裝置的最大 IO 事件佇列數
$ devlink port show pci/0000:06:00.0/2 pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 function: hw_addr 00:00:00:00:00:00 ipsec_packet disabled max_io_eqs 10設定 VF 裝置的最大 IO 事件佇列數
$ devlink port function set pci/0000:06:00.0/2 max_io_eqs 32 $ devlink port show pci/0000:06:00.0/2 pci/0000:06:00.0/2: type eth netdev enp6s0pf0vf1 flavour pcivf pfnum 0 vfnum 1 function: hw_addr 00:00:00:00:00:00 ipsec_packet disabled max_io_eqs 32
子功能¶
子功能是一種輕量級功能,它具有在其上部署的父 PCI 功能。子功能以 1 為單位建立和部署。與 SRIOV VF 不同,子功能不需要自己的 PCI 虛擬功能。子功能透過父 PCI 功能與硬體通訊。
要使用子功能,請按照 3 個步驟的設定順序進行
建立 - 建立子功能;
配置 - 配置子功能屬性;
部署 - 部署子功能;
子功能管理是使用 devlink 埠使用者介面完成的。使用者在子功能管理裝置上執行設定。
(1) 建立¶
使用 devlink 埠介面建立子功能。使用者透過新增子功能型別的 devlink 埠來新增子功能。devlink 核心程式碼向下呼叫子功能管理驅動程式(devlink ops)並要求它建立子功能 devlink 埠。然後,驅動程式例項化子功能埠和任何關聯的物件,例如執行狀況報告程式和表示網路裝置。
(2) 配置¶
子功能 devlink 埠已建立,但尚未啟用。這意味著實體是在 devlink 端建立的,e-switch 埠表示已建立,但子功能裝置本身尚未建立。使用者可以使用 e-switch 埠表示進行設定,將其放入網橋,新增 TC 規則等。使用者也可以在子功能處於非活動狀態時配置子功能的硬體地址(例如 MAC 地址)。
(3) 部署¶
配置子功能後,使用者必須啟用它才能使用它。啟用後,子功能管理驅動程式會要求子功能管理裝置在特定的 PCI 功能上例項化子功能裝置。子功能裝置是在 Documentation/driver-api/auxiliary_bus.rst 上建立的。此時,匹配的子功能驅動程式將繫結到子功能的輔助裝置。
速率物件管理¶
Devlink 提供了管理單個 devlink 埠或組的 tx 速率的 API。這是透過速率物件完成的,速率物件可以是以下兩種型別之一
葉表示單個 devlink 埠;由驅動程式建立/銷燬。由於葉與其 devlink 埠具有 1 對 1 對映,因此在使用者空間中將其稱為
pci/<bus_addr>/<port_index>;節點表示一組速率物件(葉和/或節點);由來自使用者空間的請求建立/刪除;最初為空(未新增速率物件)。在使用者空間中,它被稱為
pci/<bus_addr>/<node_name>,其中node_name可以是任何識別符號,十進位制數字除外,以避免與葉發生衝突。
API 允許配置以下速率物件的引數
tx_share所有其他速率物件之間共享的最小 TX 速率值,或者速率物件如果是父組的一部分,則與其他組的一部分共享。
tx_max最大 TX 速率值。
tx_priority允許在兄弟節點之間使用嚴格的優先順序仲裁器。此仲裁方案嘗試根據節點的優先順序來排程節點,只要節點保持在其頻寬限制內。優先順序越高,節點被選擇進行排程的可能性就越高。
tx_weight允許在兄弟節點之間使用加權公平佇列仲裁方案。此仲裁方案可以與嚴格優先順序同時使用。當節點配置更高的速率時,它會獲得相對於其兄弟節點更多的 BW。這些值是相對的,就像百分比點一樣,它們基本上告訴節點應該獲得相對於其兄弟節點的多少 BW。
父父節點名稱。父節點速率限制被視為所有節點子節點限制的附加限制。
tx_max是子節點的上限。tx_share是在子節點之間分配的總頻寬。
tx_priority 和 tx_weight 可以同時使用。在這種情況下,具有相同優先順序的節點在兄弟節點組中形成一個 WFQ 子組,並且它們之間的仲裁基於分配的權重。
從高級別仲裁流程
選擇優先順序最高且保持在 BW 限制內且未被阻止的節點或節點組。使用
tx_priority作為此仲裁的引數。如果節點組具有相同的優先順序,則對該子組執行 WFQ 仲裁。使用
tx_weight作為此仲裁的引數。選擇獲勝節點,並繼續在其子節點之間進行仲裁流程,直到到達葉節點並建立獲勝者。
如果最高優先順序子組中的所有節點都已滿足或過度使用其分配的 BW,請移動到較低優先順序的節點。
驅動程式實現允許支援兩種或任一速率物件型別及其引數的設定方法。此外,驅動程式實現可以匯出節點/葉及其父子關係。
術語和定義¶
術語 |
定義 |
|
具有一個或多個 PCI 匯流排的物理 PCI 裝置由一個或多個 PCI 控制器組成。 |
|
控制器由潛在的多個物理功能、虛擬功能和子功能組成。 |
|
管理埠功能的實體。 |
|
一種輕量級功能,它具有在其上部署的父 PCI 功能。 |
|
子功能的匯流排裝置,通常位於輔助總線上。 |
|
子功能輔助裝置的裝置驅動程式。 |
|
支援子功能管理的 PCI 物理功能。 |
|
支援使用 devlink 埠介面進行子功能管理的 PCI 物理功能的裝置驅動程式。 |
|
託管子功能裝置的 PCI 物理功能的裝置驅動程式。在大多數情況下,它與子功能管理驅動程式相同。當子功能在外部控制器上使用時,子功能管理驅動程式和主機驅動程式是不同的。 |