aesphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget)/translations/zh_CN/virt/kvm/halt-pollingmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/zh_TW/virt/kvm/halt-pollingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/it_IT/virt/kvm/halt-pollingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/ja_JP/virt/kvm/halt-pollingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/ko_KR/virt/kvm/halt-pollingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget)/translations/sp_SP/virt/kvm/halt-pollingmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhC/var/lib/git/docbuild/linux/Documentation/virt/kvm/halt-polling.rsthKubhsection)}(hhh](htitle)}(hThe KVM halt polling systemh]hThe KVM halt polling system}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hXThe KVM halt polling system provides a feature within KVM whereby the latency of a guest can, under some circumstances, be reduced by polling in the host for some time period after the guest has elected to no longer run by cedeing. That is, when a guest vcpu has ceded, or in the case of powerpc when all of the vcpus of a single vcore have ceded, the host kernel polls for wakeup conditions before giving up the cpu to the scheduler in order to let something else run.h]hXThe KVM halt polling system provides a feature within KVM whereby the latency of a guest can, under some circumstances, be reduced by polling in the host for some time period after the guest has elected to no longer run by cedeing. That is, when a guest vcpu has ceded, or in the case of powerpc when all of the vcpus of a single vcore have ceded, the host kernel polls for wakeup conditions before giving up the cpu to the scheduler in order to let something else run.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXMPolling provides a latency advantage in cases where the guest can be run again very quickly by at least saving us a trip through the scheduler, normally on the order of a few micro-seconds, although performance benefits are workload dependent. In the event that no wakeup source arrives during the polling interval or some other task on the runqueue is runnable the scheduler is invoked. Thus halt polling is especially useful on workloads with very short wakeup periods where the time spent halt polling is minimised and the time savings of not invoking the scheduler are distinguishable.h]hXMPolling provides a latency advantage in cases where the guest can be run again very quickly by at least saving us a trip through the scheduler, normally on the order of a few micro-seconds, although performance benefits are workload dependent. In the event that no wakeup source arrives during the polling interval or some other task on the runqueue is runnable the scheduler is invoked. Thus halt polling is especially useful on workloads with very short wakeup periods where the time spent halt polling is minimised and the time savings of not invoking the scheduler are distinguishable.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h0The generic halt polling code is implemented in:h]h0The generic halt polling code is implemented in:}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh block_quote)}(h&virt/kvm/kvm_main.c: kvm_vcpu_block() h]h)}(h%virt/kvm/kvm_main.c: kvm_vcpu_block()h]h%virt/kvm/kvm_main.c: kvm_vcpu_block()}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h3The powerpc kvm-hv specific case is implemented in:h]h3The powerpc kvm-hv specific case is implemented in:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h5arch/powerpc/kvm/book3s_hv.c: kvmppc_vcore_blocked() h]h)}(h4arch/powerpc/kvm/book3s_hv.c: kvmppc_vcore_blocked()h]h4arch/powerpc/kvm/book3s_hv.c: kvmppc_vcore_blocked()}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hHalt Polling Intervalh]hHalt Polling Interval}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hhhhhK ubh)}(hXThe maximum time for which to poll before invoking the scheduler, referred to as the halt polling interval, is increased and decreased based on the perceived effectiveness of the polling in an attempt to limit pointless polling. This value is stored in either the vcpu struct:h]hXThe maximum time for which to poll before invoking the scheduler, referred to as the halt polling interval, is increased and decreased based on the perceived effectiveness of the polling in an attempt to limit pointless polling. This value is stored in either the vcpu struct:}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK"hj5hhubh)}(hkvm_vcpu->halt_poll_ns h]h)}(hkvm_vcpu->halt_poll_nsh]hkvm_vcpu->halt_poll_ns}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK'hjTubah}(h]h ]h"]h$]h&]uh1hhhhK'hj5hhubh)}(h6or in the case of powerpc kvm-hv, in the vcore struct:h]h6or in the case of powerpc kvm-hv, in the vcore struct:}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hj5hhubh)}(hkvmppc_vcore->halt_poll_ns h]h)}(hkvmppc_vcore->halt_poll_nsh]hkvmppc_vcore->halt_poll_ns}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hjzubah}(h]h ]h"]h$]h&]uh1hhhhK+hj5hhubh)}(h)Thus this is a per vcpu (or vcore) value.h]h)Thus this is a per vcpu (or vcore) value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hj5hhubh)}(hXDuring polling if a wakeup source is received within the halt polling interval, the interval is left unchanged. In the event that a wakeup source isn't received during the polling interval (and thus schedule is invoked) there are two options, either the polling interval and total block time[0] were less than the global max polling interval (see module params below), or the total block time was greater than the global max polling interval.h]hXDuring polling if a wakeup source is received within the halt polling interval, the interval is left unchanged. In the event that a wakeup source isn’t received during the polling interval (and thus schedule is invoked) there are two options, either the polling interval and total block time[0] were less than the global max polling interval (see module params below), or the total block time was greater than the global max polling interval.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hj5hhubh)}(hXIn the event that both the polling interval and total block time were less than the global max polling interval then the polling interval can be increased in the hope that next time during the longer polling interval the wake up source will be received while the host is polling and the latency benefits will be received. The polling interval is grown in the function grow_halt_poll_ns() and is multiplied by the module parameters halt_poll_ns_grow and halt_poll_ns_grow_start.h]hXIn the event that both the polling interval and total block time were less than the global max polling interval then the polling interval can be increased in the hope that next time during the longer polling interval the wake up source will be received while the host is polling and the latency benefits will be received. The polling interval is grown in the function grow_halt_poll_ns() and is multiplied by the module parameters halt_poll_ns_grow and halt_poll_ns_grow_start.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hj5hhubh)}(hXIn the event that the total block time was greater than the global max polling interval then the host will never poll for long enough (limited by the global max) to wakeup during the polling interval so it may as well be shrunk in order to avoid pointless polling. The polling interval is shrunk in the function shrink_halt_poll_ns() and is divided by the module parameter halt_poll_ns_shrink, or set to 0 iff halt_poll_ns_shrink == 0.h]hXIn the event that the total block time was greater than the global max polling interval then the host will never poll for long enough (limited by the global max) to wakeup during the polling interval so it may as well be shrunk in order to avoid pointless polling. The polling interval is shrunk in the function shrink_halt_poll_ns() and is divided by the module parameter halt_poll_ns_shrink, or set to 0 iff halt_poll_ns_shrink == 0.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK>hj5hhubh)}(hX It is worth noting that this adjustment process attempts to hone in on some steady state polling interval but will only really do a good job for wakeups which come at an approximately constant rate, otherwise there will be constant adjustment of the polling interval.h]hX It is worth noting that this adjustment process attempts to hone in on some steady state polling interval but will only really do a good job for wakeups which come at an approximately constant rate, otherwise there will be constant adjustment of the polling interval.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhj5hhubhdefinition_list)}(hhh]hdefinition_list_item)}(h[0] total block time: the time between when the halt polling function is invoked and a wakeup source received (irrespective of whether the scheduler is invoked within that function). h](hterm)}(h[0] total block time:h]h[0] total block time:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKMhjubh definition)}(hhh]h)}(hthe time between when the halt polling function is invoked and a wakeup source received (irrespective of whether the scheduler is invoked within that function).h]hthe time between when the halt polling function is invoked and a wakeup source received (irrespective of whether the scheduler is invoked within that function).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKMhjubah}(h]h ]h"]h$]h&]uh1jhj5hhhhhNubeh}(h]halt-polling-intervalah ]h"]halt polling intervalah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hModule Parametersh]hModule Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKPubh)}(hXbThe kvm module has 4 tunable module parameters to adjust the global max polling interval, the initial value (to grow from 0), and the rate at which the polling interval is grown and shrunk. These variables are defined in include/linux/kvm_host.h and as module parameters in virt/kvm/kvm_main.c, or arch/powerpc/kvm/book3s_hv.c in the powerpc kvm-hv case.h]hXbThe kvm module has 4 tunable module parameters to adjust the global max polling interval, the initial value (to grow from 0), and the rate at which the polling interval is grown and shrunk. These variables are defined in include/linux/kvm_host.h and as module parameters in virt/kvm/kvm_main.c, or arch/powerpc/kvm/book3s_hv.c in the powerpc kvm-hv case.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhj hhubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jIhjFubjJ)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jIhjFubjJ)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jIhjFubhtbody)}(hhh](hrow)}(hhh](hentry)}(hhh]h)}(hModule Parameterh]hModule Parameter}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKYhjuubah}(h]h ]h"]h$]h&]uh1jshjpubjt)}(hhh]h)}(h Descriptionh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKYhjubah}(h]h ]h"]h$]h&]uh1jshjpubjt)}(hhh]h)}(h Default Valueh]h Default Value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKYhjubah}(h]h ]h"]h$]h&]uh1jshjpubeh}(h]h ]h"]h$]h&]uh1jnhjkubjo)}(hhh](jt)}(hhh]h)}(h halt_poll_nsh]h halt_poll_ns}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjubah}(h]h ]h"]h$]h&]uh1jshjubjt)}(hhh]h)}(hfThe global max polling interval which defines the ceiling value of the polling interval for each vcpu.h]hfThe global max polling interval which defines the ceiling value of the polling interval for each vcpu.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjubah}(h]h ]h"]h$]h&]uh1jshjubjt)}(hhh](h)}(hKVM_HALT_POLL_NS_DEFAULTh]hKVM_HALT_POLL_NS_DEFAULT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjubh)}(h(per arch value)h]h(per arch value)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK^hjubeh}(h]h ]h"]h$]h&]uh1jshjubeh}(h]h ]h"]h$]h&]uh1jnhjkubjo)}(hhh](jt)}(hhh]h)}(hhalt_poll_ns_growh]hhalt_poll_ns_grow}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahjubah}(h]h ]h"]h$]h&]uh1jshjubjt)}(hhh]h)}(h_The value by which the halt polling interval is multiplied in the grow_halt_poll_ns() function.h]h_The value by which the halt polling interval is multiplied in the grow_halt_poll_ns() function.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahj6ubah}(h]h ]h"]h$]h&]uh1jshjubjt)}(hhh]h)}(h2h]h2}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahjMubah}(h]h ]h"]h$]h&]uh1jshjubeh}(h]h ]h"]h$]h&]uh1jnhjkubjo)}(hhh](jt)}(hhh]h)}(hhalt_poll_ns_grow_starth]hhalt_poll_ns_grow_start}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKghjmubah}(h]h ]h"]h$]h&]uh1jshjjubjt)}(hhh]h)}(hKThe initial value to grow to from zero in the grow_halt_poll_ns() function.h]hKThe initial value to grow to from zero in the grow_halt_poll_ns() function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKghjubah}(h]h ]h"]h$]h&]uh1jshjjubjt)}(hhh]h)}(h10000h]h10000}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKghjubah}(h]h ]h"]h$]h&]uh1jshjjubeh}(h]h ]h"]h$]h&]uh1jnhjkubjo)}(hhh](jt)}(hhh]h)}(hhalt_poll_ns_shrinkh]hhalt_poll_ns_shrink}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKlhjubah}(h]h ]h"]h$]h&]uh1jshjubjt)}(hhh]h)}(h^The value by which the halt polling interval is divided in the shrink_halt_poll_ns() function.h]h^The value by which the halt polling interval is divided in the shrink_halt_poll_ns() function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKlhjubah}(h]h ]h"]h$]h&]uh1jshjubjt)}(hhh]h)}(hjRh]h2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKlhjubah}(h]h ]h"]h$]h&]uh1jshjubeh}(h]h ]h"]h$]h&]uh1jnhjkubeh}(h]h ]h"]h$]h&]uh1jihjFubeh}(h]h ]h"]h$]h&]colsKuh1jDhjAubah}(h]h ]h"]h$]h&]uh1j?hj hhhhhNubh)}(h;These module parameters can be set from the sysfs files in:h]h;These module parameters can be set from the sysfs files in:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKshj hhubh)}(h/sys/module/kvm/parameters/ h]h)}(h/sys/module/kvm/parameters/h]h/sys/module/kvm/parameters/}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKuhj&ubah}(h]h ]h"]h$]h&]uh1hhhhKuhj hhubj)}(hhh]j)}(heNote: these module parameters are system-wide values and are not able to be tuned on a per vm basis. h](j)}(hHNote: these module parameters are system-wide values and are not able toh]hHNote: these module parameters are system-wide values and are not able to}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKxhjAubj)}(hhh]h)}(hbe tuned on a per vm basis.h]hbe tuned on a per vm basis.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKxhjSubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhhhKxhj>ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubh)}(hAny changes to these parameters will be picked up by new and existing vCPUs the next time they halt, with the notable exception of VMs using KVM_CAP_HALT_POLL (see next section).h]hAny changes to these parameters will be picked up by new and existing vCPUs the next time they halt, with the notable exception of VMs using KVM_CAP_HALT_POLL (see next section).}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKzhj hhubeh}(h]module-parametersah ]h"]module parametersah$]h&]uh1hhhhhhhhKPubh)}(hhh](h)}(hKVM_CAP_HALT_POLLh]hKVM_CAP_HALT_POLL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hKVM_CAP_HALT_POLL is a VM capability that allows userspace to override halt_poll_ns on a per-VM basis. VMs using KVM_CAP_HALT_POLL ignore halt_poll_ns completely (but still obey halt_poll_ns_grow, halt_poll_ns_grow_start, and halt_poll_ns_shrink).h]hKVM_CAP_HALT_POLL is a VM capability that allows userspace to override halt_poll_ns on a per-VM basis. VMs using KVM_CAP_HALT_POLL ignore halt_poll_ns completely (but still obey halt_poll_ns_grow, halt_poll_ns_grow_start, and halt_poll_ns_shrink).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hKSee Documentation/virt/kvm/api.rst for more information on this capability.h]hKSee Documentation/virt/kvm/api.rst for more information on this capability.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]kvm-cap-halt-pollah ]h"]kvm_cap_halt_pollah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Further Notesh]h Further Notes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh bullet_list)}(hhh](h list_item)}(hXCare should be taken when setting the halt_poll_ns module parameter as a large value has the potential to drive the cpu usage to 100% on a machine which would be almost entirely idle otherwise. This is because even if a guest has wakeups during which very little work is done and which are quite far apart, if the period is shorter than the global max polling interval (halt_poll_ns) then the host will always poll for the entire block time and thus cpu utilisation will go to 100%. h]h)}(hXCare should be taken when setting the halt_poll_ns module parameter as a large value has the potential to drive the cpu usage to 100% on a machine which would be almost entirely idle otherwise. This is because even if a guest has wakeups during which very little work is done and which are quite far apart, if the period is shorter than the global max polling interval (halt_poll_ns) then the host will always poll for the entire block time and thus cpu utilisation will go to 100%.h]hXCare should be taken when setting the halt_poll_ns module parameter as a large value has the potential to drive the cpu usage to 100% on a machine which would be almost entirely idle otherwise. This is because even if a guest has wakeups during which very little work is done and which are quite far apart, if the period is shorter than the global max polling interval (halt_poll_ns) then the host will always poll for the entire block time and thus cpu utilisation will go to 100%.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hX Halt polling essentially presents a trade-off between power usage and latency and the module parameters should be used to tune the affinity for this. Idle cpu time is essentially converted to host kernel time with the aim of decreasing latency when entering the guest. h]h)}(hX Halt polling essentially presents a trade-off between power usage and latency and the module parameters should be used to tune the affinity for this. Idle cpu time is essentially converted to host kernel time with the aim of decreasing latency when entering the guest.h]hX Halt polling essentially presents a trade-off between power usage and latency and the module parameters should be used to tune the affinity for this. Idle cpu time is essentially converted to host kernel time with the aim of decreasing latency when entering the guest.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXHalt polling will only be conducted by the host when no other tasks are runnable on that cpu, otherwise the polling will cease immediately and schedule will be invoked to allow that other task to run. Thus this doesn't allow a guest to cause denial of service of the cpu.h]h)}(hXHalt polling will only be conducted by the host when no other tasks are runnable on that cpu, otherwise the polling will cease immediately and schedule will be invoked to allow that other task to run. Thus this doesn't allow a guest to cause denial of service of the cpu.h]hXHalt polling will only be conducted by the host when no other tasks are runnable on that cpu, otherwise the polling will cease immediately and schedule will be invoked to allow that other task to run. Thus this doesn’t allow a guest to cause denial of service of the cpu.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhKhjhhubeh}(h] further-notesah ]h"] further notesah$]h&]uh1hhhhhhhhKubeh}(h]the-kvm-halt-polling-systemah ]h"]the kvm halt polling systemah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksjsfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj[error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(j6j3jjjjjjj.j+u nametypes}(j6jjjj.uh}(j3hjj5jj jjj+ju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.