€•mxŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ+/translations/zh_CN/networking/msg_zerocopy”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/zh_TW/networking/msg_zerocopy”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/it_IT/networking/msg_zerocopy”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/ja_JP/networking/msg_zerocopy”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/ko_KR/networking/msg_zerocopy”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/pt_BR/networking/msg_zerocopy”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/sp_SP/networking/msg_zerocopy”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ MSG_ZEROCOPY”h]”hŒ MSG_ZEROCOPY”…””}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒE/var/lib/git/docbuild/linux/Documentation/networking/msg_zerocopy.rst”h´Kubh¶)”}”(hhh]”(h»)”}”(hŒIntro”h]”hŒIntro”…””}”(hhÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhËh²hh³hÊh´KubhŒ paragraph”“”)”}”(hŒ The MSG_ZEROCOPY flag enables copy avoidance for socket send calls. The feature is currently implemented for TCP, UDP and VSOCK (with virtio transport) sockets.”h]”hŒ The MSG_ZEROCOPY flag enables copy avoidance for socket send calls. The feature is currently implemented for TCP, UDP and VSOCK (with virtio transport) sockets.”…””}”(hhÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hhËh²hubh¶)”}”(hhh]”(h»)”}”(hŒOpportunity and Caveats”h]”hŒOpportunity and Caveats”…””}”(hhïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhìh²hh³hÊh´KubhÝ)”}”(hŒþCopying large buffers between user process and kernel can be expensive. Linux supports various interfaces that eschew copying, such as sendfile and splice. The MSG_ZEROCOPY flag extends the underlying copy avoidance mechanism to common socket send calls.”h]”hŒþCopying large buffers between user process and kernel can be expensive. Linux supports various interfaces that eschew copying, such as sendfile and splice. The MSG_ZEROCOPY flag extends the underlying copy avoidance mechanism to common socket send calls.”…””}”(hhýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khhìh²hubhÝ)”}”(hŒóCopy avoidance is not a free lunch. As implemented, with page pinning, it replaces per byte copy cost with page accounting and completion notification overhead. As a result, MSG_ZEROCOPY is generally only effective at writes over around 10 KB.”h]”hŒóCopy avoidance is not a free lunch. As implemented, with page pinning, it replaces per byte copy cost with page accounting and completion notification overhead. As a result, MSG_ZEROCOPY is generally only effective at writes over around 10 KB.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khhìh²hubhÝ)”}”(hXePage pinning also changes system call semantics. It temporarily shares the buffer between process and network stack. Unlike with copying, the process cannot immediately overwrite the buffer after system call return without possibly modifying the data in flight. Kernel integrity is not affected, but a buggy program can possibly corrupt its own data stream.”h]”hXePage pinning also changes system call semantics. It temporarily shares the buffer between process and network stack. Unlike with copying, the process cannot immediately overwrite the buffer after system call return without possibly modifying the data in flight. Kernel integrity is not affected, but a buggy program can possibly corrupt its own data stream.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khhìh²hubhÝ)”}”(hŒ­The kernel returns a notification when it is safe to modify data. Converting an existing application to MSG_ZEROCOPY is not always as trivial as just passing the flag, then.”h]”hŒ­The kernel returns a notification when it is safe to modify data. Converting an existing application to MSG_ZEROCOPY is not always as trivial as just passing the flag, then.”…””}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K"hhìh²hubeh}”(h]”Œopportunity-and-caveats”ah ]”h"]”Œopportunity and caveats”ah$]”h&]”uh1hµhhËh²hh³hÊh´Kubh¶)”}”(hhh]”(h»)”}”(hŒ More Info”h]”hŒ More Info”…””}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj=h²hh³hÊh´K(ubhÝ)”}”(hŒÈMuch of this document was derived from a longer paper presented at netdev 2.1. For more in-depth information see that paper and talk, the excellent reporting over at LWN.net or read the original code.”h]”hŒÈMuch of this document was derived from a longer paper presented at netdev 2.1. For more in-depth information see that paper and talk, the excellent reporting over at LWN.net or read the original code.”…””}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K*hj=h²hubhŒ block_quote”“”)”}”(hXpaper, slides, video https://netdevconf.org/2.1/session.html?debruijn LWN article https://lwn.net/Articles/726917/ patchset [PATCH net-next v4 0/9] socket sendmsg MSG_ZEROCOPY https://lore.kernel.org/netdev/20170803202945.70750-1-willemdebruijn.kernel@gmail.com ”h]”hŒdefinition_list”“”)”}”(hhh]”(hŒdefinition_list_item”“”)”}”(hŒFpaper, slides, video https://netdevconf.org/2.1/session.html?debruijn ”h]”(hŒterm”“”)”}”(hŒpaper, slides, video”h]”hŒpaper, slides, video”…””}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jmh³hÊh´K/hjiubhŒ definition”“”)”}”(hhh]”hÝ)”}”(hŒ0https://netdevconf.org/2.1/session.html?debruijn”h]”hŒ reference”“”)”}”(hj„h]”hŒ0https://netdevconf.org/2.1/session.html?debruijn”…””}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j„uh1j†hj‚ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K/hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjiubeh}”(h]”h ]”h"]”h$]”h&]”uh1jgh³hÊh´K/hjdubjh)”}”(hŒ-LWN article https://lwn.net/Articles/726917/ ”h]”(jn)”}”(hŒ LWN article”h]”hŒ LWN article”…””}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jmh³hÊh´K2hj¨ubj~)”}”(hhh]”hÝ)”}”(hŒ https://lwn.net/Articles/726917/”h]”j‡)”}”(hj¿h]”hŒ https://lwn.net/Articles/726917/”…””}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j¿uh1j†hj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K2hjºubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hj¨ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jgh³hÊh´K2hjdubjh)”}”(hŒ”patchset [PATCH net-next v4 0/9] socket sendmsg MSG_ZEROCOPY https://lore.kernel.org/netdev/20170803202945.70750-1-willemdebruijn.kernel@gmail.com ”h]”(jn)”}”(hŒpatchset”h]”hŒpatchset”…””}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jmh³hÊh´K7hjáubj~)”}”(hhh]”hÝ)”}”(hŒ‰[PATCH net-next v4 0/9] socket sendmsg MSG_ZEROCOPY https://lore.kernel.org/netdev/20170803202945.70750-1-willemdebruijn.kernel@gmail.com”h]”(hŒ4[PATCH net-next v4 0/9] socket sendmsg MSG_ZEROCOPY ”…””}”(hjöh²hh³Nh´Nubj‡)”}”(hŒUhttps://lore.kernel.org/netdev/20170803202945.70750-1-willemdebruijn.kernel@gmail.com”h]”hŒUhttps://lore.kernel.org/netdev/20170803202945.70750-1-willemdebruijn.kernel@gmail.com”…””}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”juh1j†hjöubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K5hjóubah}”(h]”h ]”h"]”h$]”h&]”uh1j}hjáubeh}”(h]”h ]”h"]”h$]”h&]”uh1jgh³hÊh´K7hjdubeh}”(h]”h ]”h"]”h$]”h&]”uh1jbhj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1j\h³hÊh´K.hj=h²hubeh}”(h]”Œ more-info”ah ]”h"]”Œ more info”ah$]”h&]”uh1hµhhËh²hh³hÊh´K(ubeh}”(h]”Œintro”ah ]”h"]”Œintro”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)”}”(hhh]”(h»)”}”(hŒ Interface”h]”hŒ Interface”…””}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj;h²hh³hÊh´K:ubhÝ)”}”(hŒfPassing the MSG_ZEROCOPY flag is the most obvious step to enable copy avoidance, but not the only one.”h]”hŒfPassing the MSG_ZEROCOPY flag is the most obvious step to enable copy avoidance, but not the only one.”…””}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kcmsg_level != SOL_IP && cm->cmsg_type != IP_RECVERR) error(1, 0, "cmsg"); serr = (void *) CMSG_DATA(cm); if (serr->ee_errno != 0 || serr->ee_origin != SO_EE_ORIGIN_ZEROCOPY) error(1, 0, "serr"); printf("completed: %u..%u\n", serr->ee_info, serr->ee_data);”h]”hXostruct sock_extended_err *serr; struct cmsghdr *cm; cm = CMSG_FIRSTHDR(msg); if (cm->cmsg_level != SOL_IP && cm->cmsg_type != IP_RECVERR) error(1, 0, "cmsg"); serr = (void *) CMSG_DATA(cm); if (serr->ee_errno != 0 || serr->ee_origin != SO_EE_ORIGIN_ZEROCOPY) error(1, 0, "serr"); printf("completed: %u..%u\n", serr->ee_info, serr->ee_data);”…””}”hj#sbah}”(h]”h ]”h"]”h$]”h&]”j‰jŠuh1jyh³hÊh´KÀhjÚh²hubeh}”(h]”Œnotification-parsing”ah ]”h"]”Œnotification parsing”ah$]”h&]”uh1hµhjýh²hh³hÊh´K«ubh¶)”}”(hhh]”(h»)”}”(hŒDeferred copies”h]”hŒDeferred copies”…””}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj9h²hh³hÊh´KÑubhÝ)”}”(hŒ¾Passing flag MSG_ZEROCOPY is a hint to the kernel to apply copy avoidance, and a contract that the kernel will queue a completion notification. It is not a guarantee that the copy is elided.”h]”hŒ¾Passing flag MSG_ZEROCOPY is a hint to the kernel to apply copy avoidance, and a contract that the kernel will queue a completion notification. It is not a guarantee that the copy is elided.”…””}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÓhj9h²hubhÝ)”}”(hXCopy avoidance is not always feasible. Devices that do not support scatter-gather I/O cannot send packets made up of kernel generated protocol headers plus zerocopy user data. A packet may need to be converted to a private copy of data deep in the stack, say to compute a checksum.”h]”hXCopy avoidance is not always feasible. Devices that do not support scatter-gather I/O cannot send packets made up of kernel generated protocol headers plus zerocopy user data. A packet may need to be converted to a private copy of data deep in the stack, say to compute a checksum.”…””}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K×hj9h²hubhÝ)”}”(hXIn all these cases, the kernel returns a completion notification when it releases its hold on the shared pages. That notification may arrive before the (copied) data is fully transmitted. A zerocopy completion notification is not a transmit completion notification, therefore.”h]”hXIn all these cases, the kernel returns a completion notification when it releases its hold on the shared pages. That notification may arrive before the (copied) data is fully transmitted. A zerocopy completion notification is not a transmit completion notification, therefore.”…””}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÝhj9h²hubhÝ)”}”(hX»Deferred copies can be more expensive than a copy immediately in the system call, if the data is no longer warm in the cache. The process also incurs notification processing cost for no benefit. For this reason, the kernel signals if data was completed with a copy, by setting flag SO_EE_CODE_ZEROCOPY_COPIED in field ee_code on return. A process may use this signal to stop passing flag MSG_ZEROCOPY on subsequent requests on the same socket.”h]”hX»Deferred copies can be more expensive than a copy immediately in the system call, if the data is no longer warm in the cache. The process also incurs notification processing cost for no benefit. For this reason, the kernel signals if data was completed with a copy, by setting flag SO_EE_CODE_ZEROCOPY_COPIED in field ee_code on return. A process may use this signal to stop passing flag MSG_ZEROCOPY on subsequent requests on the same socket.”…””}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kâhj9h²hubeh}”(h]”Œdeferred-copies”ah ]”h"]”Œdeferred copies”ah$]”h&]”uh1hµhjýh²hh³hÊh´KÑubeh}”(h]”Œ notifications”ah ]”h"]”Œ notifications”ah$]”h&]”uh1hµhj;h²hh³hÊh´Keubeh}”(h]”Œ interface”ah ]”h"]”Œ interface”ah$]”h&]”uh1hµhh·h²hh³hÊh´K:ubh¶)”}”(hhh]”(h»)”}”(hŒImplementation”h]”hŒImplementation”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjšh²hh³hÊh´Kìubh¶)”}”(hhh]”(h»)”}”(hŒLoopback”h]”hŒLoopback”…””}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj«h²hh³hÊh´KïubhÝ)”}”(hXhFor TCP and UDP: Data sent to local sockets can be queued indefinitely if the receive process does not read its socket. Unbound notification latency is not acceptable. For this reason all packets generated with MSG_ZEROCOPY that are looped to a local socket will incur a deferred copy. This includes looping onto packet sockets (e.g., tcpdump) and tun devices.”h]”hXhFor TCP and UDP: Data sent to local sockets can be queued indefinitely if the receive process does not read its socket. Unbound notification latency is not acceptable. For this reason all packets generated with MSG_ZEROCOPY that are looped to a local socket will incur a deferred copy. This includes looping onto packet sockets (e.g., tcpdump) and tun devices.”…””}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kñhj«h²hubhÝ)”}”(hŒPFor VSOCK: Data path sent to local sockets is the same as for non-local sockets.”h]”hŒPFor VSOCK: Data path sent to local sockets is the same as for non-local sockets.”…””}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Køhj«h²hubeh}”(h]”Œloopback”ah ]”h"]”Œloopback”ah$]”h&]”uh1hµhjšh²hh³hÊh´Kïubeh}”(h]”Œimplementation”ah ]”h"]”Œimplementation”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kìubh¶)”}”(hhh]”(h»)”}”(hŒTesting”h]”hŒTesting”…””}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjèh²hh³hÊh´KüubhÝ)”}”(hŒoMore realistic example code can be found in the kernel source under tools/testing/selftests/net/msg_zerocopy.c.”h]”hŒoMore realistic example code can be found in the kernel source under tools/testing/selftests/net/msg_zerocopy.c.”…””}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kþhjèh²hubhÝ)”}”(hX{Be cognizant of the loopback constraint. The test can be run between a pair of hosts. But if run between a local pair of processes, for instance when run with msg_zerocopy.sh between a veth pair across namespaces, the test will not show any improvement. For testing, the loopback restriction can be temporarily relaxed by making skb_orphan_frags_rx identical to skb_orphan_frags.”h]”hX{Be cognizant of the loopback constraint. The test can be run between a pair of hosts. But if run between a local pair of processes, for instance when run with msg_zerocopy.sh between a veth pair across namespaces, the test will not show any improvement. For testing, the loopback restriction can be temporarily relaxed by making skb_orphan_frags_rx identical to skb_orphan_frags.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjèh²hubhÝ)”}”(hŒ[For VSOCK type of socket example can be found in tools/testing/vsock/vsock_test_zerocopy.c.”h]”hŒ[For VSOCK type of socket example can be found in tools/testing/vsock/vsock_test_zerocopy.c.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjèh²hubeh}”(h]”Œtesting”ah ]”h"]”Œtesting”ah$]”h&]”uh1hµhh·h²hh³hÊh´Küubeh}”(h]”Œ msg-zerocopy”ah ]”h"]”Œ msg_zerocopy”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jVŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j0j-j8j5j:j7j0j-j—j”jjjúj÷jòjïjjŒj†jƒj×jÔj6j3j‡j„jåjâjÝjÚj(j%uŒ nametypes”}”(j0‰j8‰j:‰j0‰j—‰j‰jú‰jò‰j‰j†‰j׉j6‰j‡‰jå‰j݉j(‰uh}”(j-h·j5hËj7hìj-j=j”j;jjZj÷j“jïjÎjŒjýjƒj*jÔj‰j3jÚj„j9jâjšjÚj«j%jèuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.