€•º_Œ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/trace/remotes”Œ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/trace/remotes”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/it_IT/trace/remotes”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/ja_JP/trace/remotes”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/ko_KR/trace/remotes”Œ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/trace/remotes”Œ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/trace/remotes”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ;/var/lib/git/docbuild/linux/Documentation/trace/remotes.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒTracing Remotes”h]”hŒTracing Remotes”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ field_list”“”)”}”(hhh]”hŒfield”“”)”}”(hhh]”(hŒ field_name”“”)”}”(hŒAuthor”h]”hŒAuthor”…””}”(hhéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhhäh³hÇh´KubhŒ field_body”“”)”}”(hŒ*Vincent Donnefort ”h]”hŒ paragraph”“”)”}”(hŒ)Vincent Donnefort ”h]”(hŒVincent Donnefort <”…””}”(hhÿh²hh³Nh´NubhŒ reference”“”)”}”(hŒvdonnefort@google.com”h]”hŒvdonnefort@google.com”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:vdonnefort@google.com”uh1jhhÿubhŒ>”…””}”(hhÿh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khhùubah}”(h]”h ]”h"]”h$]”h&]”uh1h÷hhäubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâh³hÇh´Khhßh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒOverview”h]”hŒOverview”…””}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj5h²hh³hÇh´K ubhþ)”}”(hXkFirmware and hypervisors are black boxes to the kernel. Having a way to see what they are doing can be useful to debug both. This is where remote tracing buffers come in. A remote tracing buffer is a ring buffer executed by the firmware or hypervisor into memory that is memory mapped to the host kernel. This is similar to how user space memory maps the kernel ring buffer but in this case the kernel is acting like user space and the firmware or hypervisor is the "kernel" side. With a trace remote ring buffer, the firmware and hypervisor can record events for which the host kernel can see and expose to user space.”h]”hXoFirmware and hypervisors are black boxes to the kernel. Having a way to see what they are doing can be useful to debug both. This is where remote tracing buffers come in. A remote tracing buffer is a ring buffer executed by the firmware or hypervisor into memory that is memory mapped to the host kernel. This is similar to how user space memory maps the kernel ring buffer but in this case the kernel is acting like user space and the firmware or hypervisor is the “kernel†side. With a trace remote ring buffer, the firmware and hypervisor can record events for which the host kernel can see and expose to user space.”…””}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K hj5h²hubeh}”(h]”Œoverview”ah ]”h"]”Œoverview”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K ubhÉ)”}”(hhh]”(hÎ)”}”(hŒRegister a remote”h]”hŒRegister a remote”…””}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj\h²hh³hÇh´Kubhþ)”}”(hXAA remote must provide a set of callbacks `struct trace_remote_callbacks` whom description can be found below. Those callbacks allows Tracefs to enable and disable tracing and events, to load and unload a tracing buffer (a set of ring-buffers) and to swap a reader page with the head page, which enables consuming reading.”h]”(hŒ)A remote must provide a set of callbacks ”…””}”(hjmh²hh³Nh´NubhŒtitle_reference”“”)”}”(hŒ`struct trace_remote_callbacks`”h]”hŒstruct trace_remote_callbacks”…””}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjmubhŒù whom description can be found below. Those callbacks allows Tracefs to enable and disable tracing and events, to load and unload a tracing buffer (a set of ring-buffers) and to swap a reader page with the head page, which enables consuming reading.”…””}”(hjmh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khj\h²hubhŒindex”“”)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œ!trace_remote_callbacks (C struct)”Œc.trace_remote_callbacks”hNt”auh1jhj\h²hh³Nh´NubhŒdesc”“”)”}”(hhh]”(hŒdesc_signature”“”)”}”(hŒtrace_remote_callbacks”h]”hŒdesc_signature_line”“”)”}”(hŒstruct trace_remote_callbacks”h]”(hŒdesc_sig_keyword”“”)”}”(hŒstruct”h]”hŒstruct”…””}”(hj³h²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1j±hj­h²hh³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´KubhŒdesc_sig_space”“”)”}”(hŒ ”h]”hŒ ”…””}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1jÃhj­h²hh³jÂh´KubhŒ desc_name”“”)”}”(hŒtrace_remote_callbacks”h]”hŒ desc_sig_name”“”)”}”(hj©h]”hŒtrace_remote_callbacks”…””}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jÚhjÖubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1jÔhj­h²hh³jÂh´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1j«Œsphinx_line_type”Œ declarator”hj§h²hh³jÂh´Kubah}”(h]”jžah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1j¥h³jÂh´Khj¢h²hubhŒ desc_content”“”)”}”(hhh]”hþ)”}”(hŒ/Callbacks used by Tracefs to control the remote”h]”hŒ/Callbacks used by Tracefs to control the remote”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´K hjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¢h²hh³jÂh´Kubeh}”(h]”h ]”(Œc”Œstruct”eh"]”h$]”h&]”Œdomain”j#Œobjtype”j$Œdesctype”j$Œnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1j h²hhj\h³Nh´NubhŒ container”“”)”}”(hX¹**Definition**:: struct trace_remote_callbacks { int (*init)(struct dentry *d, void *priv); struct trace_buffer_desc *(*load_trace_buffer)(unsigned long size, void *priv); void (*unload_trace_buffer)(struct trace_buffer_desc *desc, void *priv); int (*enable_tracing)(bool enable, void *priv); int (*swap_reader_page)(unsigned int cpu, void *priv); int (*reset)(unsigned int cpu, void *priv); int (*enable_event)(unsigned short id, bool enable, void *priv); }; **Members** ``init`` Called once the remote has been registered. Allows the caller to extend the Tracefs remote directory ``load_trace_buffer`` Called before Tracefs accesses the trace buffer for the first time. Must return a :c:type:`trace_buffer_desc` (most likely filled with trace_remote_alloc_buffer()) ``unload_trace_buffer`` Called once Tracefs has no use for the trace buffer (most likely call trace_remote_free_buffer()) ``enable_tracing`` Called on Tracefs tracing_on. It is expected from the remote to allow writing. ``swap_reader_page`` Called when Tracefs consumes a new page from a ring-buffer. It is expected from the remote to isolate a ``reset`` Called on `echo 0 > trace`. It is expected from the remote to reset all ring-buffer pages. new reader-page from the **cpu** ring-buffer. ``enable_event`` Called on events/event_name/enable. It is expected from the remote to allow the writing event **id**.”h]”(hþ)”}”(hŒ**Definition**::”h]”(hŒstrong”“”)”}”(hŒ**Definition**”h]”hŒ Definition”…””}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj4ubhŒ:”…””}”(hj4h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´Khj0ubhŒ literal_block”“”)”}”(hXÖstruct trace_remote_callbacks { int (*init)(struct dentry *d, void *priv); struct trace_buffer_desc *(*load_trace_buffer)(unsigned long size, void *priv); void (*unload_trace_buffer)(struct trace_buffer_desc *desc, void *priv); int (*enable_tracing)(bool enable, void *priv); int (*swap_reader_page)(unsigned int cpu, void *priv); int (*reset)(unsigned int cpu, void *priv); int (*enable_event)(unsigned short id, bool enable, void *priv); };”h]”hXÖstruct trace_remote_callbacks { int (*init)(struct dentry *d, void *priv); struct trace_buffer_desc *(*load_trace_buffer)(unsigned long size, void *priv); void (*unload_trace_buffer)(struct trace_buffer_desc *desc, void *priv); int (*enable_tracing)(bool enable, void *priv); int (*swap_reader_page)(unsigned int cpu, void *priv); int (*reset)(unsigned int cpu, void *priv); int (*enable_event)(unsigned short id, bool enable, void *priv); };”…””}”hjUsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jSh³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´Khj0ubhþ)”}”(hŒ **Members**”h]”j9)”}”(hjfh]”hŒMembers”…””}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjdubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´Khj0ubhŒdefinition_list”“”)”}”(hhh]”(hŒdefinition_list_item”“”)”}”(hŒn``init`` Called once the remote has been registered. Allows the caller to extend the Tracefs remote directory ”h]”(hŒterm”“”)”}”(hŒ``init``”h]”hŒliteral”“”)”}”(hj‹h]”hŒinit”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1j‡h³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´KhjƒubhŒ definition”“”)”}”(hhh]”hþ)”}”(hŒdCalled once the remote has been registered. Allows the caller to extend the Tracefs remote directory”h]”hŒdCalled once the remote has been registered. Allows the caller to extend the Tracefs remote directory”…””}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´K hj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjƒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³j¢h´Khj~ubj‚)”}”(hŒº``load_trace_buffer`` Called before Tracefs accesses the trace buffer for the first time. Must return a :c:type:`trace_buffer_desc` (most likely filled with trace_remote_alloc_buffer()) ”h]”(jˆ)”}”(hŒ``load_trace_buffer``”h]”jŽ)”}”(hjÉh]”hŒload_trace_buffer”…””}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÇubah}”(h]”h ]”h"]”h$]”h&]”uh1j‡h³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´KhjÃubj¤)”}”(hhh]”hþ)”}”(hŒ£Called before Tracefs accesses the trace buffer for the first time. Must return a :c:type:`trace_buffer_desc` (most likely filled with trace_remote_alloc_buffer())”h]”(hŒRCalled before Tracefs accesses the trace buffer for the first time. Must return a ”…””}”(hjâh²hh³Nh´Nubh)”}”(hŒ:c:type:`trace_buffer_desc`”h]”jŽ)”}”(hjìh]”hŒtrace_buffer_desc”…””}”(hjîh²hh³Nh´Nubah}”(h]”h ]”(Œxref”j#Œc-type”eh"]”h$]”h&]”uh1jhjêubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ trace/remotes”Œ refdomain”j#Œreftype”Œtype”Œ refexplicit”‰Œrefwarn”‰Œ c:parent_key”Œsphinx.domains.c”Œ LookupKey”“”)”}”Œdata”]”sbŒ reftarget”Œtrace_buffer_desc”uh1hh³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´KhjâubhŒ6 (most likely filled with trace_remote_alloc_buffer())”…””}”(hjâh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jh´Khjßubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjÃubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jÞh´Khj~ubj‚)”}”(hŒz``unload_trace_buffer`` Called once Tracefs has no use for the trace buffer (most likely call trace_remote_free_buffer()) ”h]”(jˆ)”}”(hŒ``unload_trace_buffer``”h]”jŽ)”}”(hj1h]”hŒunload_trace_buffer”…””}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j‡h³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´Khj+ubj¤)”}”(hhh]”hþ)”}”(hŒaCalled once Tracefs has no use for the trace buffer (most likely call trace_remote_free_buffer())”h]”hŒaCalled once Tracefs has no use for the trace buffer (most likely call trace_remote_free_buffer())”…””}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´KhjGubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hj+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jFh´Khj~ubj‚)”}”(hŒb``enable_tracing`` Called on Tracefs tracing_on. It is expected from the remote to allow writing. ”h]”(jˆ)”}”(hŒ``enable_tracing``”h]”jŽ)”}”(hjkh]”hŒenable_tracing”…””}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjiubah}”(h]”h ]”h"]”h$]”h&]”uh1j‡h³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´Khjeubj¤)”}”(hhh]”hþ)”}”(hŒNCalled on Tracefs tracing_on. It is expected from the remote to allow writing.”h]”hŒNCalled on Tracefs tracing_on. It is expected from the remote to allow writing.”…””}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjeubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³j€h´Khj~ubj‚)”}”(hŒ}``swap_reader_page`` Called when Tracefs consumes a new page from a ring-buffer. It is expected from the remote to isolate a ”h]”(jˆ)”}”(hŒ``swap_reader_page``”h]”jŽ)”}”(hj¥h]”hŒswap_reader_page”…””}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1j‡h³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´KhjŸubj¤)”}”(hhh]”hþ)”}”(hŒgCalled when Tracefs consumes a new page from a ring-buffer. It is expected from the remote to isolate a”h]”hŒgCalled when Tracefs consumes a new page from a ring-buffer. It is expected from the remote to isolate a”…””}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´Khj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjŸubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jºh´Khj~ubj‚)”}”(hŒ“``reset`` Called on `echo 0 > trace`. It is expected from the remote to reset all ring-buffer pages. new reader-page from the **cpu** ring-buffer. ”h]”(jˆ)”}”(hŒ ``reset``”h]”jŽ)”}”(hjßh]”hŒreset”…””}”(hjáh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÝubah}”(h]”h ]”h"]”h$]”h&]”uh1j‡h³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´KhjÙubj¤)”}”(hhh]”hþ)”}”(hŒˆCalled on `echo 0 > trace`. It is expected from the remote to reset all ring-buffer pages. new reader-page from the **cpu** ring-buffer.”h]”(hŒ Called on ”…””}”(hjøh²hh³Nh´Nubjv)”}”(hŒ`echo 0 > trace`”h]”hŒecho 0 > trace”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjøubhŒZ. It is expected from the remote to reset all ring-buffer pages. new reader-page from the ”…””}”(hjøh²hh³Nh´Nubj9)”}”(hŒ**cpu**”h]”hŒcpu”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjøubhŒ ring-buffer.”…””}”(hjøh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´Khjõubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjÙubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jôh´Khj~ubj‚)”}”(hŒv``enable_event`` Called on events/event_name/enable. It is expected from the remote to allow the writing event **id**.”h]”(jˆ)”}”(hŒ``enable_event``”h]”jŽ)”}”(hj=h]”hŒ enable_event”…””}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1j‡h³ŒZ/var/lib/git/docbuild/linux/Documentation/trace/remotes:28: ./include/linux/trace_remote.h”h´Khj7ubj¤)”}”(hhh]”hþ)”}”(hŒeCalled on events/event_name/enable. It is expected from the remote to allow the writing event **id**.”h]”(hŒ^Called on events/event_name/enable. It is expected from the remote to allow the writing event ”…””}”(hjVh²hh³Nh´Nubj9)”}”(hŒ**id**”h]”hŒid”…””}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjVubhŒ.”…””}”(hjVh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jRh´KhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hj7ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jRh´Khj~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j|hj0ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j.hj\h²hh³Nh´Nubhþ)”}”(hŒ´Once registered, an instance will appear for this remote in the Tracefs directory **remotes/**. Buffers can then be read using the usual Tracefs files **trace_pipe** and **trace**.”h]”(hŒROnce registered, an instance will appear for this remote in the Tracefs directory ”…””}”(hjh²hh³Nh´Nubj9)”}”(hŒ **remotes/**”h]”hŒremotes/”…””}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjubhŒ9. Buffers can then be read using the usual Tracefs files ”…””}”(hjh²hh³Nh´Nubj9)”}”(hŒ**trace_pipe**”h]”hŒ trace_pipe”…””}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjubhŒ and ”…””}”(hjh²hh³Nh´Nubj9)”}”(hŒ **trace**”h]”hŒtrace”…””}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjubhŒ.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khj\h²hubeh}”(h]”Œregister-a-remote”ah ]”h"]”Œregister a remote”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒDeclare a remote event”h]”hŒDeclare a remote event”…””}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÛh²hh³hÇh´K#ubhþ)”}”(hŒÊMacros are provided to ease the declaration of remote events, in a similar fashion to in-kernel events. A declaration must provide an ID, a description of the event arguments and how to print the event:”h]”hŒÊMacros are provided to ease the declaration of remote events, in a similar fashion to in-kernel events. A declaration must provide an ID, a description of the event arguments and how to print the event:”…””}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K$hjÛh²hubjT)”}”(hŒREMOTE_EVENT(foo, EVENT_FOO_ID, RE_STRUCT( re_field(u64, bar) ), RE_PRINTK("bar=%lld", __entry->bar) );”h]”hŒREMOTE_EVENT(foo, EVENT_FOO_ID, RE_STRUCT( re_field(u64, bar) ), RE_PRINTK("bar=%lld", __entry->bar) );”…””}”hjúsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”j#Œhighlight_args”}”uh1jSh³hÇh´K(hjÛh²hubhþ)”}”(hŒBThen those events must be declared in a C file with the following:”h]”hŒBThen those events must be declared in a C file with the following:”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K1hjÛh²hubjT)”}”(hŒV#define REMOTE_EVENT_INCLUDE_FILE foo_events.h #include ”h]”hŒV#define REMOTE_EVENT_INCLUDE_FILE foo_events.h #include ”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj‰j j#j }”uh1jSh³hÇh´K3hjÛh²hubhþ)”}”(hŒhThis will provide a `struct remote_event remote_event_foo` that can be given to `trace_remote_register`.”h]”(hŒThis will provide a ”…””}”(hj)h²hh³Nh´Nubjv)”}”(hŒ&`struct remote_event remote_event_foo`”h]”hŒ$struct remote_event remote_event_foo”…””}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1juhj)ubhŒ that can be given to ”…””}”(hj)h²hh³Nh´Nubjv)”}”(hŒ`trace_remote_register`”h]”hŒtrace_remote_register”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1juhj)ubhŒ.”…””}”(hj)h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K8hjÛh²hubhþ)”}”(hŒCRegistered events appear in the remote directory under **events/**.”h]”(hŒ7Registered events appear in the remote directory under ”…””}”(hj[h²hh³Nh´Nubj9)”}”(hŒ **events/**”h]”hŒevents/”…””}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj[ubhŒ.”…””}”(hj[h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K;hjÛh²hubeh}”(h]”Œdeclare-a-remote-event”ah ]”h"]”Œdeclare a remote event”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K#ubhÉ)”}”(hhh]”(hÎ)”}”(hŒSimple ring-buffer”h]”hŒSimple ring-buffer”…””}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjƒh²hh³hÇh´K>ubhþ)”}”(hŒcA simple implementation for a ring-buffer writer can be found in kernel/trace/simple_ring_buffer.c.”h]”hŒcA simple implementation for a ring-buffer writer can be found in kernel/trace/simple_ring_buffer.c.”…””}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K?hjƒh²hubeh}”(h]”Œsimple-ring-buffer”ah ]”h"]”Œsimple ring-buffer”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K>ubeh}”(h]”Œtracing-remotes”ah ]”h"]”Œtracing remotes”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”jÕŒ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”}”(j¯j¬jYjVjØjÕj€j}j§j¤uŒ nametypes”}”(j¯‰jY‰j؉j€‰j§‰uh}”(j¬hÊjVj5jÕj\jž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.