网络驱动程序的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来声明支持。