Xsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/networking/netmemmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/zh_TW/networking/netmemmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/it_IT/networking/netmemmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/ja_JP/networking/netmemmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/ko_KR/networking/netmemmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/sp_SP/networking/netmemmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhR/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/networking/netmem.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h$Documentation/networking/netmem.rst h]h)}(h#Documentation/networking/netmem.rsth]h#Documentation/networking/netmem.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h-王亚鑫 Wang Yaxin h]h)}(h,王亚鑫 Wang Yaxin h](h王亚鑫 Wang Yaxin <}(hj hhhNhNubh reference)}(hwang.yaxin@zte.com.cnh]hwang.yaxin@zte.com.cn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:wang.yaxin@zte.com.cnuh1j(hj ubh>}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h网络驱动支持Netmemh]h网络驱动支持Netmem}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjXhhhhhK ubh)}(hX 本文档概述了网络驱动支持netmem(一种抽象内存类型)的要求,该内存类型 支持设备内存 TCP 等功能。通过支持netmem,驱动可以灵活适配不同底层内 存类型(如设备内存TCP),且无需或仅需少量修改。h]hX 本文档概述了网络驱动支持netmem(一种抽象内存类型)的要求,该内存类型 支持设备内存 TCP 等功能。通过支持netmem,驱动可以灵活适配不同底层内 存类型(如设备内存TCP),且无需或仅需少量修改。}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjXhhubh)}(hNetmem的优势:h]hNetmem的优势:}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjXhhubh bullet_list)}(hhh](h list_item)}(h灵活性:netmem 可由不同内存类型(如 struct page、DMA-buf)支持, 使驱动程序能够支持设备内存 TCP 等各种用例。h]h)}(h灵活性:netmem 可由不同内存类型(如 struct page、DMA-buf)支持, 使驱动程序能够支持设备内存 TCP 等各种用例。h]h灵活性:netmem 可由不同内存类型(如 struct page、DMA-buf)支持, 使驱动程序能够支持设备内存 TCP 等各种用例。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hT前瞻性:支持netmem的驱动可无缝适配未来依赖此功能的新特性。h]h)}(hjh]hT前瞻性:支持netmem的驱动可无缝适配未来依赖此功能的新特性。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(ha简化开发:驱动通过统一API与netmem交互,无需关注底层内存的实现差异。 h]h)}(h`简化开发:驱动通过统一API与netmem交互,无需关注底层内存的实现差异。h]h`简化开发:驱动通过统一API与netmem交互,无需关注底层内存的实现差异。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]bullet*uh1jhhhKhjXhhubjW)}(hhh](j\)}(h驱动RX要求h]h驱动RX要求}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhKubhenumerated_list)}(hhh](j)}(h驱动必须支持page_pool。 h]h)}(h驱动必须支持page_pool。h]h驱动必须支持page_pool。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h2驱动必须支持tcp-data-split ethtool选项。 h]h)}(h1驱动必须支持tcp-data-split ethtool选项。h]h1驱动必须支持tcp-data-split ethtool选项。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXy驱动必须使用page_pool netmem API处理有效载荷内存。当前netmem API 与page API一一对应。转换时需要将page API替换为netmem API,并用驱动 中的netmem_refs跟踪内存而非 `struct page *`: - 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 目前并非所有页 pageAPI 都有对应的 netmem 等效接口。如果你的驱动程序 依赖某个尚未实现的 netmem API,请直接实现并提交至 netdev@邮件列表, 或联系维护者及 almasrymina@google.com 协助添加该 netmem API。 h](h)}(h驱动必须使用page_pool netmem API处理有效载荷内存。当前netmem API 与page API一一对应。转换时需要将page API替换为netmem API,并用驱动 中的netmem_refs跟踪内存而非 `struct page *`:h](h驱动必须使用page_pool netmem API处理有效载荷内存。当前netmem API 与page API一一对应。转换时需要将page API替换为netmem API,并用驱动 中的netmem_refs跟踪内存而非 }(hj'hhhNhNubhtitle_reference)}(h`struct page *`h]h struct page *}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j/hj'ubh:}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK!hj#ubj)}(hhh](j)}(h)page_pool_alloc -> page_pool_alloc_netmemh]h)}(hjNh]h)page_pool_alloc -> page_pool_alloc_netmem}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hjLubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(h7page_pool_get_dma_addr -> page_pool_get_dma_addr_netmemh]h)}(hjeh]h7page_pool_get_dma_addr -> page_pool_get_dma_addr_netmem}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjcubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(h+page_pool_put_page -> page_pool_put_netmem h]h)}(h*page_pool_put_page -> page_pool_put_netmemh]h*page_pool_put_page -> page_pool_put_netmem}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK'hjzubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]j-uh1jhhhK%hj#ubh)}(hX目前并非所有页 pageAPI 都有对应的 netmem 等效接口。如果你的驱动程序 依赖某个尚未实现的 netmem API,请直接实现并提交至 netdev@邮件列表, 或联系维护者及 almasrymina@google.com 协助添加该 netmem API。h](h目前并非所有页 pageAPI 都有对应的 netmem 等效接口。如果你的驱动程序 依赖某个尚未实现的 netmem API,请直接实现并提交至 netdev@邮件列表, 或联系维护者及 }(hjhhhNhNubj))}(halmasrymina@google.comh]halmasrymina@google.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:almasrymina@google.comuh1j(hjubh 协助添加该 netmem API。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK)hj#ubeh}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXP驱动必须设置以下PP_FLAGS: - PP_FLAG_DMA_MAP:驱动程序无法对 netmem 执行 DMA 映射。此时驱动 程序必须将 DMA 映射操作委托给 page_pool,由其判断何时适合(或不适合) 进行 DMA 映射。 - PP_FLAG_DMA_SYNC_DEV:驱动程序无法保证 netmem 的 DMA 地址一定能 完成 DMA 同步。此时驱动程序必须将 DMA 同步操作委托给 page_pool,由 其判断何时适合(或不适合)进行 DMA 同步。 - PP_FLAG_ALLOW_UNREADABLE_NETMEM:仅当启用 tcp-data-split 时, 驱动程序必须显式设置此标志。 h](h)}(h#驱动必须设置以下PP_FLAGS:h]h#驱动必须设置以下PP_FLAGS:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjubj)}(hhh](j)}(hPP_FLAG_DMA_MAP:驱动程序无法对 netmem 执行 DMA 映射。此时驱动 程序必须将 DMA 映射操作委托给 page_pool,由其判断何时适合(或不适合) 进行 DMA 映射。h]h)}(hPP_FLAG_DMA_MAP:驱动程序无法对 netmem 执行 DMA 映射。此时驱动 程序必须将 DMA 映射操作委托给 page_pool,由其判断何时适合(或不适合) 进行 DMA 映射。h]hPP_FLAG_DMA_MAP:驱动程序无法对 netmem 执行 DMA 映射。此时驱动 程序必须将 DMA 映射操作委托给 page_pool,由其判断何时适合(或不适合) 进行 DMA 映射。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hPP_FLAG_DMA_SYNC_DEV:驱动程序无法保证 netmem 的 DMA 地址一定能 完成 DMA 同步。此时驱动程序必须将 DMA 同步操作委托给 page_pool,由 其判断何时适合(或不适合)进行 DMA 同步。h]h)}(hPP_FLAG_DMA_SYNC_DEV:驱动程序无法保证 netmem 的 DMA 地址一定能 完成 DMA 同步。此时驱动程序必须将 DMA 同步操作委托给 page_pool,由 其判断何时适合(或不适合)进行 DMA 同步。h]hPP_FLAG_DMA_SYNC_DEV:驱动程序无法保证 netmem 的 DMA 地址一定能 完成 DMA 同步。此时驱动程序必须将 DMA 同步操作委托给 page_pool,由 其判断何时适合(或不适合)进行 DMA 同步。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hpPP_FLAG_ALLOW_UNREADABLE_NETMEM:仅当启用 tcp-data-split 时, 驱动程序必须显式设置此标志。 h]h)}(hoPP_FLAG_ALLOW_UNREADABLE_NETMEM:仅当启用 tcp-data-split 时, 驱动程序必须显式设置此标志。h]hoPP_FLAG_ALLOW_UNREADABLE_NETMEM:仅当启用 tcp-data-split 时, 驱动程序必须显式设置此标志。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhhhK/hjubeh}(h]h ]h"]h$]h&]uh1jhjhhhNhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jhjhhhhhKubh)}(h5. 驱动不得假设netmem可读或基于页。当netmem_address()返回NULL时,表示 内存不可读。驱动需正确处理不可读的netmem,例如,当netmem_address()返回 NULL时,避免访问内容。h]h5. 驱动不得假设netmem可读或基于页。当netmem_address()返回NULL时,表示 内存不可读。驱动需正确处理不可读的netmem,例如,当netmem_address()返回 NULL时,避免访问内容。}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjhhubh block_quote)}(hXM理想情况下,驱动程序不应通过netmem_is_net_iov()等辅助函数检查底层 netmem 类型,也不应通过netmem_to_page()或netmem_to_net_iov()将 netmem 转换为其底层类型。在大多数情况下,系统会提供抽象这些复杂性的 netmem 或 page_pool 辅助函数(并可根据需要添加更多)。 h]h)}(hXL理想情况下,驱动程序不应通过netmem_is_net_iov()等辅助函数检查底层 netmem 类型,也不应通过netmem_to_page()或netmem_to_net_iov()将 netmem 转换为其底层类型。在大多数情况下,系统会提供抽象这些复杂性的 netmem 或 page_pool 辅助函数(并可根据需要添加更多)。h]hXL理想情况下,驱动程序不应通过netmem_is_net_iov()等辅助函数检查底层 netmem 类型,也不应通过netmem_to_page()或netmem_to_net_iov()将 netmem 转换为其底层类型。在大多数情况下,系统会提供抽象这些复杂性的 netmem 或 page_pool 辅助函数(并可根据需要添加更多)。}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKnetmem_tx = true 来表明自身支持 netmem 功能。h]h)}(hjh]h[驱动程序应通过设置 netdev->netmem_tx = true 来表明自身支持 netmem 功能。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK\hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubah}(h]h ]h"]h$]h&]j0j1j2hj3j4startKuh1jhjhhhhhK\ubeh}(h]txah ]h"]驱动tx要求ah$]h&]uh1jVhjXhhhhhKMubeh}(h]netmemah ]h"]网络驱动支持netmemah$]h&]uh1jVhhhhhhhK ubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j[N generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj$error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjj~j{jju nametypes}(jj~juh}(jjXj{jjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]hsystem_message)}(hhh]h)}(h:Enumerated list start value not ordinal-1: "2" (ordinal 2)h]h>Enumerated list start value not ordinal-1: “2” (ordinal 2)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehlineK uh1jhjhhhhhK\ubatransform_messages] transformerN include_log]6Documentation/translations/zh_CN/networking/netmem.rst(NNNNta decorationNhhub.