€•í\Œ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/core-api/real-time/architecture-porting”Œ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/core-api/real-time/architecture-porting”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ;/translations/it_IT/core-api/real-time/architecture-porting”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ;/translations/ja_JP/core-api/real-time/architecture-porting”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ;/translations/ko_KR/core-api/real-time/architecture-porting”Œ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/core-api/real-time/architecture-porting”Œ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ŸŒU/var/lib/git/docbuild/linux/Documentation/core-api/real-time/architecture-porting.rst”h KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ-Porting an architecture to support PREEMPT_RT”h]”hŒ-Porting an architecture to support PREEMPT_RT”…””}”(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Œ2Sebastian Andrzej Siewior ”h]”hŒ paragraph”“”)”}”(hŒ1Sebastian Andrzej Siewior ”h]”(hŒSebastian Andrzej Siewior <”…””}”(hhëhžhhŸNh NubhŒ reference”“”)”}”(hŒbigeasy@linutronix.de”h]”hŒbigeasy@linutronix.de”…””}”(hhõhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:bigeasy@linutronix.de”uh1hóhhë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ê)”}”(hX_This list outlines the architecture specific requirements that must be implemented in order to enable PREEMPT_RT. Once all required features are implemented, ARCH_SUPPORTS_RT can be selected in architecture’s Kconfig to make PREEMPT_RT selectable. Many prerequisites (genirq support for example) are enforced by the common code and are omitted here.”h]”hX_This list outlines the architecture specific requirements that must be implemented in order to enable PREEMPT_RT. Once all required features are implemented, ARCH_SUPPORTS_RT can be selected in architecture’s Kconfig to make PREEMPT_RT selectable. Many prerequisites (genirq support for example) are enforced by the common code and are omitted here.”…””}”(hj!hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1héhŸh³h K hh¶hžhubhê)”}”(hŒQThe optional features are not strictly required but it is worth to consider them.”h]”hŒQThe optional features are not strictly required but it is worth to consider them.”…””}”(hj/hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1héhŸh³h Khh¶hžhubhµ)”}”(hhh]”(hº)”}”(hŒ Requirements”h]”hŒ Requirements”…””}”(hj@hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hj=hžhhŸh³h KubhŒdefinition_list”“”)”}”(hhh]”(hŒdefinition_list_item”“”)”}”(hX%Forced threaded interrupts CONFIG_IRQ_FORCED_THREADING must be selected. Any interrupts that must remain in hard-IRQ context must be marked with IRQF_NO_THREAD. This requirement applies for instance to clocksource event interrupts, perf interrupts and cascading interrupt-controller handlers. ”h]”(hŒterm”“”)”}”(hŒForced threaded interrupts”h]”hŒForced threaded interrupts”…””}”(hj[hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhŸh³h KhjUubhŒ definition”“”)”}”(hhh]”hê)”}”(hX CONFIG_IRQ_FORCED_THREADING must be selected. Any interrupts that must remain in hard-IRQ context must be marked with IRQF_NO_THREAD. This requirement applies for instance to clocksource event interrupts, perf interrupts and cascading interrupt-controller handlers.”h]”hX CONFIG_IRQ_FORCED_THREADING must be selected. Any interrupts that must remain in hard-IRQ context must be marked with IRQF_NO_THREAD. This requirement applies for instance to clocksource event interrupts, perf interrupts and cascading interrupt-controller handlers.”…””}”(hjnhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1héhŸh³h Khjkubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjUubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShŸh³h KhjPubjT)”}”(hŒêPREEMPTION support Kernel preemption must be supported and requires that CONFIG_ARCH_NO_PREEMPT remain unselected. Scheduling requests, such as those issued from an interrupt or other exception handler, must be processed immediately. ”h]”(jZ)”}”(hŒPREEMPTION support”h]”hŒPREEMPTION support”…””}”(hjŒhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhŸh³h K hjˆubjj)”}”(hhh]”hê)”}”(hŒÖKernel preemption must be supported and requires that CONFIG_ARCH_NO_PREEMPT remain unselected. Scheduling requests, such as those issued from an interrupt or other exception handler, must be processed immediately.”h]”hŒÖKernel preemption must be supported and requires that CONFIG_ARCH_NO_PREEMPT remain unselected. Scheduling requests, such as those issued from an interrupt or other exception handler, must be processed immediately.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1héhŸh³h Khjšubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjˆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShŸh³h K hjPhžhubjT)”}”(hX–POSIX CPU timers and KVM POSIX CPU timers must expire from thread context rather than directly within the timer interrupt. This behavior is enabled by setting the configuration option CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK. When KVM is enabled, CONFIG_KVM_XFER_TO_GUEST_WORK must also be set to ensure that any pending work, such as POSIX timer expiration, is handled before transitioning into guest mode. ”h]”(jZ)”}”(hŒPOSIX CPU timers and KVM”h]”hŒPOSIX CPU timers and KVM”…””}”(hj»hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhŸh³h K(hj·ubjj)”}”(hhh]”hê)”}”(hX|POSIX CPU timers must expire from thread context rather than directly within the timer interrupt. This behavior is enabled by setting the configuration option CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK. When KVM is enabled, CONFIG_KVM_XFER_TO_GUEST_WORK must also be set to ensure that any pending work, such as POSIX timer expiration, is handled before transitioning into guest mode.”h]”hX|POSIX CPU timers must expire from thread context rather than directly within the timer interrupt. This behavior is enabled by setting the configuration option CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK. When KVM is enabled, CONFIG_KVM_XFER_TO_GUEST_WORK must also be set to ensure that any pending work, such as POSIX timer expiration, is handled before transitioning into guest mode.”…””}”(hjÌhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1héhŸh³h K#hjÉubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj·ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShŸh³h K(hjPhžhubjT)”}”(hXHard-IRQ and Soft-IRQ stacks Soft interrupts are handled in the thread context in which they are raised. If a soft interrupt is triggered from hard-IRQ context, its execution is deferred to the ksoftirqd thread. Preemption is never disabled during soft interrupt handling, which makes soft interrupts preemptible. If an architecture provides a custom __do_softirq() implementation that uses a separate stack, it must select CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK. The functionality should only be enabled when CONFIG_SOFTIRQ_ON_OWN_STACK is set. ”h]”(jZ)”}”(hŒHard-IRQ and Soft-IRQ stacks”h]”hŒHard-IRQ and Soft-IRQ stacks”…””}”(hjêhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhŸh³h K1hjæubjj)”}”(hhh]”hê)”}”(hXþSoft interrupts are handled in the thread context in which they are raised. If a soft interrupt is triggered from hard-IRQ context, its execution is deferred to the ksoftirqd thread. Preemption is never disabled during soft interrupt handling, which makes soft interrupts preemptible. If an architecture provides a custom __do_softirq() implementation that uses a separate stack, it must select CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK. The functionality should only be enabled when CONFIG_SOFTIRQ_ON_OWN_STACK is set.”h]”hXþSoft interrupts are handled in the thread context in which they are raised. If a soft interrupt is triggered from hard-IRQ context, its execution is deferred to the ksoftirqd thread. Preemption is never disabled during soft interrupt handling, which makes soft interrupts preemptible. If an architecture provides a custom __do_softirq() implementation that uses a separate stack, it must select CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK. The functionality should only be enabled when CONFIG_SOFTIRQ_ON_OWN_STACK is set.”…””}”(hjûhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1héhŸh³h K+hjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjæubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShŸh³h K1hjPhžhubjT)”}”(hXHFPU and SIMD access in kernel mode FPU and SIMD registers are typically not used in kernel mode and are therefore not saved during kernel preemption. As a result, any kernel code that uses these registers must be enclosed within a kernel_fpu_begin() and kernel_fpu_end() section. The kernel_fpu_begin() function usually invokes local_bh_disable() to prevent interruptions from softirqs and to disable regular preemption. This allows the protected code to run safely in both thread and softirq contexts. On PREEMPT_RT kernels, however, kernel_fpu_begin() must not call local_bh_disable(). Instead, it should use preempt_disable(), since softirqs are always handled in thread context under PREEMPT_RT. In this case, disabling preemption alone is sufficient. The crypto subsystem operates on memory pages and requires users to "walk and map" these pages while processing a request. This operation must occur outside the kernel_fpu_begin()/ kernel_fpu_end() section because it requires preemption to be enabled. These preemption points are generally sufficient to avoid excessive scheduling latency. ”h]”(jZ)”}”(hŒ"FPU and SIMD access in kernel mode”h]”hŒ"FPU and SIMD access in kernel mode”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhŸh³h KChjubjj)”}”(hhh]”hê)”}”(hX$FPU and SIMD registers are typically not used in kernel mode and are therefore not saved during kernel preemption. As a result, any kernel code that uses these registers must be enclosed within a kernel_fpu_begin() and kernel_fpu_end() section. The kernel_fpu_begin() function usually invokes local_bh_disable() to prevent interruptions from softirqs and to disable regular preemption. This allows the protected code to run safely in both thread and softirq contexts. On PREEMPT_RT kernels, however, kernel_fpu_begin() must not call local_bh_disable(). Instead, it should use preempt_disable(), since softirqs are always handled in thread context under PREEMPT_RT. In this case, disabling preemption alone is sufficient. The crypto subsystem operates on memory pages and requires users to "walk and map" these pages while processing a request. This operation must occur outside the kernel_fpu_begin()/ kernel_fpu_end() section because it requires preemption to be enabled. These preemption points are generally sufficient to avoid excessive scheduling latency.”h]”hX(FPU and SIMD registers are typically not used in kernel mode and are therefore not saved during kernel preemption. As a result, any kernel code that uses these registers must be enclosed within a kernel_fpu_begin() and kernel_fpu_end() section. The kernel_fpu_begin() function usually invokes local_bh_disable() to prevent interruptions from softirqs and to disable regular preemption. This allows the protected code to run safely in both thread and softirq contexts. On PREEMPT_RT kernels, however, kernel_fpu_begin() must not call local_bh_disable(). Instead, it should use preempt_disable(), since softirqs are always handled in thread context under PREEMPT_RT. In this case, disabling preemption alone is sufficient. The crypto subsystem operates on memory pages and requires users to “walk and map†these pages while processing a request. This operation must occur outside the kernel_fpu_begin()/ kernel_fpu_end() section because it requires preemption to be enabled. These preemption points are generally sufficient to avoid excessive scheduling latency.”…””}”(hj*hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1héhŸh³h K4hj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShŸh³h KChjPhžhubjT)”}”(hX®Exception handlers Exception handlers, such as the page fault handler, typically enable interrupts early, before invoking any generic code to process the exception. This is necessary because handling a page fault may involve operations that can sleep. Enabling interrupts is especially important on PREEMPT_RT, where certain locks, such as spinlock_t, become sleepable. For example, handling an invalid opcode may result in sending a SIGILL signal to the user task. A debug excpetion will send a SIGTRAP signal. In both cases, if the exception occurred in user space, it is safe to enable interrupts early. Sending a signal requires both interrupts and kernel preemption to be enabled. ”h]”(jZ)”}”(hŒException handlers”h]”hŒException handlers”…””}”(hjHhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhŸh³h KOhjDubjj)”}”(hhh]”hê)”}”(hXšException handlers, such as the page fault handler, typically enable interrupts early, before invoking any generic code to process the exception. This is necessary because handling a page fault may involve operations that can sleep. Enabling interrupts is especially important on PREEMPT_RT, where certain locks, such as spinlock_t, become sleepable. For example, handling an invalid opcode may result in sending a SIGILL signal to the user task. A debug excpetion will send a SIGTRAP signal. In both cases, if the exception occurred in user space, it is safe to enable interrupts early. Sending a signal requires both interrupts and kernel preemption to be enabled.”h]”hXšException handlers, such as the page fault handler, typically enable interrupts early, before invoking any generic code to process the exception. This is necessary because handling a page fault may involve operations that can sleep. Enabling interrupts is especially important on PREEMPT_RT, where certain locks, such as spinlock_t, become sleepable. For example, handling an invalid opcode may result in sending a SIGILL signal to the user task. A debug excpetion will send a SIGTRAP signal. In both cases, if the exception occurred in user space, it is safe to enable interrupts early. Sending a signal requires both interrupts and kernel preemption to be enabled.”…””}”(hjYhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1héhŸh³h KFhjVubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjDubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShŸh³h KOhjPhžhubeh}”(h]”h ]”h"]”h$]”h&]”uh1jNhj=hžhhŸh³h Nubeh}”(h]”Œ requirements”ah ]”h"]”Œ requirements”ah$]”h&]”uh1h´hh¶hžhhŸh³h Kubhµ)”}”(hhh]”(hº)”}”(hŒOptional features”h]”hŒOptional features”…””}”(hj„hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hjhžhhŸh³h KRubjO)”}”(hhh]”(jT)”}”(hŒùTimer and clocksource A high-resolution clocksource and clockevents device are recommended. The clockevents device should support the CLOCK_EVT_FEAT_ONESHOT feature for optimal timer behavior. In most cases, microsecond-level accuracy is sufficient ”h]”(jZ)”}”(hŒTimer and clocksource”h]”hŒTimer and clocksource”…””}”(hj™hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhŸh³h KXhj•ubjj)”}”(hhh]”hê)”}”(hŒâA high-resolution clocksource and clockevents device are recommended. The clockevents device should support the CLOCK_EVT_FEAT_ONESHOT feature for optimal timer behavior. In most cases, microsecond-level accuracy is sufficient”h]”hŒâA high-resolution clocksource and clockevents device are recommended. The clockevents device should support the CLOCK_EVT_FEAT_ONESHOT feature for optimal timer behavior. In most cases, microsecond-level accuracy is sufficient”…””}”(hjªhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1héhŸh³h KUhj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj•ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShŸh³h KXhj’ubjT)”}”(hX”Lazy preemption This mechanism allows an in-kernel scheduling request for non-real-time tasks to be delayed until the task is about to return to user space. It helps avoid preempting a task that holds a sleeping lock at the time of the scheduling request. With CONFIG_GENERIC_IRQ_ENTRY enabled, supporting this feature requires defining a bit for TIF_NEED_RESCHED_LAZY, preferably near TIF_NEED_RESCHED. ”h]”(jZ)”}”(hŒLazy preemption”h]”hŒLazy preemption”…””}”(hjÈhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhŸh³h K`hjÄubjj)”}”(hhh]”hê)”}”(hXƒThis mechanism allows an in-kernel scheduling request for non-real-time tasks to be delayed until the task is about to return to user space. It helps avoid preempting a task that holds a sleeping lock at the time of the scheduling request. With CONFIG_GENERIC_IRQ_ENTRY enabled, supporting this feature requires defining a bit for TIF_NEED_RESCHED_LAZY, preferably near TIF_NEED_RESCHED.”h]”hXƒThis mechanism allows an in-kernel scheduling request for non-real-time tasks to be delayed until the task is about to return to user space. It helps avoid preempting a task that holds a sleeping lock at the time of the scheduling request. With CONFIG_GENERIC_IRQ_ENTRY enabled, supporting this feature requires defining a bit for TIF_NEED_RESCHED_LAZY, preferably near TIF_NEED_RESCHED.”…””}”(hjÙhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1héhŸh³h K[hjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÄubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShŸh³h K`hj’hžhubjT)”}”(hXÛSerial console with NBCON With PREEMPT_RT enabled, all console output is handled by a dedicated thread rather than directly from the context in which printk() is invoked. This design allows printk() to be safely used in atomic contexts. However, this also means that if the kernel crashes and cannot switch to the printing thread, no output will be visible preventing the system from printing its final messages. There are exceptions for immediate output, such as during panic() handling. To support this, the console driver must implement new-style lock handling. This involves setting the CON_NBCON flag in console::flags and providing implementations for the write_atomic, write_thread, device_lock, and device_unlock callbacks.”h]”(jZ)”}”(hŒSerial console with NBCON”h]”hŒSerial console with NBCON”…””}”(hj÷hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhŸh³h Klhjóubjj)”}”(hhh]”hê)”}”(hXÁWith PREEMPT_RT enabled, all console output is handled by a dedicated thread rather than directly from the context in which printk() is invoked. This design allows printk() to be safely used in atomic contexts. However, this also means that if the kernel crashes and cannot switch to the printing thread, no output will be visible preventing the system from printing its final messages. There are exceptions for immediate output, such as during panic() handling. To support this, the console driver must implement new-style lock handling. This involves setting the CON_NBCON flag in console::flags and providing implementations for the write_atomic, write_thread, device_lock, and device_unlock callbacks.”h]”hXÁWith PREEMPT_RT enabled, all console output is handled by a dedicated thread rather than directly from the context in which printk() is invoked. This design allows printk() to be safely used in atomic contexts. However, this also means that if the kernel crashes and cannot switch to the printing thread, no output will be visible preventing the system from printing its final messages. There are exceptions for immediate output, such as during panic() handling. To support this, the console driver must implement new-style lock handling. This involves setting the CON_NBCON flag in console::flags and providing implementations for the write_atomic, write_thread, device_lock, and device_unlock callbacks.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1héhŸh³h Kchjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjóubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShŸh³h Klhj’hžhubeh}”(h]”h ]”h"]”h$]”h&]”uh1jNhjhžhhŸh³h Nubeh}”(h]”Œoptional-features”ah ]”h"]”Œoptional features”ah$]”h&]”uh1h´hh¶hžhhŸh³h KRubeh}”(h]”Œ-porting-an-architecture-to-support-preempt-rt”ah ]”h"]”Œ-porting an architecture to support preempt_rt”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”}”(j5j2j~j{j-j*uŒ nametypes”}”(j5‰j~‰j-‰uh}”(j2h¶j{j=j*juŒ 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.