€• Œ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/dev-tools/kfence”Œ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/dev-tools/kfence”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/it_IT/dev-tools/kfence”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ja_JP/dev-tools/kfence”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ko_KR/dev-tools/kfence”Œ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/dev-tools/kfence”Œ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/dev-tools/kfence”Œ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/dev-tools/kfence.rst”h´Kubh¶)�”}”(hŒCopyright (C) 2020, Google LLC.”h]”hŒCopyright (C) 2020, Google LLC.”…”�”}”hhÈsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhhh²hh³hÇh´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒKernel Electric-Fence (KFENCE)”h]”hŒKernel Electric-Fence (KFENCE)”…”�”}”(hhÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhhØh²hh³hÇh´KubhŒ paragraph”“”)�”}”(hŒ°Kernel Electric-Fence (KFENCE) is a low-overhead sampling-based memory safety error detector. KFENCE detects heap out-of-bounds access, use-after-free, and invalid-free errors.”h]”hŒ°Kernel Electric-Fence (KFENCE) is a low-overhead sampling-based memory safety error detector. KFENCE detects heap out-of-bounds access, use-after-free, and invalid-free errors.”…”�”}”(hhíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KhhØh²hubhì)�”}”(hX¾KFENCE is designed to be enabled in production kernels, and has near zero performance overhead. Compared to KASAN, KFENCE trades performance for precision. The main motivation behind KFENCE's design, is that with enough total uptime KFENCE will detect bugs in code paths not typically exercised by non-production test workloads. One way to quickly achieve a large enough total uptime is when the tool is deployed across a large fleet of machines.”h]”hXÀKFENCE is designed to be enabled in production kernels, and has near zero performance overhead. Compared to KASAN, KFENCE trades performance for precision. The main motivation behind KFENCE’s design, is that with enough total uptime KFENCE will detect bugs in code paths not typically exercised by non-production test workloads. One way to quickly achieve a large enough total uptime is when the tool is deployed across a large fleet of machines.”…”�”}”(hhûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´K hhØh²hubh×)�”}”(hhh]”(hÜ)�”}”(hŒUsage”h]”hŒUsage”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj h²hh³hÇh´Kubhì)�”}”(hŒ-To enable KFENCE, configure the kernel with::”h]”hŒ,To enable KFENCE, configure the kernel with:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´Khj h²hubhŒ literal_block”“”)�”}”(hŒCONFIG_KFENCE=y”h]”hŒCONFIG_KFENCE=y”…”�”}”hj*sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j(h³hÇh´Khj h²hubhì)�”}”(hŒ™To build a kernel with KFENCE support, but disabled by default (to enable, set ``kfence.sample_interval`` to non-zero value), configure the kernel with::”h]”(hŒOTo build a kernel with KFENCE support, but disabled by default (to enable, set ”…”�”}”(hj8h²hh³Nh´NubhŒliteral”“”)�”}”(hŒ``kfence.sample_interval``”h]”hŒkfence.sample_interval”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj8ubhŒ/ to non-zero value), configure the kernel with:”…”�”}”(hj8h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´Khj h²hubj))�”}”(hŒ/CONFIG_KFENCE=y CONFIG_KFENCE_SAMPLE_INTERVAL=0”h]”hŒ/CONFIG_KFENCE=y CONFIG_KFENCE_SAMPLE_INTERVAL=0”…”�”}”hjZsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j(h³hÇh´Khj h²hubhì)�”}”(hŒ’KFENCE provides several other configuration options to customize behaviour (see the respective help text in ``lib/Kconfig.kfence`` for more info).”h]”(hŒlKFENCE provides several other configuration options to customize behaviour (see the respective help text in ”…”�”}”(hjhh²hh³Nh´NubjA)�”}”(hŒ``lib/Kconfig.kfence``”h]”hŒlib/Kconfig.kfence”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjhubhŒ for more info).”…”�”}”(hjhh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´Khj h²hubh×)�”}”(hhh]”(hÜ)�”}”(hŒTuning performance”h]”hŒTuning performance”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjˆh²hh³hÇh´K#ubhì)�”}”(hX„The most important parameter is KFENCE's sample interval, which can be set via the kernel boot parameter ``kfence.sample_interval`` in milliseconds. The sample interval determines the frequency with which heap allocations will be guarded by KFENCE. The default is configurable via the Kconfig option ``CONFIG_KFENCE_SAMPLE_INTERVAL``. Setting ``kfence.sample_interval=0`` disables KFENCE.”h]”(hŒkThe most important parameter is KFENCE’s sample interval, which can be set via the kernel boot parameter ”…”�”}”(hj™h²hh³Nh´NubjA)�”}”(hŒ``kfence.sample_interval``”h]”hŒkfence.sample_interval”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj™ubhŒ© in milliseconds. The sample interval determines the frequency with which heap allocations will be guarded by KFENCE. The default is configurable via the Kconfig option ”…”�”}”(hj™h²hh³Nh´NubjA)�”}”(hŒ!``CONFIG_KFENCE_SAMPLE_INTERVAL``”h]”hŒCONFIG_KFENCE_SAMPLE_INTERVAL”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj™ubhŒ . Setting ”…”�”}”(hj™h²hh³Nh´NubjA)�”}”(hŒ``kfence.sample_interval=0``”h]”hŒkfence.sample_interval=0”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj™ubhŒ disables KFENCE.”…”�”}”(hj™h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´K%hjˆh²hubhì)�”}”(hX The sample interval controls a timer that sets up KFENCE allocations. By default, to keep the real sample interval predictable, the normal timer also causes CPU wake-ups when the system is completely idle. This may be undesirable on power-constrained systems. The boot parameter ``kfence.deferrable=1`` instead switches to a "deferrable" timer which does not force CPU wake-ups on idle systems, at the risk of unpredictable sample intervals. The default is configurable via the Kconfig option ``CONFIG_KFENCE_DEFERRABLE``.”h]”(hXThe sample interval controls a timer that sets up KFENCE allocations. By default, to keep the real sample interval predictable, the normal timer also causes CPU wake-ups when the system is completely idle. This may be undesirable on power-constrained systems. The boot parameter ”…”�”}”(hjÝh²hh³Nh´NubjA)�”}”(hŒ``kfence.deferrable=1``”h]”hŒkfence.deferrable=1”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjÝubhŒÃ instead switches to a “deferrableâ€� timer which does not force CPU wake-ups on idle systems, at the risk of unpredictable sample intervals. The default is configurable via the Kconfig option ”…”�”}”(hjÝh²hh³Nh´NubjA)�”}”(hŒ``CONFIG_KFENCE_DEFERRABLE``”h]”hŒCONFIG_KFENCE_DEFERRABLE”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjÝubhŒ.”…”�”}”(hjÝh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´K,hjˆh²hubhŒwarning”“”)�”}”(hŒˆThe KUnit test suite is very likely to fail when using a deferrable timer since it currently causes very unpredictable sample intervals.”h]”hì)�”}”(hŒˆThe KUnit test suite is very likely to fail when using a deferrable timer since it currently causes very unpredictable sample intervals.”h]”hŒˆThe KUnit test suite is very likely to fail when using a deferrable timer since it currently causes very unpredictable sample intervals.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´K5hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjˆh²hh³hÇh´Nubhì)�”}”(hXªBy default KFENCE will only sample 1 heap allocation within each sample interval. *Burst mode* allows to sample successive heap allocations, where the kernel boot parameter ``kfence.burst`` can be set to a non-zero value which denotes the *additional* successive allocations within a sample interval; setting ``kfence.burst=N`` means that ``1 + N`` successive allocations are attempted through KFENCE for each sample interval.”h]”(hŒRBy default KFENCE will only sample 1 heap allocation within each sample interval. ”…”�”}”(hj)h²hh³Nh´NubhŒemphasis”“”)�”}”(hŒ *Burst mode*”h]”hŒ Burst mode”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj)ubhŒO allows to sample successive heap allocations, where the kernel boot parameter ”…”�”}”(hj)h²hh³Nh´NubjA)�”}”(hŒ``kfence.burst``”h]”hŒ kfence.burst”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj)ubhŒ2 can be set to a non-zero value which denotes the ”…”�”}”(hj)h²hh³Nh´Nubj2)�”}”(hŒ *additional*”h]”hŒ additional”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj)ubhŒ: successive allocations within a sample interval; setting ”…”�”}”(hj)h²hh³Nh´NubjA)�”}”(hŒ``kfence.burst=N``”h]”hŒkfence.burst=N”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj)ubhŒ means that ”…”�”}”(hj)h²hh³Nh´NubjA)�”}”(hŒ ``1 + N``”h]”hŒ1 + N”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj)ubhŒN successive allocations are attempted through KFENCE for each sample interval.”…”�”}”(hj)h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´K8hjˆh²hubhì)�”}”(hX©The KFENCE memory pool is of fixed size, and if the pool is exhausted, no further KFENCE allocations occur. With ``CONFIG_KFENCE_NUM_OBJECTS`` (default 255), the number of available guarded objects can be controlled. Each object requires 2 pages, one for the object itself and the other one used as a guard page; object pages are interleaved with guard pages, and every object page is therefore surrounded by two guard pages.”h]”(hŒqThe KFENCE memory pool is of fixed size, and if the pool is exhausted, no further KFENCE allocations occur. With ”…”�”}”(hj“h²hh³Nh´NubjA)�”}”(hŒ``CONFIG_KFENCE_NUM_OBJECTS``”h]”hŒCONFIG_KFENCE_NUM_OBJECTS”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj“ubhX (default 255), the number of available guarded objects can be controlled. Each object requires 2 pages, one for the object itself and the other one used as a guard page; object pages are interleaved with guard pages, and every object page is therefore surrounded by two guard pages.”…”�”}”(hj“h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´K?hjˆh²hubhì)�”}”(hŒIThe total memory dedicated to the KFENCE memory pool can be computed as::”h]”hŒHThe total memory dedicated to the KFENCE memory pool can be computed as:”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KFhjˆh²hubj))�”}”(hŒ ( #objects + 1 ) * 2 * PAGE_SIZE”h]”hŒ ( #objects + 1 ) * 2 * PAGE_SIZE”…”�”}”hjÁsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j(h³hÇh´KHhjˆh²hubhì)�”}”(hŒsUsing the default config, and assuming a page size of 4 KiB, results in dedicating 2 MiB to the KFENCE memory pool.”h]”hŒsUsing the default config, and assuming a page size of 4 KiB, results in dedicating 2 MiB to the KFENCE memory pool.”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KJhjˆh²hubhì)�”}”(hŒ²Note: On architectures that support huge pages, KFENCE will ensure that the pool is using pages of size ``PAGE_SIZE``. This will result in additional page tables being allocated.”h]”(hŒhNote: On architectures that support huge pages, KFENCE will ensure that the pool is using pages of size ”…”�”}”(hjÝh²hh³Nh´NubjA)�”}”(hŒ ``PAGE_SIZE``”h]”hŒ PAGE_SIZE”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjÝubhŒ=. This will result in additional page tables being allocated.”…”�”}”(hjÝh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KMhjˆh²hubeh}”(h]”Œtuning-performance”ah ]”h"]”Œtuning performance”ah$]”h&]”uh1hÖhj h²hh³hÇh´K#ubh×)�”}”(hhh]”(hÜ)�”}”(hŒ Error reports”h]”hŒ Error reports”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjh²hh³hÇh´KRubhì)�”}”(hŒhThe boot parameter ``kfence.fault`` can be used to control the behavior when a KFENCE error is detected:”h]”(hŒThe boot parameter ”…”�”}”(hjh²hh³Nh´NubjA)�”}”(hŒ``kfence.fault``”h]”hŒ kfence.fault”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjubhŒE can be used to control the behavior when a KFENCE error is detected:”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KThjh²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒG``kfence.fault=report``: Print the error report and continue (default).”h]”hì)�”}”(hj?h]”(jA)�”}”(hŒ``kfence.fault=report``”h]”hŒkfence.fault=report”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjAubhŒ0: Print the error report and continue (default).”…”�”}”(hjAh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KWhj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hj8h²hh³hÇh´Nubj<)�”}”(hŒ7``kfence.fault=oops``: Print the error report and oops.”h]”hì)�”}”(hjdh]”(jA)�”}”(hŒ``kfence.fault=oops``”h]”hŒkfence.fault=oops”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjfubhŒ": Print the error report and oops.”…”�”}”(hjfh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KXhjbubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hj8h²hh³hÇh´Nubj<)�”}”(hŒ:``kfence.fault=panic``: Print the error report and panic. ”h]”hì)�”}”(hŒ9``kfence.fault=panic``: Print the error report and panic.”h]”(jA)�”}”(hŒ``kfence.fault=panic``”h]”hŒkfence.fault=panic”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj‹ubhŒ#: Print the error report and panic.”…”�”}”(hj‹h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KYhj‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hj8h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j6h³hÇh´KWhjh²hubhì)�”}”(hŒ0A typical out-of-bounds access looks like this::”h]”hŒ/A typical out-of-bounds access looks like this:”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´K[hjh²hubj))�”}”(hXp================================================================== BUG: KFENCE: out-of-bounds read in test_out_of_bounds_read+0xa6/0x234 Out-of-bounds read at 0xffff8c3f2e291fff (1B left of kfence-#72): test_out_of_bounds_read+0xa6/0x234 kunit_try_run_case+0x61/0xa0 kunit_generic_run_threadfn_adapter+0x16/0x30 kthread+0x176/0x1b0 ret_from_fork+0x22/0x30 kfence-#72: 0xffff8c3f2e292000-0xffff8c3f2e29201f, size=32, cache=kmalloc-32 allocated by task 484 on cpu 0 at 32.919330s: test_alloc+0xfe/0x738 test_out_of_bounds_read+0x9b/0x234 kunit_try_run_case+0x61/0xa0 kunit_generic_run_threadfn_adapter+0x16/0x30 kthread+0x176/0x1b0 ret_from_fork+0x22/0x30 CPU: 0 PID: 484 Comm: kunit_try_catch Not tainted 5.13.0-rc3+ #7 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014 ==================================================================”h]”hXp================================================================== BUG: KFENCE: out-of-bounds read in test_out_of_bounds_read+0xa6/0x234 Out-of-bounds read at 0xffff8c3f2e291fff (1B left of kfence-#72): test_out_of_bounds_read+0xa6/0x234 kunit_try_run_case+0x61/0xa0 kunit_generic_run_threadfn_adapter+0x16/0x30 kthread+0x176/0x1b0 ret_from_fork+0x22/0x30 kfence-#72: 0xffff8c3f2e292000-0xffff8c3f2e29201f, size=32, cache=kmalloc-32 allocated by task 484 on cpu 0 at 32.919330s: test_alloc+0xfe/0x738 test_out_of_bounds_read+0x9b/0x234 kunit_try_run_case+0x61/0xa0 kunit_generic_run_threadfn_adapter+0x16/0x30 kthread+0x176/0x1b0 ret_from_fork+0x22/0x30 CPU: 0 PID: 484 Comm: kunit_try_catch Not tainted 5.13.0-rc3+ #7 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014 ==================================================================”…”�”}”hjÃsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j(h³hÇh´K]hjh²hubhì)�”}”(hXThe header of the report provides a short summary of the function involved in the access. It is followed by more detailed information about the access and its origin. Note that, real kernel addresses are only shown when using the kernel command line option ``no_hash_pointers``.”h]”(hXThe header of the report provides a short summary of the function involved in the access. It is followed by more detailed information about the access and its origin. Note that, real kernel addresses are only shown when using the kernel command line option ”…”�”}”(hjÑh²hh³Nh´NubjA)�”}”(hŒ``no_hash_pointers``”h]”hŒno_hash_pointers”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjÑubhŒ.”…”�”}”(hjÑh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´Kuhjh²hubhì)�”}”(hŒ)Use-after-free accesses are reported as::”h]”hŒ(Use-after-free accesses are reported as:”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´Kzhjh²hubj))�”}”(hXG================================================================== BUG: KFENCE: use-after-free read in test_use_after_free_read+0xb3/0x143 Use-after-free read at 0xffff8c3f2e2a0000 (in kfence-#79): test_use_after_free_read+0xb3/0x143 kunit_try_run_case+0x61/0xa0 kunit_generic_run_threadfn_adapter+0x16/0x30 kthread+0x176/0x1b0 ret_from_fork+0x22/0x30 kfence-#79: 0xffff8c3f2e2a0000-0xffff8c3f2e2a001f, size=32, cache=kmalloc-32 allocated by task 488 on cpu 2 at 33.871326s: test_alloc+0xfe/0x738 test_use_after_free_read+0x76/0x143 kunit_try_run_case+0x61/0xa0 kunit_generic_run_threadfn_adapter+0x16/0x30 kthread+0x176/0x1b0 ret_from_fork+0x22/0x30 freed by task 488 on cpu 2 at 33.871358s: test_use_after_free_read+0xa8/0x143 kunit_try_run_case+0x61/0xa0 kunit_generic_run_threadfn_adapter+0x16/0x30 kthread+0x176/0x1b0 ret_from_fork+0x22/0x30 CPU: 2 PID: 488 Comm: kunit_try_catch Tainted: G B 5.13.0-rc3+ #7 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014 ==================================================================”h]”hXG================================================================== BUG: KFENCE: use-after-free read in test_use_after_free_read+0xb3/0x143 Use-after-free read at 0xffff8c3f2e2a0000 (in kfence-#79): test_use_after_free_read+0xb3/0x143 kunit_try_run_case+0x61/0xa0 kunit_generic_run_threadfn_adapter+0x16/0x30 kthread+0x176/0x1b0 ret_from_fork+0x22/0x30 kfence-#79: 0xffff8c3f2e2a0000-0xffff8c3f2e2a001f, size=32, cache=kmalloc-32 allocated by task 488 on cpu 2 at 33.871326s: test_alloc+0xfe/0x738 test_use_after_free_read+0x76/0x143 kunit_try_run_case+0x61/0xa0 kunit_generic_run_threadfn_adapter+0x16/0x30 kthread+0x176/0x1b0 ret_from_fork+0x22/0x30 freed by task 488 on cpu 2 at 33.871358s: test_use_after_free_read+0xa8/0x143 kunit_try_run_case+0x61/0xa0 kunit_generic_run_threadfn_adapter+0x16/0x30 kthread+0x176/0x1b0 ret_from_fork+0x22/0x30 CPU: 2 PID: 488 Comm: kunit_try_catch Tainted: G B 5.13.0-rc3+ #7 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014 ==================================================================”…”�”}”hjÿsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j(h³hÇh´K|hjh²hubhì)�”}”(hŒ)�”}”(hŒ/``struct kmem_cache *s`` cache being shut down ”h]”(jD)�”}”(hŒ``struct kmem_cache *s``”h]”jA)�”}”(hj! h]”hŒstruct kmem_cache *s”…”�”}”(hj# h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jCh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KMhj ubj^)�”}”(hhh]”hì)�”}”(hŒcache being shut down”h]”hŒcache being shut down”…”�”}”(hj: h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j6 h´KMhj7 ubah}”(h]”h ]”h"]”h$]”h&]”uh1j]hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j=h³j6 h´KMhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjüubhì)�”}”(hŒ**Description**”h]”j#)�”}”(hj\ h]”hŒ Description”…”�”}”(hj^ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hjZ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KOhjüubhì)�”}”(hŒ¾Before shutting down a cache, one must ensure there are no remaining objects allocated from it. Because KFENCE objects are not referenced from the cache directly, we need to check them here.”h]”hŒ¾Before shutting down a cache, one must ensure there are no remaining objects allocated from it. Because KFENCE objects are not referenced from the cache directly, we need to check them here.”…”�”}”(hjr h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KNhjüubhì)�”}”(hŒÏNote that shutdown_cache() is internal to SL*B, and kmem_cache_destroy() does not return if allocated objects still exist: it prints an error message and simply aborts destruction of a cache, leaking memory.”h]”hŒÏNote that shutdown_cache() is internal to SL*B, and kmem_cache_destroy() does not return if allocated objects still exist: it prints an error message and simply aborts destruction of a cache, leaking memory.”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KRhjüubhì)�”}”(hX¤If the only such objects are KFENCE objects, we will not leak the entire cache, but instead try to provide more useful debug info by making allocated objects "zombie allocations". Objects may then still be used or freed (which is handled gracefully), but usage will result in showing KFENCE error reports which include stack traces to the user of the object, the original allocation site, and caller to shutdown_cache().”h]”hX¨If the only such objects are KFENCE objects, we will not leak the entire cache, but instead try to provide more useful debug info by making allocated objects “zombie allocationsâ€�. Objects may then still be used or freed (which is handled gracefully), but usage will result in showing KFENCE error reports which include stack traces to the user of the object, the original allocation site, and caller to shutdown_cache().”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KVhjüubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jhjçh²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒkfence_alloc (C function)”Œc.kfence_alloc”hNt”auh1jhjçh²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒDvoid * kfence_alloc (struct kmem_cache *s, size_t size, gfp_t flags)”h]”j#)�”}”(hŒBvoid *kfence_alloc(struct kmem_cache *s, size_t size, gfp_t flags)”h]”(j))�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj» h²hh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´Kgubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÎ h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj» h²hh³jÍ h´Kgubj²)�”}”(hjh]”hŒ*”…”�”}”(hjÜ h²hh³Nh´Nubah}”(h]”h ]”j½ah"]”h$]”h&]”uh1j±hj» h²hh³jÍ h´KgubjL)�”}”(hŒ kfence_alloc”h]”jR)�”}”(hŒ kfence_alloc”h]”hŒ kfence_alloc”…”�”}”(hjí h²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhjé ubah}”(h]”h ]”(jejfeh"]”h$]”h&]”hÅhÆuh1jKhj» h²hh³jÍ h´Kgubjk)�”}”(hŒ0(struct kmem_cache *s, size_t size, gfp_t flags)”h]”(jq)�”}”(hŒstruct kmem_cache *s”h]”(jw)�”}”(hjVh]”hŒstruct”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jvhj ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj ubh)�”}”(hhh]”jR)�”}”(hŒ kmem_cache”h]”hŒ kmem_cache”…”�”}”(hj' h²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhj$ ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j Œreftype”j‰Œ reftarget”j) Œmodname”NŒ classname”Nj�j�)�”}”j“]”j–)�”}”j‰jï sbŒc.kfence_alloc”†”asbuh1hhj ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjG h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj ubj²)�”}”(hjh]”hŒ*”…”�”}”(hjU h²hh³Nh´Nubah}”(h]”h ]”j½ah"]”h$]”h&]”uh1j±hj ubjR)�”}”(hj¸h]”hŒs”…”�”}”(hjb h²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhj ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jphj ubjq)�”}”(hŒ size_t size”h]”(h)�”}”(hhh]”jR)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj} h²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhjz ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j Œreftype”j‰Œ reftarget”j Œmodname”NŒ classname”Nj�j�)�”}”j“]”jC Œc.kfence_alloc”†”asbuh1hhjv ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj› h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hjv ubjR)�”}”(hŒsize”h]”hŒsize”…”�”}”(hj© h²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhjv ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jphj ubjq)�”}”(hŒ gfp_t flags”h]”(h)�”}”(hhh]”jR)�”}”(hŒgfp_t”h]”hŒgfp_t”…”�”}”(hjÅ h²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhj ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j Œreftype”j‰Œ reftarget”jÇ Œmodname”NŒ classname”Nj�j�)�”}”j“]”jC Œc.kfence_alloc”†”asbuh1hhj¾ ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjã h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj¾ ubjR)�”}”(hŒflags”h]”hŒflags”…”�”}”(hjñ h²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhj¾ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jphj ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jjhj» h²hh³jÍ h´Kgubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjâˆuh1j"jãjähj· h²hh³jÍ h´Kgubah}”(h]”j² ah ]”(jèjéeh"]”h$]”h&]”jíˆjî)jïhuh1jh³jÍ h´Kghj´ h²hubjñ)�”}”(hhh]”hì)�”}”(hŒ/allocate a KFENCE object with a low probability”h]”hŒ/allocate a KFENCE object with a low probability”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´Kghj h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj´ h²hh³jÍ h´Kgubeh}”(h]”h ]”(j Œfunction”eh"]”h$]”h&]”jj jj3 jj3 j‰j‰j‰uh1jh²hhjçh³Nh´Nubj)�”}”(hX]**Parameters** ``struct kmem_cache *s`` struct kmem_cache with object requirements ``size_t size`` exact size of the object to allocate (can be less than **s->size** e.g. for kmalloc caches) ``gfp_t flags`` GFP flags **Return** * NULL - must proceed with allocating as usual, * non-NULL - pointer to a KFENCE object. **Description** kfence_alloc() should be inserted into the heap allocation fast path, allowing it to transparently return KFENCE-allocated objects with a low probability using a static branch (the probability is controlled by the kfence.sample_interval boot parameter).”h]”(hì)�”}”(hŒ**Parameters**”h]”j#)�”}”(hj= h]”hŒ Parameters”…”�”}”(hj? h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hj; ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´Kkhj7 ubj9)�”}”(hhh]”(j>)�”}”(hŒD``struct kmem_cache *s`` struct kmem_cache with object requirements ”h]”(jD)�”}”(hŒ``struct kmem_cache *s``”h]”jA)�”}”(hj\ h]”hŒstruct kmem_cache *s”…”�”}”(hj^ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjZ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jCh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KhhjV ubj^)�”}”(hhh]”hì)�”}”(hŒ*struct kmem_cache with object requirements”h]”hŒ*struct kmem_cache with object requirements”…”�”}”(hju h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jq h´Khhjr ubah}”(h]”h ]”h"]”h$]”h&]”uh1j]hjV ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j=h³jq h´KhhjS ubj>)�”}”(hŒl``size_t size`` exact size of the object to allocate (can be less than **s->size** e.g. for kmalloc caches) ”h]”(jD)�”}”(hŒ``size_t size``”h]”jA)�”}”(hj• h]”hŒ size_t size”…”�”}”(hj— h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj“ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jCh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´Kjhj� ubj^)�”}”(hhh]”hì)�”}”(hŒ[exact size of the object to allocate (can be less than **s->size** e.g. for kmalloc caches)”h]”(hŒ7exact size of the object to allocate (can be less than ”…”�”}”(hj® h²hh³Nh´Nubj#)�”}”(hŒ **s->size**”h]”hŒs->size”…”�”}”(hj¶ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hj® ubhŒ e.g. for kmalloc caches)”…”�”}”(hj® h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´Kihj« ubah}”(h]”h ]”h"]”h$]”h&]”uh1j]hj� ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j=h³jª h´KjhjS ubj>)�”}”(hŒ``gfp_t flags`` GFP flags ”h]”(jD)�”}”(hŒ``gfp_t flags``”h]”jA)�”}”(hjá h]”hŒ gfp_t flags”…”�”}”(hjã h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjß ubah}”(h]”h ]”h"]”h$]”h&]”uh1jCh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KkhjÛ ubj^)�”}”(hhh]”hì)�”}”(hŒ GFP flags”h]”hŒ GFP flags”…”�”}”(hjú h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jö h´Kkhj÷ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j]hjÛ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j=h³jö h´KkhjS ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j8hj7 ubhì)�”}”(hŒ **Return**”h]”j#)�”}”(hj h]”hŒReturn”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´Kmhj7 ubj7)�”}”(hhh]”(j<)�”}”(hŒ1NULL - must proceed with allocating as usual,”h]”hì)�”}”(hj7 h]”hŒ1NULL - must proceed with allocating as usual,”…”�”}”(hj9 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´Kmhj5 ubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hj2 ubj<)�”}”(hŒ'non-NULL - pointer to a KFENCE object. ”h]”hì)�”}”(hŒ&non-NULL - pointer to a KFENCE object.”h]”hŒ&non-NULL - pointer to a KFENCE object.”…”�”}”(hjQ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KnhjM ubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hj2 ubeh}”(h]”h ]”h"]”h$]”h&]”j³juh1j6h³jF h´Kmhj7 ubhì)�”}”(hŒ**Description**”h]”j#)�”}”(hjn h]”hŒ Description”…”�”}”(hjp h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hjl ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´Kphj7 ubhì)�”}”(hŒýkfence_alloc() should be inserted into the heap allocation fast path, allowing it to transparently return KFENCE-allocated objects with a low probability using a static branch (the probability is controlled by the kfence.sample_interval boot parameter).”h]”hŒýkfence_alloc() should be inserted into the heap allocation fast path, allowing it to transparently return KFENCE-allocated objects with a low probability using a static branch (the probability is controlled by the kfence.sample_interval boot parameter).”…”�”}”(hj„ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´Kphj7 ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jhjçh²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒkfence_ksize (C function)”Œc.kfence_ksize”hNt”auh1jhjçh²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒ&size_t kfence_ksize (const void *addr)”h]”j#)�”}”(hŒ%size_t kfence_ksize(const void *addr)”h]”(h)�”}”(hhh]”jR)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj¶ h²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhj³ ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j Œreftype”j‰Œ reftarget”j¸ Œmodname”NŒ classname”Nj�j�)�”}”j“]”j–)�”}”j‰Œ kfence_ksize”sbŒc.kfence_ksize”†”asbuh1hhj¯ h²hh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K…ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjØ h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj¯ h²hh³j× h´K…ubjL)�”}”(hŒ kfence_ksize”h]”jR)�”}”(hjÔ h]”hŒ kfence_ksize”…”�”}”(hjê h²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhjæ ubah}”(h]”h ]”(jejfeh"]”h$]”h&]”hÅhÆuh1jKhj¯ h²hh³j× h´K…ubjk)�”}”(hŒ(const void *addr)”h]”jq)�”}”(hŒconst void *addr”h]”(jw)�”}”(hjzh]”hŒconst”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jvhj ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj ubj))�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj. h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj ubj²)�”}”(hjh]”hŒ*”…”�”}”(hj< h²hh³Nh´Nubah}”(h]”h ]”j½ah"]”h$]”h&]”uh1j±hj ubjR)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hjI h²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhj ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jphjý ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jjhj¯ h²hh³j× h´K…ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjâˆuh1j"jãjähj« h²hh³j× h´K…ubah}”(h]”j¦ ah ]”(jèjéeh"]”h$]”h&]”jíˆjî)jïhuh1jh³j× h´K…hj¨ h²hubjñ)�”}”(hhh]”hì)�”}”(hŒ9get actual amount of memory allocated for a KFENCE object”h]”hŒ9get actual amount of memory allocated for a KFENCE object”…”�”}”(hjs h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”•Ø„h´K…hjp h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj¨ h²hh³j× h´K…ubeh}”(h]”h ]”(j Œfunction”eh"]”h$]”h&]”jj jj‹ jj‹ j‰j‰j‰uh1jh²hhjçh³Nh´Nubj)�”}”(hX–**Parameters** ``const void *addr`` pointer to a heap object **Return** * 0 - not a KFENCE object, must call __ksize() instead, * non-0 - this many bytes can be accessed without causing a memory error. **Description** kfence_ksize() returns the number of bytes requested for a KFENCE object at allocation time. This number may be less than the object size of the corresponding struct kmem_cache.”h]”(hì)�”}”(hŒ**Parameters**”h]”j#)�”}”(hj• h]”hŒ Parameters”…”�”}”(hj— h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hj“ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K‰hj� ubj9)�”}”(hhh]”j>)�”}”(hŒ.``const void *addr`` pointer to a heap object ”h]”(jD)�”}”(hŒ``const void *addr``”h]”jA)�”}”(hj´ h]”hŒconst void *addr”…”�”}”(hj¶ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj² ubah}”(h]”h ]”h"]”h$]”h&]”uh1jCh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K†hj® ubj^)�”}”(hhh]”hì)�”}”(hŒpointer to a heap object”h]”hŒpointer to a heap object”…”�”}”(hjÍ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÉ h´K†hjÊ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j]hj® ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j=h³jÉ h´K†hj« ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj� ubhì)�”}”(hŒ **Return**”h]”j#)�”}”(hjï h]”hŒReturn”…”�”}”(hjñ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hjí ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´Kˆhj� ubj7)�”}”(hhh]”(j<)�”}”(hŒ90 - not a KFENCE object, must call __ksize() instead,”h]”hì)�”}”(hj h]”hŒ90 - not a KFENCE object, must call __ksize() instead,”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´Kˆhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hjubj<)�”}”(hŒHnon-0 - this many bytes can be accessed without causing a memory error. ”h]”hì)�”}”(hŒGnon-0 - this many bytes can be accessed without causing a memory error.”h]”hŒGnon-0 - this many bytes can be accessed without causing a memory error.”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K‰hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hjubeh}”(h]”h ]”h"]”h$]”h&]”j³juh1j6h³jh´Kˆhj� ubhì)�”}”(hŒ**Description**”h]”j#)�”}”(hjAh]”hŒ Description”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hj?ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K‹hj� ubhì)�”}”(hŒ±kfence_ksize() returns the number of bytes requested for a KFENCE object at allocation time. This number may be less than the object size of the corresponding struct kmem_cache.”h]”hŒ±kfence_ksize() returns the number of bytes requested for a KFENCE object at allocation time. This number may be less than the object size of the corresponding struct kmem_cache.”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K‹hj� ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jhjçh²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ kfence_object_start (C function)”Œc.kfence_object_start”hNt”auh1jhjçh²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒ-void * kfence_object_start (const void *addr)”h]”j#)�”}”(hŒ+void *kfence_object_start(const void *addr)”h]”(j))�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj‚h²hh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K“ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj‚h²hh³j”h´K“ubj²)�”}”(hjh]”hŒ*”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”j½ah"]”h$]”h&]”uh1j±hj‚h²hh³j”h´K“ubjL)�”}”(hŒkfence_object_start”h]”jR)�”}”(hŒkfence_object_start”h]”hŒkfence_object_start”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhj°ubah}”(h]”h ]”(jejfeh"]”h$]”h&]”hÅhÆuh1jKhj‚h²hh³j”h´K“ubjk)�”}”(hŒ(const void *addr)”h]”jq)�”}”(hŒconst void *addr”h]”(jw)�”}”(hjzh]”hŒconst”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jvhjÌubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hjÌubj))�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hjÌubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hjÌubj²)�”}”(hjh]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j½ah"]”h$]”h&]”uh1j±hjÌubjR)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhjÌubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jphjÈubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jjhj‚h²hh³j”h´K“ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjâˆuh1j"jãjähj~h²hh³j”h´K“ubah}”(h]”jyah ]”(jèjéeh"]”h$]”h&]”jíˆjî)jïhuh1jh³j”h´K“hj{h²hubjñ)�”}”(hhh]”hì)�”}”(hŒ%find the beginning of a KFENCE object”h]”hŒ%find the beginning of a KFENCE object”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K“hj;h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj{h²hh³j”h´K“ubeh}”(h]”h ]”(j Œfunction”eh"]”h$]”h&]”jj jjVjjVj‰j‰j‰uh1jh²hhjçh³Nh´Nubj)�”}”(hXæ**Parameters** ``const void *addr`` address within a KFENCE-allocated object **Return** address of the beginning of the object. **Description** SL[AU]B-allocated objects are laid out within a page one by one, so it is easy to calculate the beginning of an object given a pointer inside it and the object size. The same is not true for KFENCE, which places a single object at either end of the page. This helper function is used to find the beginning of a KFENCE-allocated object.”h]”(hì)�”}”(hŒ**Parameters**”h]”j#)�”}”(hj`h]”hŒ Parameters”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K—hjZubj9)�”}”(hhh]”j>)�”}”(hŒ>``const void *addr`` address within a KFENCE-allocated object ”h]”(jD)�”}”(hŒ``const void *addr``”h]”jA)�”}”(hjh]”hŒconst void *addr”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jCh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K”hjyubj^)�”}”(hhh]”hì)�”}”(hŒ(address within a KFENCE-allocated object”h]”hŒ(address within a KFENCE-allocated object”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j”h´K”hj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1j]hjyubeh}”(h]”h ]”h"]”h$]”h&]”uh1j=h³j”h´K”hjvubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjZubhì)�”}”(hŒ **Return**”h]”j#)�”}”(hjºh]”hŒReturn”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hj¸ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K–hjZubhì)�”}”(hŒ'address of the beginning of the object.”h]”hŒ'address of the beginning of the object.”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K–hjZubhì)�”}”(hŒ**Description**”h]”j#)�”}”(hjáh]”hŒ Description”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hjßubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K˜hjZubhì)�”}”(hXOSL[AU]B-allocated objects are laid out within a page one by one, so it is easy to calculate the beginning of an object given a pointer inside it and the object size. The same is not true for KFENCE, which places a single object at either end of the page. This helper function is used to find the beginning of a KFENCE-allocated object.”h]”hXOSL[AU]B-allocated objects are laid out within a page one by one, so it is easy to calculate the beginning of an object given a pointer inside it and the object size. The same is not true for KFENCE, which places a single object at either end of the page. This helper function is used to find the beginning of a KFENCE-allocated object.”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K—hjZubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jhjçh²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ__kfence_free (C function)”Œc.__kfence_free”hNt”auh1jhjçh²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒvoid __kfence_free (void *addr)”h]”j#)�”}”(hŒvoid __kfence_free(void *addr)”h]”(j))�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj"h²hh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K¡ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj"h²hh³j4h´K¡ubjL)�”}”(hŒ __kfence_free”h]”jR)�”}”(hŒ __kfence_free”h]”hŒ __kfence_free”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhjCubah}”(h]”h ]”(jejfeh"]”h$]”h&]”hÅhÆuh1jKhj"h²hh³j4h´K¡ubjk)�”}”(hŒ (void *addr)”h]”jq)�”}”(hŒ void *addr”h]”(j))�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj_ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj_ubj²)�”}”(hjh]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j½ah"]”h$]”h&]”uh1j±hj_ubjR)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhj_ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jphj[ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jjhj"h²hh³j4h´K¡ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjâˆuh1j"jãjähjh²hh³j4h´K¡ubah}”(h]”jah ]”(jèjéeh"]”h$]”h&]”jíˆjî)jïhuh1jh³j4h´K¡hjh²hubjñ)�”}”(hhh]”hì)�”}”(hŒ+release a KFENCE heap object to KFENCE pool”h]”hŒ+release a KFENCE heap object to KFENCE pool”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K¡hj³h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjh²hh³j4h´K¡ubeh}”(h]”h ]”(j Œfunction”eh"]”h$]”h&]”jj jjÎjjÎj‰j‰j‰uh1jh²hhjçh³Nh´Nubj)�”}”(hŒ–**Parameters** ``void *addr`` object to be freed **Description** Requires: is_kfence_address(addr) Release a KFENCE object and mark it as freed.”h]”(hì)�”}”(hŒ**Parameters**”h]”j#)�”}”(hjØh]”hŒ Parameters”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K¥hjÒubj9)�”}”(hhh]”j>)�”}”(hŒ"``void *addr`` object to be freed ”h]”(jD)�”}”(hŒ``void *addr``”h]”jA)�”}”(hj÷h]”hŒ void *addr”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjõubah}”(h]”h ]”h"]”h$]”h&]”uh1jCh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K¢hjñubj^)�”}”(hhh]”hì)�”}”(hŒobject to be freed”h]”hŒobject to be freed”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j h´K¢hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j]hjñubeh}”(h]”h ]”h"]”h$]”h&]”uh1j=h³j h´K¢hjîubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjÒubhì)�”}”(hŒ**Description**”h]”j#)�”}”(hj2h]”hŒ Description”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K¤hjÒubhì)�”}”(hŒ!Requires: is_kfence_address(addr)”h]”hŒ!Requires: is_kfence_address(addr)”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K£hjÒubhì)�”}”(hŒ-Release a KFENCE object and mark it as freed.”h]”hŒ-Release a KFENCE object and mark it as freed.”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K¥hjÒubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jhjçh²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒkfence_free (C function)”Œ c.kfence_free”hNt”auh1jhjçh²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒbool kfence_free (void *addr)”h]”j#)�”}”(hŒbool kfence_free(void *addr)”h]”(j))�”}”(hj,h]”hŒbool”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj‚h²hh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K«ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj‚h²hh³j“h´K«ubjL)�”}”(hŒ kfence_free”h]”jR)�”}”(hŒ kfence_free”h]”hŒ kfence_free”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhj¢ubah}”(h]”h ]”(jejfeh"]”h$]”h&]”hÅhÆuh1jKhj‚h²hh³j“h´K«ubjk)�”}”(hŒ (void *addr)”h]”jq)�”}”(hŒ void *addr”h]”(j))�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj¾ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj¾ubj²)�”}”(hjh]”hŒ*”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”j½ah"]”h$]”h&]”uh1j±hj¾ubjR)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhj¾ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jphjºubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jjhj‚h²hh³j“h´K«ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjâˆuh1j"jãjähj~h²hh³j“h´K«ubah}”(h]”jyah ]”(jèjéeh"]”h$]”h&]”jíˆjî)jïhuh1jh³j“h´K«hj{h²hubjñ)�”}”(hhh]”hì)�”}”(hŒ6try to release an arbitrary heap object to KFENCE pool”h]”hŒ6try to release an arbitrary heap object to KFENCE pool”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K«hjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj{h²hh³j“h´K«ubeh}”(h]”h ]”(j Œfunction”eh"]”h$]”h&]”jj jj-jj-j‰j‰j‰uh1jh²hhjçh³Nh´Nubj)�”}”(hXÆ**Parameters** ``void *addr`` object to be freed **Return** * false - object doesn't belong to KFENCE pool and was ignored, * true - object was released to KFENCE pool. **Description** Release a KFENCE object and mark it as freed. May be called on any object, even non-KFENCE objects, to simplify integration of the hooks into the allocator's free codepath. The allocator must check the return value to determine if it was a KFENCE object or not.”h]”(hì)�”}”(hŒ**Parameters**”h]”j#)�”}”(hj7h]”hŒ Parameters”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K¯hj1ubj9)�”}”(hhh]”j>)�”}”(hŒ"``void *addr`` object to be freed ”h]”(jD)�”}”(hŒ``void *addr``”h]”jA)�”}”(hjVh]”hŒ void *addr”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjTubah}”(h]”h ]”h"]”h$]”h&]”uh1jCh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K¬hjPubj^)�”}”(hhh]”hì)�”}”(hŒobject to be freed”h]”hŒobject to be freed”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jkh´K¬hjlubah}”(h]”h ]”h"]”h$]”h&]”uh1j]hjPubeh}”(h]”h ]”h"]”h$]”h&]”uh1j=h³jkh´K¬hjMubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj1ubhì)�”}”(hŒ **Return**”h]”j#)�”}”(hj‘h]”hŒReturn”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K®hj1ubj7)�”}”(hhh]”(j<)�”}”(hŒ=false - object doesn't belong to KFENCE pool and was ignored,”h]”hì)�”}”(hj¬h]”hŒ?false - object doesn’t belong to KFENCE pool and was ignored,”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K®hjªubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hj§ubj<)�”}”(hŒ,true - object was released to KFENCE pool. ”h]”hì)�”}”(hŒ+true - object was released to KFENCE pool.”h]”hŒ+true - object was released to KFENCE pool.”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K¯hjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hj§ubeh}”(h]”h ]”h"]”h$]”h&]”j³juh1j6h³j»h´K®hj1ubhì)�”}”(hŒ**Description**”h]”j#)�”}”(hjãh]”hŒ Description”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hjáubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K±hj1ubhì)�”}”(hXRelease a KFENCE object and mark it as freed. May be called on any object, even non-KFENCE objects, to simplify integration of the hooks into the allocator's free codepath. The allocator must check the return value to determine if it was a KFENCE object or not.”h]”hXRelease a KFENCE object and mark it as freed. May be called on any object, even non-KFENCE objects, to simplify integration of the hooks into the allocator’s free codepath. The allocator must check the return value to determine if it was a KFENCE object or not.”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´K±hj1ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jhjçh²hh³Nh´Nubj)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ%kfence_handle_page_fault (C function)”Œc.kfence_handle_page_fault”hNt”auh1jhjçh²hh³Nh´Nubj)�”}”(hhh]”(j)�”}”(hŒWbool kfence_handle_page_fault (unsigned long addr, bool is_write, struct pt_regs *regs)”h]”j#)�”}”(hŒVbool kfence_handle_page_fault(unsigned long addr, bool is_write, struct pt_regs *regs)”h]”(j))�”}”(hj,h]”hŒbool”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj$h²hh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KÀubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj$h²hh³j5h´KÀubjL)�”}”(hŒkfence_handle_page_fault”h]”jR)�”}”(hŒkfence_handle_page_fault”h]”hŒkfence_handle_page_fault”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhjDubah}”(h]”h ]”(jejfeh"]”h$]”h&]”hÅhÆuh1jKhj$h²hh³j5h´KÀubjk)�”}”(hŒ9(unsigned long addr, bool is_write, struct pt_regs *regs)”h]”(jq)�”}”(hŒunsigned long addr”h]”(j))�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj`ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj`ubj))�”}”(hŒlong”h]”hŒlong”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj`ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj`ubjR)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhj`ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jphj\ubjq)�”}”(hŒ bool is_write”h]”(j))�”}”(hj,h]”hŒbool”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”j5ah"]”h$]”h&]”uh1j(hj±ubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hj±ubjR)�”}”(hŒis_write”h]”hŒis_write”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhj±ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jphj\ubjq)�”}”(hŒstruct pt_regs *regs”h]”(jw)�”}”(hjVh]”hŒstruct”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jvhjåubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hjåubh)�”}”(hhh]”jR)�”}”(hŒpt_regs”h]”hŒpt_regs”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhjubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j Œreftype”j‰Œ reftarget”j Œmodname”NŒ classname”Nj�j�)�”}”j“]”j–)�”}”j‰jJsbŒc.kfence_handle_page_fault”†”asbuh1hhjåubj;)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”jGah"]”h$]”h&]”uh1j:hjåubj²)�”}”(hjh]”hŒ*”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”j½ah"]”h$]”h&]”uh1j±hjåubjR)�”}”(hŒregs”h]”hŒregs”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”j^ah"]”h$]”h&]”uh1jQhjåubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jphj\ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jjhj$h²hh³j5h´KÀubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjâˆuh1j"jãjähj h²hh³j5h´KÀubah}”(h]”jah ]”(jèjéeh"]”h$]”h&]”jíˆjî)jïhuh1jh³j5h´KÀhjh²hubjñ)�”}”(hhh]”hì)�”}”(hŒ,perform page fault handling for KFENCE pages”h]”hŒ,perform page fault handling for KFENCE pages”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KÀhjih²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjh²hh³j5h´KÀubeh}”(h]”h ]”(j Œfunction”eh"]”h$]”h&]”jj jj„jj„j‰j‰j‰uh1jh²hhjçh³Nh´Nubj)�”}”(hXL**Parameters** ``unsigned long addr`` faulting address ``bool is_write`` is access a write ``struct pt_regs *regs`` current struct pt_regs (can be NULL, but shows full stack trace) **Return** * false - address outside KFENCE pool, * true - page fault handled by KFENCE, no additional handling required. **Description** A page fault inside KFENCE pool indicates a memory error, such as an out-of-bounds access, a use-after-free or an invalid memory access. In these cases KFENCE prints an error message and marks the offending page as present, so that the kernel can proceed.”h]”(hì)�”}”(hŒ**Parameters**”h]”j#)�”}”(hjŽh]”hŒ Parameters”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KÄhjˆubj9)�”}”(hhh]”(j>)�”}”(hŒ(``unsigned long addr`` faulting address ”h]”(jD)�”}”(hŒ``unsigned long addr``”h]”jA)�”}”(hj­h]”hŒunsigned long addr”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1jCh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KÁhj§ubj^)�”}”(hhh]”hì)�”}”(hŒfaulting address”h]”hŒfaulting address”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÂh´KÁhjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1j]hj§ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j=h³jÂh´KÁhj¤ubj>)�”}”(hŒ$``bool is_write`` is access a write ”h]”(jD)�”}”(hŒ``bool is_write``”h]”jA)�”}”(hjæh]”hŒ bool is_write”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjäubah}”(h]”h ]”h"]”h$]”h&]”uh1jCh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KÂhjàubj^)�”}”(hhh]”hì)�”}”(hŒis access a write”h]”hŒis access a write”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jûh´KÂhjüubah}”(h]”h ]”h"]”h$]”h&]”uh1j]hjàubeh}”(h]”h ]”h"]”h$]”h&]”uh1j=h³jûh´KÂhj¤ubj>)�”}”(hŒZ``struct pt_regs *regs`` current struct pt_regs (can be NULL, but shows full stack trace) ”h]”(jD)�”}”(hŒ``struct pt_regs *regs``”h]”jA)�”}”(hjh]”hŒstruct pt_regs *regs”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j@hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jCh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KÃhjubj^)�”}”(hhh]”hì)�”}”(hŒ@current struct pt_regs (can be NULL, but shows full stack trace)”h]”hŒ@current struct pt_regs (can be NULL, but shows full stack trace)”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j4h´KÃhj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1j]hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j=h³j4h´KÃhj¤ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j8hjˆubhì)�”}”(hŒ **Return**”h]”j#)�”}”(hjZh]”hŒReturn”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hjXubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KÅhjˆubj7)�”}”(hhh]”(j<)�”}”(hŒ$false - address outside KFENCE pool,”h]”hì)�”}”(hjuh]”hŒ$false - address outside KFENCE pool,”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KÅhjsubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hjpubj<)�”}”(hŒGtrue - page fault handled by KFENCE, no additional handling required. ”h]”hì)�”}”(hŒFtrue - page fault handled by KFENCE, no additional handling required.”h]”hŒFtrue - page fault handled by KFENCE, no additional handling required.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KÆhj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hjpubeh}”(h]”h ]”h"]”h$]”h&]”j³juh1j6h³j„h´KÅhjˆubhì)�”}”(hŒ**Description**”h]”j#)�”}”(hj¬h]”hŒ Description”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hjªubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KÈhjˆubhì)�”}”(hŒÿA page fault inside KFENCE pool indicates a memory error, such as an out-of-bounds access, a use-after-free or an invalid memory access. In these cases KFENCE prints an error message and marks the offending page as present, so that the kernel can proceed.”h]”hŒÿA page fault inside KFENCE pool indicates a memory error, such as an out-of-bounds access, a use-after-free or an invalid memory access. In these cases KFENCE prints an error message and marks the offending page as present, so that the kernel can proceed.”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒX/var/lib/git/docbuild/linux/Documentation/dev-tools/kfence:319: ./include/linux/kfence.h”h´KÈhjˆubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jhjçh²hh³Nh´Nubeh}”(h]”Œ interface”ah ]”h"]”Œ interface”ah$]”h&]”uh1hÖhhØh²hh³hÇh´M:ubh×)�”}”(hhh]”(hÜ)�”}”(hŒ Related Tools”h]”hŒ Related Tools”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjàh²hh³hÇh´MGubhì)�”}”(hXÔIn userspace, a similar approach is taken by `GWP-ASan `_. GWP-ASan also relies on guard pages and a sampling strategy to detect memory unsafety bugs at scale. KFENCE's design is directly influenced by GWP-ASan, and can be seen as its kernel sibling. Another similar but non-sampling approach, that also inspired the name "KFENCE", can be found in the userspace `Electric Fence Malloc Debugger `_.”h]”(hŒ-In userspace, a similar approach is taken by ”…”�”}”(hjñh²hh³Nh´NubhŒ reference”“”)�”}”(hŒ/`GWP-ASan `_”h]”hŒGWP-ASan”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒGWP-ASan”Œrefuri”Œ!http://llvm.org/docs/GwpAsan.html”uh1jùhjñubhŒtarget”“”)�”}”(hŒ$ ”h]”h}”(h]”Œgwp-asan”ah ]”h"]”Œgwp-asan”ah$]”h&]”Œrefuri”j uh1j Œ referenced”KhjñubhX7. GWP-ASan also relies on guard pages and a sampling strategy to detect memory unsafety bugs at scale. KFENCE’s design is directly influenced by GWP-ASan, and can be seen as its kernel sibling. Another similar but non-sampling approach, that also inspired the name “KFENCEâ€�, can be found in the userspace ”…”�”}”(hjñh²hh³Nh´Nubjú)�”}”(hŒF`Electric Fence Malloc Debugger `_”h]”hŒElectric Fence Malloc Debugger”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒElectric Fence Malloc Debugger”j Œ"https://linux.die.net/man/3/efence”uh1jùhjñubj)�”}”(hŒ% ”h]”h}”(h]”Œelectric-fence-malloc-debugger”ah ]”h"]”Œelectric fence malloc debugger”ah$]”h&]”Œrefuri”j1uh1j jKhjñubhŒ.”…”�”}”(hjñh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´MIhjàh²hubhì)�”}”(hŒðIn the kernel, several tools exist to debug memory access errors, and in particular KASAN can detect all bug classes that KFENCE can detect. While KASAN is more precise, relying on compiler instrumentation, this comes at a performance cost.”h]”hŒðIn the kernel, several tools exist to debug memory access errors, and in particular KASAN can detect all bug classes that KFENCE can detect. While KASAN is more precise, relying on compiler instrumentation, this comes at a performance cost.”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´MQhjàh²hubhì)�”}”(hXÌIt is worth highlighting that KASAN and KFENCE are complementary, with different target environments. For instance, KASAN is the better debugging-aid, where test cases or reproducers exists: due to the lower chance to detect the error, it would require more effort using KFENCE to debug. Deployments at scale that cannot afford to enable KASAN, however, would benefit from using KFENCE to discover bugs due to code paths not exercised by test cases or fuzzers.”h]”hXÌIt is worth highlighting that KASAN and KFENCE are complementary, with different target environments. For instance, KASAN is the better debugging-aid, where test cases or reproducers exists: due to the lower chance to detect the error, it would require more effort using KFENCE to debug. Deployments at scale that cannot afford to enable KASAN, however, would benefit from using KFENCE to discover bugs due to code paths not exercised by test cases or fuzzers.”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´MVhjàh²hubeh}”(h]”Œ related-tools”ah ]”h"]”Œ related tools”ah$]”h&]”uh1hÖhhØh²hh³hÇh´MGubeh}”(h]”Œkernel-electric-fence-kfence”ah ]”h"]”Œkernel electric-fence (kfence)”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”}”(jrjoj%j"jjÿj˜j•jjjäjájÝjÚjjjgjjj;j8uŒ nametypes”}”(jr‰j%‰j‰j˜‰j‰jä‰j݉jj‰jˆj;ˆuh}”(johØj"j jÿjˆj•jjj›jáj(jÚjçjjj jj² j· j¦ j« jyj~jjjyj~jj jgjàjjj8j2uŒ 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.