Lưu ý
Mục đích của file này là để độc giả tiếng Việt có thể đọc và hiểu tài liệu nhân kernel dễ dàng hơn, không phải để tạo ra một nhánh tài liệu riêng. Nếu bạn có bất kỳ nhận xét hoặc cập nhật nào cho file này, vui lòng thử cập nhật file tiếng Anh gốc trước. Nếu bạn thấy có sự khác biệt giữa bản dịch và bản gốc, hoặc có vấn đề về bản dịch, vui lòng gửi góp ý hoặc patch cho người dịch của file này, hoặc nhờ người bảo trì và người review tài liệu tiếng Việt giúp đỡ.
- Bản gốc:
- Người dịch:
Google Translate (machine translation)
- Phiên bản gốc:
8541d8f725c6
Cảnh báo
Tài liệu này được dịch tự động bằng máy và chưa được review bởi người dịch. Nội dung có thể không chính xác hoặc khó hiểu ở một số chỗ. Khi có sự khác biệt với bản gốc, bản gốc luôn là chuẩn. Bản dịch chất lượng cao (được review) được đặt trong thư mục vi_VN/.
Hỗ trợ Netmem cho trình điều khiển mạng¶
Tài liệu này nêu ra các yêu cầu đối với trình điều khiển mạng để hỗ trợ netmem, loại bộ nhớ trừu tượng kích hoạt các tính năng như bộ nhớ thiết bị TCP. Bởi hỗ trợ netmem, trình điều khiển có thể hoạt động với nhiều loại bộ nhớ cơ bản khác nhau với rất ít hoặc không có sửa đổi.
Lợi ích của Netmem:
Tính linh hoạt: Netmem có thể được hỗ trợ bởi các loại bộ nhớ khác nhau (ví dụ:
struct trang, DMA-buf), cho phép trình điều khiển hỗ trợ các trường hợp sử dụng khác nhau như thiết bị bộ nhớ TCP.Chứng minh tương lai: Trình điều khiển có hỗ trợ netmem đã sẵn sàng cho phiên bản sắp tới các tính năng dựa vào nó.
Phát triển đơn giản hóa: Trình điều khiển tương tác với API nhất quán, bất kể việc triển khai bộ nhớ cơ bản.
Yêu cầu về trình điều khiển RX¶
Trình điều khiển phải hỗ trợ page_pool.
Trình điều khiển phải hỗ trợ tùy chọn ethtool tcp-data-split.
Trình điều khiển phải sử dụng API netmem page_pool cho bộ nhớ tải trọng. netmem API hiện tại tương ứng 1-1 với API trang. Chuyển đổi sang netmem nên có thể đạt được bằng cách chuyển API trang sang API netmem và bộ nhớ theo dõi thông qua netmem_refs trong trình điều khiển chứ không phải trang struct * :
- 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
- Hiện tại, không phải tất cả các API trang đều có tương đương netmem. Nếu tài xế của bạn
dựa vào netmem API bị thiếu, vui lòng thêm và đề xuất với netdev@, hoặc hãy liên hệ với những người bảo trì và/hoặc almasrymina@google.com để được trợ giúp thêm netmem API.
Người lái xe phải sử dụng PP_FLAGS sau:
- PP_FLAG_DMA_MAP: trình điều khiển netmem không thể ánh xạ dma. Người lái xe
phải ủy quyền ánh xạ dma cho page_pool để biết khi nào ánh xạ dma là (hoặc không) phù hợp.
PP_FLAG_DMA_SYNC_DEV: netmem dma addr không nhất thiết phải có khả năng đồng bộ hóa dma bởi người lái xe. Trình điều khiển phải ủy quyền đồng bộ hóa dma với page_pool, biết khi nào đồng bộ hóa dma là (hoặc không) phù hợp.
- -PP_FLAG_ALLOW_UNREADABLE_NETMEM. Người lái xe phải chỉ định cờ này
tcp-data-split được kích hoạt.
Trình điều khiển không được cho rằng netmem có thể đọc được và/hoặc được hỗ trợ bởi các trang. Netmem được page_pool trả về có thể không đọc được, trong trường hợp đó
netmem_address()sẽ trả về NULL. Người lái xe phải xử lý đúng netmem không thể đọc được, tức là đừng cố xử lý nội dung của nó khinetmem_address()là NULL.
- Lý tưởng nhất là trình điều khiển không cần phải kiểm tra loại netmem cơ bản thông qua
những người trợ giúp như
netmem_is_net_iov()hoặc chuyển đổi netmem thành bất kỳ thứ gì của nó các loại cơ bản thông quanetmem_to_page()hoặcnetmem_to_net_iov(). Trong hầu hết các trường hợp, Những người trợ giúp netmem hoặc page_pool tóm tắt sự phức tạp này được cung cấp (và có thể bổ sung thêm).
Trình điều khiển phải sử dụng
page_pool_dma_sync_netmem_for_cpu()thay chodma_sync_single_range_for_cpu(). Đối với một số nhà cung cấp bộ nhớ, dma_syncing dành cho CPU sẽ được thực hiện bởi page_pool, đối với những người khác (đặc biệt là bộ nhớ dmabuf nhà cung cấp), đồng bộ hóa dma cho CPU là trách nhiệm của không gian người dùng bằng cách sử dụng API dmabuf. Trình điều khiển phải ủy quyền toàn bộ hoạt động đồng bộ hóa dma cho page_pool sẽ thực hiện chính xác.Tránh triển khai việc tái chế dành riêng cho trình điều khiển ở đầu page_pool. Trình điều khiển không thể giữ một trang cấu trúc để tự tái chế vì netmem có thể không được hỗ trợ bởi một trang cấu trúc. Tuy nhiên, bạn có thể giữ page_pool tham chiếu với
page_pool_fragment_netmem()hoặcpage_pool_ref_netmem()cho mục đích đó, nhưng hãy lưu ý rằng một số loại netmem có thể có thời gian dài hơn thời gian lưu hành, chẳng hạn như khi không gian người dùng chứa tham chiếu ở dạng zerocopy kịch bản.
Yêu cầu về trình điều khiển TX¶
Trình điều khiển không được chuyển netmem dma_addr cho bất kỳ API ánh xạ dma nào trực tiếp. Điều này là do netmem dma_addrs có thể đến từ một nguồn như dma-buf không tương thích với API ánh xạ dma.
- Những người trợ giúp như netmem_dma_unmap_page_attrs() & netmem_dma_unmap_addr_set()
nên được sử dụng thay cho dma_unmap_page[_attrs](),
dma_unmap_addr_set(). Các biến thể netmem sẽ xử lý netmem dma_addrs một cách chính xác bất kể nguồn, ủy quyền cho các API ánh xạ dma khi thích hợp.- Hiện tại, không phải tất cả các API ánh xạ dma đều có tương đương netmem. Nếu bạn
driver dựa trên netmem API bị thiếu, vui lòng bổ sung và đề xuất netdev@ hoặc liên hệ với người bảo trì và/hoặc almasrymina@google.com để biết giúp thêm netmem API.
Driver cần khai báo hỗ trợ bằng cách setting ZZ0000ZZ