Compute Engine 虛擬乙太網 (gve) 的 Linux 核心驅動程式:¶
支援的硬體¶
GVE 驅動程式繫結到 Compute Engine VM 中某些虛擬乙太網裝置使用的單個 PCI 裝置 ID。
欄位 |
值 |
註釋 |
|---|---|---|
供應商 ID |
0x1AE0 |
|
裝置 ID |
0x0042 |
|
子供應商 ID |
0x1AE0 |
|
子裝置 ID |
0x0058 |
|
修訂 ID |
0x0 |
|
裝置類 |
0x200 |
乙太網 |
PCI Bar¶
gVNIC PCI 裝置公開三個 32 位記憶體 BAR: - Bar0 - 裝置配置和狀態暫存器。 - Bar1 - MSI-X 向量表 - Bar2 - IRQ、RX 和 TX 門鈴
裝置互動¶
- 驅動程式透過以下方式與裝置互動
- 暫存器
一個 MMIO 暫存器塊
有關更多詳細資訊,請參見 gve_register.h
- 管理佇列
請參見以下描述
- 重置
裝置可以在任何時候重置
- 中斷
請參見以下支援的中斷
- 傳輸和接收佇列
請參見以下描述
描述符格式¶
GVE 支援兩種描述符格式:GQI 和 DQO。這兩種格式具有完全不同的描述符,將在下面描述。
定址模式¶
GVE 支援兩種定址模式:QPL 和 RDA。QPL(“佇列頁面列表”)模式透過一組預先註冊的頁面傳遞資料。
對於 RDA(“原始 DMA 定址”)模式,頁面集是動態的。因此,資料包緩衝區可以位於訪客記憶體中的任何位置。
暫存器¶
所有暫存器都是 MMIO。
這些暫存器用於初始化和配置裝置,以及查詢裝置狀態以響應管理中斷。
位元組序¶
管理佇列訊息和暫存器都是大端位元組序。
GQI 描述符和資料路徑暫存器是大端位元組序。
DQO 描述符和資料路徑暫存器是小端位元組序。
管理佇列 (AQ)¶
管理佇列是一個 PAGE_SIZE 記憶體塊,被視為 AQ 命令的陣列,驅動程式使用它來向裝置發出命令並設定資源。驅動程式和裝置維護已提交和執行的命令計數。要發出 AQ 命令,驅動程式必須執行以下操作(使用適當的鎖定)
將新命令複製到 AQ 陣列中的下一個可用插槽
將其計數器增加新命令的數量
將計數器寫入 GVE_ADMIN_QUEUE_DOORBELL 暫存器
輪詢 ADMIN_QUEUE_EVENT_COUNTER 暫存器,直到它等於寫入門鈴的值,或直到超時。
裝置將更新每個 AQ 命令中的狀態欄位,並透過 ADMIN_QUEUE_EVENT_COUNTER 暫存器報告為已執行。
裝置重置¶
透過將 0x0 寫入 AQ PFN 暫存器來觸發裝置重置。 這會導致裝置釋放驅動程式分配的所有資源,包括 AQ 本身。
中斷¶
驅動程式支援以下中斷
管理中斷¶
裝置使用管理中斷來告訴驅動程式檢視 GVE_DEVICE_STATUS 暫存器。
管理 irq 的處理程式只是將服務任務排隊到工作佇列中,以檢查暫存器並確認 irq。
通知塊中斷¶
通知塊中斷用於告訴驅動程式輪詢與該中斷關聯的佇列。
這些 irq 的處理程式排程該塊的 napi 執行並輪詢佇列。
GQI 流量佇列¶
GQI 佇列由描述符環和緩衝區組成,並分配給通知塊。
描述符環是由固定大小描述符組成的二次冪大小的環形緩衝區。 它們使用位於 Bar2 中的 __be32 門鈴來推進其頭指標。 尾指標透過按順序消耗描述符並更新 __be32 計數器來推進。 門鈴和計數器都溢位為零。
每個佇列的緩衝區必須提前在裝置中註冊為佇列頁面列表,並且資料包資料只能放入這些頁面中。
傳送¶
gve 將用於傳輸環的緩衝區對映到 FIFO 中,並在將資料包傳送到 NIC 之前將資料包複製到 FIFO 中。
接收¶
用於接收環的緩衝區被放入資料環中,該資料環的長度與描述符環相同,並且頭指標和尾指標一起在環上前進。
DQO 流量佇列¶
每個 TX 和 RX 佇列都分配有一個通知塊。
TX 和 RX 緩衝區佇列(將描述符傳送到裝置)使用 MMIO 門鈴來通知裝置有關新描述符。
RX 和 TX 完成佇列(從裝置接收描述符)使用“生成位”來了解裝置何時填充了描述符。 驅動程式使用“當前生成”初始化所有位。 裝置將使用與當前生成相反的“下一代”填充接收到的描述符。 當環迴繞時,當前/下一代會交換。
驅動程式有責任確保 RX 和 TX 完成佇列不會溢位。 這可以透過限制釋出到 HW 的描述符數量來實現。
TX 資料包有一個 16 位 completion_tag,RX 緩衝區有一個 16 位 buffer_id。 這些將分別在 TX 完成佇列和 RX 佇列上返回,以讓驅動程式知道哪個資料包/緩衝區已完成。
傳送¶
在傳輸之前,資料包的緩衝區被 DMA 對映以供裝置訪問。 資料包成功傳輸後,緩衝區將被取消對映。
接收¶
驅動程式將固定大小的緩衝區釋出到 RX 緩衝區佇列上的 HW。 在關聯的 RX 佇列上接收到的資料包可能跨越多個描述符。