€•ñSŒ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/infiniband/core_locking”Œ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/infiniband/core_locking”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/it_IT/infiniband/core_locking”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/ja_JP/infiniband/core_locking”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/ko_KR/infiniband/core_locking”Œ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/infiniband/core_locking”Œ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ŒInfiniBand Midlayer Locking”h]”hŒInfiniBand Midlayer Locking”…””}”(hh¨hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hh£hžhhŸŒE/var/lib/git/docbuild/linux/Documentation/infiniband/core_locking.rst”h KubhŒ block_quote”“”)”}”(hŒéThis guide is an attempt to make explicit the locking assumptions made by the InfiniBand midlayer. It describes the requirements on both low-level drivers that sit below the midlayer and upper level protocols that use the midlayer. ”h]”hŒ paragraph”“”)”}”(hŒèThis guide is an attempt to make explicit the locking assumptions made by the InfiniBand midlayer. It describes the requirements on both low-level drivers that sit below the midlayer and upper level protocols that use the midlayer.”h]”hŒèThis guide is an attempt to make explicit the locking assumptions made by the InfiniBand midlayer. It describes the requirements on both low-level drivers that sit below the midlayer and upper level protocols that use the midlayer.”…””}”(hh¿hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Khh¹ubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khh£hžhubh¢)”}”(hhh]”(h§)”}”(hŒSleeping and interrupt context”h]”hŒSleeping and interrupt context”…””}”(hhÖhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hhÓhžhhŸh¶h K ubh¸)”}”(hXøWith the following exceptions, a low-level driver implementation of all of the methods in struct ib_device may sleep. The exceptions are any methods from the list: - create_ah - modify_ah - query_ah - destroy_ah - post_send - post_recv - poll_cq - req_notify_cq which may not sleep and must be callable from any context. The corresponding functions exported to upper level protocol consumers: - rdma_create_ah - rdma_modify_ah - rdma_query_ah - rdma_destroy_ah - ib_post_send - ib_post_recv - ib_req_notify_cq are therefore safe to call from any context. In addition, the function - ib_dispatch_event used by low-level drivers to dispatch asynchronous events through the midlayer is also safe to call from any context. ”h]”(h¾)”}”(hŒ¤With the following exceptions, a low-level driver implementation of all of the methods in struct ib_device may sleep. The exceptions are any methods from the list:”h]”hŒ¤With the following exceptions, a low-level driver implementation of all of the methods in struct ib_device may sleep. The exceptions are any methods from the list:”…””}”(hhèhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K hhäubh¸)”}”(hŒb- create_ah - modify_ah - query_ah - destroy_ah - post_send - post_recv - poll_cq - req_notify_cq ”h]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ create_ah”h]”h¾)”}”(hjh]”hŒ create_ah”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhhüubj)”}”(hŒ modify_ah”h]”h¾)”}”(hjh]”hŒ modify_ah”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhhüubj)”}”(hŒquery_ah”h]”h¾)”}”(hj1h]”hŒquery_ah”…””}”(hj3hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Khj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhhüubj)”}”(hŒ destroy_ah”h]”h¾)”}”(hjHh]”hŒ destroy_ah”…””}”(hjJhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h KhjFubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhhüubj)”}”(hŒ post_send”h]”h¾)”}”(hj_h]”hŒ post_send”…””}”(hjahžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Khj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhhüubj)”}”(hŒ post_recv”h]”h¾)”}”(hjvh]”hŒ post_recv”…””}”(hjxhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Khjtubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhhüubj)”}”(hŒpoll_cq”h]”h¾)”}”(hjh]”hŒpoll_cq”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Khj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhhüubj)”}”(hŒreq_notify_cq ”h]”h¾)”}”(hŒ req_notify_cq”h]”hŒ req_notify_cq”…””}”(hj¦hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Khj¢ubah}”(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äubh¾)”}”(hŒ:which may not sleep and must be callable from any context.”h]”hŒ:which may not sleep and must be callable from any context.”…””}”(hjÈhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Khhäubh¾)”}”(hŒGThe corresponding functions exported to upper level protocol consumers:”h]”hŒGThe corresponding functions exported to upper level protocol consumers:”…””}”(hjÖhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Khhäubh¸)”}”(hŒu- rdma_create_ah - rdma_modify_ah - rdma_query_ah - rdma_destroy_ah - ib_post_send - ib_post_recv - ib_req_notify_cq ”h]”hû)”}”(hhh]”(j)”}”(hŒrdma_create_ah”h]”h¾)”}”(hjíh]”hŒrdma_create_ah”…””}”(hjïhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Khjëubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhjèubj)”}”(hŒrdma_modify_ah”h]”h¾)”}”(hjh]”hŒrdma_modify_ah”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhjèubj)”}”(hŒ rdma_query_ah”h]”h¾)”}”(hjh]”hŒ rdma_query_ah”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K!hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhjèubj)”}”(hŒrdma_destroy_ah”h]”h¾)”}”(hj2h]”hŒrdma_destroy_ah”…””}”(hj4hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K"hj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhjèubj)”}”(hŒ ib_post_send”h]”h¾)”}”(hjIh]”hŒ ib_post_send”…””}”(hjKhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K#hjGubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhjèubj)”}”(hŒ ib_post_recv”h]”h¾)”}”(hj`h]”hŒ ib_post_recv”…””}”(hjbhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K$hj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhjèubj)”}”(hŒib_req_notify_cq ”h]”h¾)”}”(hŒib_req_notify_cq”h]”hŒib_req_notify_cq”…””}”(hjyhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K%hjuubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhjèubeh}”(h]”h ]”h"]”h$]”h&]”jÀjÁuh1húhŸh¶h Khjäubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khhäubh¾)”}”(hŒ,are therefore safe to call from any context.”h]”hŒ,are therefore safe to call from any context.”…””}”(hj™hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K'hhäubh¾)”}”(hŒIn addition, the function”h]”hŒIn addition, the function”…””}”(hj§hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K)hhäubh¸)”}”(hŒ- ib_dispatch_event ”h]”hû)”}”(hhh]”j)”}”(hŒib_dispatch_event ”h]”h¾)”}”(hŒib_dispatch_event”h]”hŒib_dispatch_event”…””}”(hjÀhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K+hj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÿhj¹ubah}”(h]”h ]”h"]”h$]”h&]”jÀjÁuh1húhŸh¶h K+hjµubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K+hhäubh¾)”}”(hŒuused by low-level drivers to dispatch asynchronous events through the midlayer is also safe to call from any context.”h]”hŒuused by low-level drivers to dispatch asynchronous events through the midlayer is also safe to call from any context.”…””}”(hjàhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K-hhäubeh}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K hhÓhžhubh¢)”}”(hhh]”(h§)”}”(hŒ Reentrancy”h]”hŒ Reentrancy”…””}”(hj÷hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjôhžhhŸh¶h K1ubh¸)”}”(hXßAll of the methods in struct ib_device exported by a low-level driver must be fully reentrant. The low-level driver is required to perform all synchronization necessary to maintain consistency, even if multiple function calls using the same object are run simultaneously. The IB midlayer does not perform any serialization of function calls. Because low-level drivers are reentrant, upper level protocol consumers are not required to perform any serialization. However, some serialization may be required to get sensible results. For example, a consumer may safely call ib_poll_cq() on multiple CPUs simultaneously. However, the ordering of the work completion information between different calls of ib_poll_cq() is not defined. ”h]”(h¾)”}”(hXAll of the methods in struct ib_device exported by a low-level driver must be fully reentrant. The low-level driver is required to perform all synchronization necessary to maintain consistency, even if multiple function calls using the same object are run simultaneously.”h]”hXAll of the methods in struct ib_device exported by a low-level driver must be fully reentrant. The low-level driver is required to perform all synchronization necessary to maintain consistency, even if multiple function calls using the same object are run simultaneously.”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K3hjubh¾)”}”(hŒEThe IB midlayer does not perform any serialization of function calls.”h]”hŒEThe IB midlayer does not perform any serialization of function calls.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K9hjubh¾)”}”(hX…Because low-level drivers are reentrant, upper level protocol consumers are not required to perform any serialization. However, some serialization may be required to get sensible results. For example, a consumer may safely call ib_poll_cq() on multiple CPUs simultaneously. However, the ordering of the work completion information between different calls of ib_poll_cq() is not defined.”h]”hX…Because low-level drivers are reentrant, upper level protocol consumers are not required to perform any serialization. However, some serialization may be required to get sensible results. For example, a consumer may safely call ib_poll_cq() on multiple CPUs simultaneously. However, the ordering of the work completion information between different calls of ib_poll_cq() is not defined.”…””}”(hj%hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K;hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K3hjôhžhubeh}”(h]”Œ reentrancy”ah ]”h"]”Œ reentrancy”ah$]”h&]”uh1h¡hhÓhžhhŸh¶h K1ubh¢)”}”(hhh]”(h§)”}”(hŒ Callbacks”h]”hŒ Callbacks”…””}”(hjDhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjAhžhhŸh¶h KCubh¸)”}”(hXA low-level driver must not perform a callback directly from the same callchain as an ib_device method call. For example, it is not allowed for a low-level driver to call a consumer's completion event handler directly from its post_send method. Instead, the low-level driver should defer this callback by, for example, scheduling a tasklet to perform the callback. The low-level driver is responsible for ensuring that multiple completion event handlers for the same CQ are not called simultaneously. The driver must guarantee that only one CQ event handler for a given CQ is running at a time. In other words, the following situation is not allowed:: CPU1 CPU2 low-level driver -> consumer CQ event callback: /* ... */ ib_req_notify_cq(cq, ...); low-level driver -> /* ... */ consumer CQ event callback: /* ... */ return from CQ event handler The context in which completion event and asynchronous event callbacks run is not defined. Depending on the low-level driver, it may be process context, softirq context, or interrupt context. Upper level protocol consumers may not sleep in a callback. ”h]”(h¾)”}”(hXnA low-level driver must not perform a callback directly from the same callchain as an ib_device method call. For example, it is not allowed for a low-level driver to call a consumer's completion event handler directly from its post_send method. Instead, the low-level driver should defer this callback by, for example, scheduling a tasklet to perform the callback.”h]”hXpA low-level driver must not perform a callback directly from the same callchain as an ib_device method call. For example, it is not allowed for a low-level driver to call a consumer’s completion event handler directly from its post_send method. Instead, the low-level driver should defer this callback by, for example, scheduling a tasklet to perform the callback.”…””}”(hjVhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h KEhjRubh¾)”}”(hX The low-level driver is responsible for ensuring that multiple completion event handlers for the same CQ are not called simultaneously. The driver must guarantee that only one CQ event handler for a given CQ is running at a time. In other words, the following situation is not allowed::”h]”hXThe low-level driver is responsible for ensuring that multiple completion event handlers for the same CQ are not called simultaneously. The driver must guarantee that only one CQ event handler for a given CQ is running at a time. In other words, the following situation is not allowed:”…””}”(hjdhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h KLhjRubhŒ literal_block”“”)”}”(hXe CPU1 CPU2 low-level driver -> consumer CQ event callback: /* ... */ ib_req_notify_cq(cq, ...); low-level driver -> /* ... */ consumer CQ event callback: /* ... */ return from CQ event handler”h]”hXe CPU1 CPU2 low-level driver -> consumer CQ event callback: /* ... */ ib_req_notify_cq(cq, ...); low-level driver -> /* ... */ consumer CQ event callback: /* ... */ return from CQ event handler”…””}”hjtsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jrhŸh¶h KRhjRubh¾)”}”(hŒüThe context in which completion event and asynchronous event callbacks run is not defined. Depending on the low-level driver, it may be process context, softirq context, or interrupt context. Upper level protocol consumers may not sleep in a callback.”h]”hŒüThe context in which completion event and asynchronous event callbacks run is not defined. Depending on the low-level driver, it may be process context, softirq context, or interrupt context. Upper level protocol consumers may not sleep in a callback.”…””}”(hj„hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h K]hjRubeh}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KEhjAhžhubeh}”(h]”Œ callbacks”ah ]”h"]”Œ callbacks”ah$]”h&]”uh1h¡hhÓhžhhŸh¶h KCubh¢)”}”(hhh]”(h§)”}”(hŒHot-plug”h]”hŒHot-plug”…””}”(hj£hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hj hžhhŸh¶h Kcubh¸)”}”(hX#A low-level driver announces that a device is ready for use by consumers when it calls ib_register_device(), all initialization must be complete before this call. The device must remain usable until the driver's call to ib_unregister_device() has returned. A low-level driver must call ib_register_device() and ib_unregister_device() from process context. It must not hold any semaphores that could cause deadlock if a consumer calls back into the driver across these calls. An upper level protocol consumer may begin using an IB device as soon as the add method of its struct ib_client is called for that device. A consumer must finish all cleanup and free all resources relating to a device before returning from the remove method. A consumer is permitted to sleep in its add and remove methods.”h]”(h¾)”}”(hXA low-level driver announces that a device is ready for use by consumers when it calls ib_register_device(), all initialization must be complete before this call. The device must remain usable until the driver's call to ib_unregister_device() has returned.”h]”hXA low-level driver announces that a device is ready for use by consumers when it calls ib_register_device(), all initialization must be complete before this call. The device must remain usable until the driver’s call to ib_unregister_device() has returned.”…””}”(hjµhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Kehj±ubh¾)”}”(hŒÚA low-level driver must call ib_register_device() and ib_unregister_device() from process context. It must not hold any semaphores that could cause deadlock if a consumer calls back into the driver across these calls.”h]”hŒÚA low-level driver must call ib_register_device() and ib_unregister_device() from process context. It must not hold any semaphores that could cause deadlock if a consumer calls back into the driver across these calls.”…””}”(hjÃhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Kjhj±ubh¾)”}”(hXAn upper level protocol consumer may begin using an IB device as soon as the add method of its struct ib_client is called for that device. A consumer must finish all cleanup and free all resources relating to a device before returning from the remove method.”h]”hXAn upper level protocol consumer may begin using an IB device as soon as the add method of its struct ib_client is called for that device. A consumer must finish all cleanup and free all resources relating to a device before returning from the remove method.”…””}”(hjÑhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Kohj±ubh¾)”}”(hŒ?A consumer is permitted to sleep in its add and remove methods.”h]”hŒ?A consumer is permitted to sleep in its add and remove methods.”…””}”(hjßhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h½hŸh¶h Kthj±ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Kehj hžhubeh}”(h]”Œhot-plug”ah ]”h"]”Œhot-plug”ah$]”h&]”uh1h¡hhÓhžhhŸh¶h Kcubeh}”(h]”Œsleeping-and-interrupt-context”ah ]”h"]”Œsleeping and interrupt context”ah$]”h&]”uh1h¡hh£hžhhŸh¶h K ubeh}”(h]”Œinfiniband-midlayer-locking”ah ]”h"]”Œinfiniband midlayer locking”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”}”(jjjjýj>j;jjšjøjõuŒ nametypes”}”(j‰j‰j>‰j‰jø‰uh}”(jh£jýhÓj;jôjšjAjõ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.