€•vXŒ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/userspace-api/rseq”Œ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/userspace-api/rseq”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/it_IT/userspace-api/rseq”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/ja_JP/userspace-api/rseq”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/ko_KR/userspace-api/rseq”Œ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/userspace-api/rseq”Œ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ŒRestartable Sequences”h]”hŒRestartable Sequences”…””}”(hh¨hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hh£hžhhŸŒ@/var/lib/git/docbuild/linux/Documentation/userspace-api/rseq.rst”h KubhŒ paragraph”“”)”}”(hŒRestartable Sequences allow to register a per thread userspace memory area to be used as an ABI between kernel and userspace for three purposes:”h]”hŒRestartable Sequences allow to register a per thread userspace memory area to be used as an ABI between kernel and userspace for three purposes:”…””}”(hh¹hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khh£hžhubhŒ block_quote”“”)”}”(hŒŒ* userspace restartable sequences * quick access to read the current CPU number, node ID from userspace * scheduler time slice extensions ”h]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ userspace restartable sequences ”h]”h¸)”}”(hŒuserspace restartable sequences”h]”hŒuserspace restartable sequences”…””}”(hhØhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KhhÔubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhhÏubhÓ)”}”(hŒDquick access to read the current CPU number, node ID from userspace ”h]”h¸)”}”(hŒCquick access to read the current CPU number, node ID from userspace”h]”hŒCquick access to read the current CPU number, node ID from userspace”…””}”(hhðhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K hhìubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhhÏubhÓ)”}”(hŒ scheduler time slice extensions ”h]”h¸)”}”(hŒscheduler time slice extensions”h]”hŒscheduler time slice extensions”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhhÏubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1hÍhŸh¶h KhhÉubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhŸh¶h Khh£hžhubh¢)”}”(hhh]”(h§)”}”(hŒ'Restartable sequences (per-cpu atomics)”h]”hŒ'Restartable sequences (per-cpu atomics)”…””}”(hj-hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hj*hžhhŸh¶h Kubh¸)”}”(hŒÍRestartable sequences allow userspace to perform update operations on per-cpu data without requiring heavyweight atomic operations. The actual ABI is unfortunately only available in the code and selftests.”h]”hŒÍRestartable sequences allow userspace to perform update operations on per-cpu data without requiring heavyweight atomic operations. The actual ABI is unfortunately only available in the code and selftests.”…””}”(hj;hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj*hžhubeh}”(h]”Œ%restartable-sequences-per-cpu-atomics”ah ]”h"]”Œ'restartable sequences (per-cpu atomics)”ah$]”h&]”uh1h¡hh£hžhhŸh¶h Kubh¢)”}”(hhh]”(h§)”}”(hŒ#Quick access to CPU number, node ID”h]”hŒ#Quick access to CPU number, node ID”…””}”(hjThžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjQhžhhŸh¶h Kubh¸)”}”(hŒXAllows to implement per CPU data efficiently. Documentation is in code and selftests. :(”h]”hŒXAllows to implement per CPU data efficiently. Documentation is in code and selftests. :(”…””}”(hjbhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KhjQhžhubeh}”(h]”Œ"quick-access-to-cpu-number-node-id”ah ]”h"]”Œ#quick access to cpu number, node id”ah$]”h&]”uh1h¡hh£hžhhŸh¶h Kubh¢)”}”(hhh]”(h§)”}”(hŒScheduler time slice extensions”h]”hŒScheduler time slice extensions”…””}”(hj{hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjxhžhhŸh¶h Kubh¸)”}”(hŒ»This allows a thread to request a time slice extension when it enters a critical section to avoid contention on a resource when the thread is scheduled out inside of the critical section.”h]”hŒ»This allows a thread to request a time slice extension when it enters a critical section to avoid contention on a resource when the thread is scheduled out inside of the critical section.”…””}”(hj‰hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khjxhžhubh¸)”}”(hŒ-The prerequisites for this functionality are:”h]”hŒ-The prerequisites for this functionality are:”…””}”(hj—hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K"hjxhžhubhÈ)”}”(hŒ* Enabled in Kconfig * Enabled at boot time (default is enabled) * A rseq userspace pointer has been registered for the thread ”h]”hÎ)”}”(hhh]”(hÓ)”}”(hŒEnabled in Kconfig ”h]”h¸)”}”(hŒEnabled in Kconfig”h]”hŒEnabled in Kconfig”…””}”(hj°hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K$hj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj©ubhÓ)”}”(hŒ*Enabled at boot time (default is enabled) ”h]”h¸)”}”(hŒ)Enabled at boot time (default is enabled)”h]”hŒ)Enabled at boot time (default is enabled)”…””}”(hjÈhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K&hjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj©ubhÓ)”}”(hŒuh1j8hj5ubhŒthead”“”)”}”(hhh]”hŒrow”“”)”}”(hhh]”(hŒentry”“”)”}”(hhh]”h¸)”}”(hŒ Errorcode”h]”hŒ Errorcode”…””}”(hj]hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K2hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhjUubjY)”}”(hhh]”h¸)”}”(hŒMeaning”h]”hŒMeaning”…””}”(hjthžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K2hjqubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhjUubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShjPubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj5ubhŒtbody”“”)”}”(hhh]”(jT)”}”(hhh]”(jY)”}”(hhh]”h¸)”}”(hŒEINVAL”h]”hŒEINVAL”…””}”(hjŸhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K4hjœubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhj™ubjY)”}”(hhh]”h¸)”}”(hŒ[Functionality not available or invalid function arguments. Note: arg4 and arg5 must be zero”h]”hŒ[Functionality not available or invalid function arguments. Note: arg4 and arg5 must be zero”…””}”(hj¶hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K4hj³ubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhj™ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShj–ubjT)”}”(hhh]”(jY)”}”(hhh]”h¸)”}”(hŒENOTSUPP”h]”hŒENOTSUPP”…””}”(hjÖhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K6hjÓubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhjÐubjY)”}”(hhh]”h¸)”}”(hŒ5Functionality was disabled on the kernel command line”h]”hŒ5Functionality was disabled on the kernel command line”…””}”(hjíhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K6hjêubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhjÐubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShj–ubjT)”}”(hhh]”(jY)”}”(hhh]”h¸)”}”(hŒENXIO”h]”hŒENXIO”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K7hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhjubjY)”}”(hhh]”h¸)”}”(hŒ-Available, but no rseq user struct registered”h]”hŒ-Available, but no rseq user struct registered”…””}”(hj$hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K7hj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShj–ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j”hj5ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j3hj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjxhžhhŸh¶h Nubh¸)”}”(hŒ,The state can be also queried via prctl(2)::”h]”hŒ+The state can be also queried via prctl(2):”…””}”(hjQhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K:hjxhžhubj)”}”(hŒEprctl(PR_RSEQ_SLICE_EXTENSION, PR_RSEQ_SLICE_EXTENSION_GET, 0, 0, 0);”h]”hŒEprctl(PR_RSEQ_SLICE_EXTENSION, PR_RSEQ_SLICE_EXTENSION_GET, 0, 0, 0);”…””}”hj_sbah}”(h]”h ]”h"]”h$]”h&]”jjuh1jhŸh¶h Khjxhžhubj/)”}”(hhh]”j4)”}”(hhh]”(j9)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K uh1j8hj’ubj9)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K>uh1j8hj’ubjO)”}”(hhh]”jT)”}”(hhh]”(jY)”}”(hhh]”h¸)”}”(hŒ Errorcode”h]”hŒ Errorcode”…””}”(hj²hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KBhj¯ubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhj¬ubjY)”}”(hhh]”h¸)”}”(hŒMeaning”h]”hŒMeaning”…””}”(hjÉhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KBhjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhj¬ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShj©ubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj’ubj•)”}”(hhh]”jT)”}”(hhh]”(jY)”}”(hhh]”h¸)”}”(hŒEINVAL”h]”hŒEINVAL”…””}”(hjòhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KDhjïubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhjìubjY)”}”(hhh]”h¸)”}”(hŒdFunctionality not available or invalid function arguments. Note: arg3 and arg4 and arg5 must be zero”h]”hŒdFunctionality not available or invalid function arguments. Note: arg3 and arg4 and arg5 must be zero”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KDhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhjìubeh}”(h]”h ]”h"]”h$]”h&]”uh1jShjéubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj’ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j3hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j.hjxhžhhŸh¶h Nubh¸)”}”(hŒýThe availability and status is also exposed via the rseq ABI struct flags field via the ``RSEQ_CS_FLAG_SLICE_EXT_AVAILABLE_BIT`` and the ``RSEQ_CS_FLAG_SLICE_EXT_ENABLED_BIT``. These bits are read-only for user space and only for informational purposes.”h]”(hŒXThe availability and status is also exposed via the rseq ABI struct flags field via the ”…””}”(hj6hžhhŸNh Nubjv)”}”(hŒ(``RSEQ_CS_FLAG_SLICE_EXT_AVAILABLE_BIT``”h]”hŒ$RSEQ_CS_FLAG_SLICE_EXT_AVAILABLE_BIT”…””}”(hj>hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1juhj6ubhŒ and the ”…””}”(hj6hžhhŸNh Nubjv)”}”(hŒ&``RSEQ_CS_FLAG_SLICE_EXT_ENABLED_BIT``”h]”hŒ"RSEQ_CS_FLAG_SLICE_EXT_ENABLED_BIT”…””}”(hjPhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1juhj6ubhŒN. These bits are read-only for user space and only for informational purposes.”…””}”(hj6hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KHhjxhžhubh¸)”}”(hX+If the mechanism was enabled via prctl(), the thread can request a time slice extension by setting rseq::slice_ctrl::request to 1. If the thread is interrupted and the interrupt results in a reschedule request in the kernel, then the kernel can grant a time slice extension and return to userspace instead of scheduling out. The length of the extension is determined by debugfs:rseq/slice_ext_nsec. The default value is 5 usec; which is the minimum value. It can be incremented to 50 usecs, however doing so can/will affect the minimum scheduling latency.”h]”hX+If the mechanism was enabled via prctl(), the thread can request a time slice extension by setting rseq::slice_ctrl::request to 1. If the thread is interrupted and the interrupt results in a reschedule request in the kernel, then the kernel can grant a time slice extension and return to userspace instead of scheduling out. The length of the extension is determined by debugfs:rseq/slice_ext_nsec. The default value is 5 usec; which is the minimum value. It can be incremented to 50 usecs, however doing so can/will affect the minimum scheduling latency.”…””}”(hjhhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KMhjxhžhubh¸)”}”(hŒ‰Any proposed changes to this default will have to come with a selftest and rseq-slice-hist.py output that shows the new value has merrit.”h]”hŒ‰Any proposed changes to this default will have to come with a selftest and rseq-slice-hist.py output that shows the new value has merrit.”…””}”(hjvhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KVhjxhžhubh¸)”}”(hŒöThe kernel indicates the grant by clearing rseq::slice_ctrl::request and setting rseq::slice_ctrl::granted to 1. If there is a reschedule of the thread after granting the extension, the kernel clears the granted bit to indicate that to userspace.”h]”hŒöThe kernel indicates the grant by clearing rseq::slice_ctrl::request and setting rseq::slice_ctrl::granted to 1. If there is a reschedule of the thread after granting the extension, the kernel clears the granted bit to indicate that to userspace.”…””}”(hj„hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KYhjxhžhubh¸)”}”(hŒkIf the request bit is still set when the leaving the critical section, userspace can clear it and continue.”h]”hŒkIf the request bit is still set when the leaving the critical section, userspace can clear it and continue.”…””}”(hj’hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K^hjxhžhubh¸)”}”(hŒçIf the granted bit is set, then userspace invokes rseq_slice_yield(2) when leaving the critical section to relinquish the CPU. The kernel enforces this by arming a timer to prevent misbehaving userspace from abusing this mechanism.”h]”hŒçIf the granted bit is set, then userspace invokes rseq_slice_yield(2) when leaving the critical section to relinquish the CPU. The kernel enforces this by arming a timer to prevent misbehaving userspace from abusing this mechanism.”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Kahjxhžhubh¸)”}”(hŒµIf both the request bit and the granted bit are false when leaving the critical section, then this indicates that a grant was revoked and no further action is required by userspace.”h]”hŒµIf both the request bit and the granted bit are false when leaving the critical section, then this indicates that a grant was revoked and no further action is required by userspace.”…””}”(hj®hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Kfhjxhžhubh¸)”}”(hŒ&The required code flow is as follows::”h]”hŒ%The required code flow is as follows:”…””}”(hj¼hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Kjhjxhžhubj)”}”(hŒÛrseq->slice_ctrl.request = 1; barrier(); // Prevent compiler reordering critical_section(); barrier(); // Prevent compiler reordering rseq->slice_ctrl.request = 0; if (rseq->slice_ctrl.granted) rseq_slice_yield();”h]”hŒÛrseq->slice_ctrl.request = 1; barrier(); // Prevent compiler reordering critical_section(); barrier(); // Prevent compiler reordering rseq->slice_ctrl.request = 0; if (rseq->slice_ctrl.granted) rseq_slice_yield();”…””}”hjÊsbah}”(h]”h ]”h"]”h$]”h&]”jjuh1jhŸh¶h Klhjxhžhubh¸)”}”(hŒ’As all of this is strictly CPU local, there are no atomicity requirements. Checking the granted state is racy, but that cannot be avoided at all::”h]”hŒ‘As all of this is strictly CPU local, there are no atomicity requirements. Checking the granted state is racy, but that cannot be avoided at all:”…””}”(hjØhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Kthjxhžhubj)”}”(hŒmif (rseq->slice_ctrl.granted) -> Interrupt results in schedule and grant revocation rseq_slice_yield();”h]”hŒmif (rseq->slice_ctrl.granted) -> Interrupt results in schedule and grant revocation rseq_slice_yield();”…””}”hjæsbah}”(h]”h ]”h"]”h$]”h&]”jjuh1jhŸh¶h Kwhjxhžhubh¸)”}”(hŒTSo there is no point in pretending that this might be solved by an atomic operation.”h]”hŒTSo there is no point in pretending that this might be solved by an atomic operation.”…””}”(hjôhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K{hjxhžhubh¸)”}”(hX†If the thread issues a syscall other than rseq_slice_yield(2) within the granted timeslice extension, the grant is also revoked and the CPU is relinquished immediately when entering the kernel. This is required as syscalls might consume arbitrary CPU time until they reach a scheduling point when the preemption model is either NONE or VOLUNTARY and therefore might exceed the grant by far.”h]”hX†If the thread issues a syscall other than rseq_slice_yield(2) within the granted timeslice extension, the grant is also revoked and the CPU is relinquished immediately when entering the kernel. This is required as syscalls might consume arbitrary CPU time until they reach a scheduling point when the preemption model is either NONE or VOLUNTARY and therefore might exceed the grant by far.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K~hjxhžhubh¸)”}”(hXOThe preferred solution for user space is to use rseq_slice_yield(2) which is side effect free. The support for arbitrary syscalls is required to support onion layer architectured applications, where the code handling the critical section and requesting the time slice extension has no control over the code within the critical section.”h]”hXOThe preferred solution for user space is to use rseq_slice_yield(2) which is side effect free. The support for arbitrary syscalls is required to support onion layer architectured applications, where the code handling the critical section and requesting the time slice extension has no control over the code within the critical section.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K…hjxhžhubh¸)”}”(hŒfThe kernel enforces flag consistency and terminates the thread with SIGSEGV if it detects a violation.”h]”hŒfThe kernel enforces flag consistency and terminates the thread with SIGSEGV if it detects a violation.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K‹hjxhžhubeh}”(h]”Œscheduler-time-slice-extensions”ah ]”h"]”Œscheduler time slice extensions”ah$]”h&]”uh1h¡hh£hžhhŸh¶h Kubeh}”(h]”Œrestartable-sequences”ah ]”h"]”Œrestartable sequences”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”jXŒ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”}”(j9j6jNjKjujrj1j.uŒ nametypes”}”(j9‰jN‰ju‰j1‰uh}”(j6h£jKj*jrjQj.jxuŒ 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.