網路驅動程式的Netmem支援¶
本文件概述了網路驅動程式支援netmem(一種抽象記憶體型別,支援裝置記憶體TCP等功能)的要求。透過支援netmem,驅動程式可以透過很少或無需修改來與各種底層記憶體型別協同工作。
Netmem的優勢
靈活性:Netmem可以由不同的記憶體型別(例如,struct page,DMA-buf)支援,從而允許驅動程式支援各種用例,例如裝置記憶體TCP。
面向未來:具有netmem支援的驅動程式已為依賴它的即將到來的功能做好了準備。
簡化開發:驅動程式與一致的API互動,無論底層記憶體實現如何。
驅動程式RX要求¶
驅動程式必須支援page_pool。
驅動程式必須支援tcp-data-split ethtool選項。
驅動程式必須使用page_pool netmem API處理負載記憶體。netmem API目前與page API一對一對應。透過將page API切換為netmem API,並透過驅動程式中的netmem_refs而不是struct page *來跟蹤記憶體,可以實現轉換為netmem。
page_pool_alloc -> page_pool_alloc_netmem
page_pool_get_dma_addr -> page_pool_get_dma_addr_netmem
page_pool_put_page -> page_pool_put_netmem
目前並非所有page API都有對應的netmem API。如果您的驅動程式依賴於缺失的netmem API,請隨時新增並提交至netdev@,或聯絡維護人員和/或almasrymina@google.com以獲取新增netmem API的幫助。
驅動程式必須使用以下PP_FLAGS
PP_FLAG_DMA_MAP: netmem不能由驅動程式進行dma對映。驅動程式必須將dma對映委託給page_pool,page_pool知道何時dma對映是(或不是)合適的。
PP_FLAG_DMA_SYNC_DEV: netmem dma地址不一定能由驅動程式進行dma同步。驅動程式必須將dma同步委託給page_pool,page_pool知道何時dma同步是(或不是)合適的。
PP_FLAG_ALLOW_UNREADABLE_NETMEM。僅當tcp-data-split啟用時,驅動程式才必須指定此標誌。
驅動程式不能假設netmem是可讀的或由頁面支援的。page_pool返回的netmem可能不可讀,在這種情況下netmem_address()將返回NULL。驅動程式必須正確處理不可讀的netmem,即當netmem_address()為NULL時,不要嘗試處理其內容。
理想情況下,驅動程式不應該透過netmem_is_net_iov()等輔助函式檢查底層netmem型別,或透過netmem_to_page()或netmem_to_net_iov()將其轉換為任何底層型別。在大多數情況下,提供了抽象此複雜性的netmem或page_pool輔助函式(並且可以新增更多)。
驅動程式必須使用page_pool_dma_sync_netmem_for_cpu()代替dma_sync_single_range_for_cpu()。對於某些記憶體提供者,為CPU進行的dma同步將由page_pool完成;對於其他提供者(特別是dmabuf記憶體提供者),為CPU進行的dma同步是使用dmabuf API的使用者空間的責任。驅動程式必須將整個dma同步操作委託給page_pool,page_pool會正確執行它。
避免在page_pool之上實現驅動程式特定的回收。驅動程式不能保留struct page來自行回收,因為netmem可能不是由struct page支援的。但是,您可以為此目的透過page_pool_fragment_netmem()或page_pool_ref_netmem()保留page_pool引用,但請注意,某些netmem型別可能具有更長的迴圈時間,例如在零複製場景中使用者空間持有引用時。
驅動程式TX要求¶
驅動程式不得將netmem dma_addr直接傳遞給任何dma-mapping API。這是因為netmem dma_addr可能來自不相容dma-mapping API的源,如dma-buf。
應使用netmem_dma_unmap_page_attrs()和netmem_dma_unmap_addr_set()等輔助函式代替dma_unmap_page[_attrs]()、dma_unmap_addr_set()。netmem變體將正確處理netmem dma_addrs,無論來源如何,並在適當的時候委託給dma-mapping API。
目前並非所有dma-mapping API都有對應的netmem API。如果您的驅動程式依賴於缺失的netmem API,請隨時新增並提交至netdev@,或聯絡維護人員和/或almasrymina@google.com以獲取新增netmem API的幫助。
驅動程式應透過設定netdev->netmem_tx = true來宣告支援。