arch/arm/kernel/setup.c | 6 +++++ arch/arm/mm/kasan_init.c | 6 +++++ arch/arm64/mm/kasan_init.c | 7 ++++++ arch/loongarch/mm/kasan_init.c | 5 ++++ arch/powerpc/mm/kasan/init_32.c | 8 +++++- arch/powerpc/mm/kasan/init_book3e_64.c | 6 +++++ arch/powerpc/mm/kasan/init_book3s_64.c | 6 +++++ arch/riscv/mm/kasan_init.c | 6 +++++ arch/um/kernel/mem.c | 7 ++++++ arch/x86/mm/kasan_init_64.c | 6 +++++ arch/xtensa/kernel/setup.c | 1 + arch/xtensa/mm/kasan_init.c | 6 +++++ include/linux/kasan-enabled.h | 18 ++++++------- mm/kasan/common.c | 25 ++++++++++++++++++ mm/kasan/generic.c | 20 +++++++++++++-- mm/kasan/hw_tags.c | 35 ++------------------------ mm/kasan/init.c | 6 +++++ mm/kasan/quarantine.c | 3 +++ mm/kasan/report.c | 4 ++- mm/kasan/shadow.c | 23 ++++++++++++++++- mm/kasan/sw_tags.c | 9 +++++++ 21 files changed, 166 insertions(+), 47 deletions(-)
Currently only hw_tags mode of kasan can be enabled or disabled with kernel parameter kasan=on|off for built kernel. For kasan generic and sw_tags mode, there's no way to disable them once kernel is built. This is not convenient sometime, e.g in system kdump is configured. When the 1st kernel has KASAN enabled and crash triggered to switch to kdump kernel, the generic or sw_tags mode will cost much extra memory for kasan shadow while in fact it's meaningless to have kasan in kdump kernel. So this patchset moves the kasan=on|off out of hw_tags scope and into common code to make it visible in generic and sw_tags mode too. Then we can add kasan=off in kdump kernel to reduce the unneeded meomry cost for kasan. Changelog: ==== v2->v3: - Fix a building error on UML ARCH when CONFIG_KASAN is not set. The change of fixing is appended into patch patch 11. This is reported by LKP, thanks to them. v1->v2: - Add __ro_after_init for kasan_arg_disabled, and remove redundant blank lines in mm/kasan/common.c. Thanks to Marco. - Fix a code bug in <linux/kasan-enabled.h> when CONFIG_KASAN is unset, this is found out by SeongJae and Lorenzo, and also reported by LKP report, thanks to them. - Add a missing kasan_enabled() checking in kasan_report(). This will cause below KASAN report info even though kasan=off is set: ================================================================== BUG: KASAN: stack-out-of-bounds in tick_program_event+0x130/0x150 Read of size 4 at addr ffff00005f747778 by task swapper/0/1 CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.16.0+ #8 PREEMPT(voluntary) Hardware name: GIGABYTE R272-P30-JG/MP32-AR0-JG, BIOS F31n (SCP: 2.10.20220810) 09/30/2022 Call trace: show_stack+0x30/0x90 (C) dump_stack_lvl+0x7c/0xa0 print_address_description.constprop.0+0x90/0x310 print_report+0x104/0x1f0 kasan_report+0xc8/0x110 __asan_report_load4_noabort+0x20/0x30 tick_program_event+0x130/0x150 ......snip... ================================================================== - Add jump_label_init() calling before kasan_init() in setup_arch() in these architectures: xtensa, arm. Because they currenly rely on jump_label_init() in main() which is a little late. Then the early static key kasan_flag_enabled in kasan_init() won't work. - In UML architecture, change to enable kasan_flag_enabled in arch_mm_preinit() because kasan_init() is enabled before main(), there's no chance to operate on static key in kasan_init(). Test: ===== In v1, I took test on x86_64 for generic mode, and on arm64 for generic, sw_tags and hw_tags mode. All of them works well. In v2, I only tested on arm64 for generic, sw_tags and hw_tags mode, it works. For powerpc, I got a BOOK3S/64 machine, while it says 'KASAN not enabled as it requires radix' and KASAN is disabled. Will look for other POWER machine to test this. In v3, I only built UML kernel successfully w and w/o CONFIG_KASAN setting with LKP's testing steps. ==== Baoquan He (12): mm/kasan: add conditional checks in functions to return directly if kasan is disabled mm/kasan: move kasan= code to common place mm/kasan/sw_tags: don't initialize kasan if it's disabled arch/arm: don't initialize kasan if it's disabled arch/arm64: don't initialize kasan if it's disabled arch/loongarch: don't initialize kasan if it's disabled arch/powerpc: don't initialize kasan if it's disabled arch/riscv: don't initialize kasan if it's disabled arch/x86: don't initialize kasan if it's disabled arch/xtensa: don't initialize kasan if it's disabled arch/um: don't initialize kasan if it's disabled mm/kasan: make kasan=on|off take effect for all three modes arch/arm/kernel/setup.c | 6 +++++ arch/arm/mm/kasan_init.c | 6 +++++ arch/arm64/mm/kasan_init.c | 7 ++++++ arch/loongarch/mm/kasan_init.c | 5 ++++ arch/powerpc/mm/kasan/init_32.c | 8 +++++- arch/powerpc/mm/kasan/init_book3e_64.c | 6 +++++ arch/powerpc/mm/kasan/init_book3s_64.c | 6 +++++ arch/riscv/mm/kasan_init.c | 6 +++++ arch/um/kernel/mem.c | 7 ++++++ arch/x86/mm/kasan_init_64.c | 6 +++++ arch/xtensa/kernel/setup.c | 1 + arch/xtensa/mm/kasan_init.c | 6 +++++ include/linux/kasan-enabled.h | 18 ++++++------- mm/kasan/common.c | 25 ++++++++++++++++++ mm/kasan/generic.c | 20 +++++++++++++-- mm/kasan/hw_tags.c | 35 ++------------------------ mm/kasan/init.c | 6 +++++ mm/kasan/quarantine.c | 3 +++ mm/kasan/report.c | 4 ++- mm/kasan/shadow.c | 23 ++++++++++++++++- mm/kasan/sw_tags.c | 9 +++++++ 21 files changed, 166 insertions(+), 47 deletions(-) -- 2.41.0
On Wed, Aug 20, 2025 at 7:35 AM Baoquan He <bhe@redhat.com> wrote: > > Currently only hw_tags mode of kasan can be enabled or disabled with > kernel parameter kasan=on|off for built kernel. For kasan generic and > sw_tags mode, there's no way to disable them once kernel is built. > This is not convenient sometime, e.g in system kdump is configured. > When the 1st kernel has KASAN enabled and crash triggered to switch to > kdump kernel, the generic or sw_tags mode will cost much extra memory > for kasan shadow while in fact it's meaningless to have kasan in kdump > kernel. > > So this patchset moves the kasan=on|off out of hw_tags scope and into > common code to make it visible in generic and sw_tags mode too. Then we > can add kasan=off in kdump kernel to reduce the unneeded meomry cost for > kasan. Continuing the discussion on the previous version: so the unwanted extra memory usage is caused by the shadow memory for vmalloc allocations (as they get freed lazily)? This needs to be explained in the commit message. If so, would it help if we make the kasan.vmalloc command-line parameter work with the non-HW_TAGS modes (and make it do the same thing as disabling CONFIG_KASAN_VMALLOC)? What I don't like about introducing kasan=off for non-HW_TAGS modes is that this parameter does not actually disable KASAN. It just suppresses KASAN code for mapping proper shadow memory. But the compiler-added instrumentation is still executing (and I suspect this might break the inline instrumentation mode). Perhaps, we could instead add a new kasan.shadow=on/off parameter to make it more explicit that KASAN is not off, it's just that it stops mapping shadow memory. Dmitry, Alexander, Marco, do you have any opinion on kasan=off for non-HW_TAGS modes? On a side note, this series will need to be rebased onto Sabyrzhan's patches [1] - those are close to being ready. But perhaps let's wait for v7 first. [1] https://lore.kernel.org/all/20250810125746.1105476-1-snovitoll@gmail.com/
On 09/03/25 at 03:22pm, Andrey Konovalov wrote: > On Wed, Aug 20, 2025 at 7:35 AM Baoquan He <bhe@redhat.com> wrote: > > > > Currently only hw_tags mode of kasan can be enabled or disabled with > > kernel parameter kasan=on|off for built kernel. For kasan generic and > > sw_tags mode, there's no way to disable them once kernel is built. > > This is not convenient sometime, e.g in system kdump is configured. > > When the 1st kernel has KASAN enabled and crash triggered to switch to > > kdump kernel, the generic or sw_tags mode will cost much extra memory > > for kasan shadow while in fact it's meaningless to have kasan in kdump > > kernel. > > > > So this patchset moves the kasan=on|off out of hw_tags scope and into > > common code to make it visible in generic and sw_tags mode too. Then we > > can add kasan=off in kdump kernel to reduce the unneeded meomry cost for > > kasan. > > Continuing the discussion on the previous version: so the unwanted > extra memory usage is caused by the shadow memory for vmalloc > allocations (as they get freed lazily)? This needs to be explained in > the commit message. Hmm, up to now, there are two parts of big amount of memory requiring for kernel as I observed. One is the direct memory mapping shadow of kasan, which is 1/8 of system RAM in generic mode and 1/16 of system RAM in sw_tags mode; the other is the shadow meomry for vmalloc which causes meomry big meomry usage in kdump kernel because of lazy vmap freeing. By introducing "kasan=off|on", if we specify 'kasan=off', the former is avoided by skipping the kasan_init(), and the latter is avoided by not build the vmalloc shadow for vmalloc. Yes, I totally agree with you, I should have put this in cover letter and the main patch log to explain it better. > > If so, would it help if we make the kasan.vmalloc command-line > parameter work with the non-HW_TAGS modes (and make it do the same > thing as disabling CONFIG_KASAN_VMALLOC)? > > What I don't like about introducing kasan=off for non-HW_TAGS modes is > that this parameter does not actually disable KASAN. It just > suppresses KASAN code for mapping proper shadow memory. But the > compiler-added instrumentation is still executing (and I suspect this > might break the inline instrumentation mode). I may not follow your saying it doesn't disable KASAN. In this patchset, not only do I disable the code for mapping shadow memory, but also I skip any KASAN checking. Please see change of check_region_inline() in mm/kasan/generic.c and kasan_check_range() in mm/kasan/sw_tags.c. It will skip any KASAN checking when accessing memory. Yeah, the compiler added instrumentation will be called, but the if (!kasan_enabled()) checking will decide if going further into KASAN code or just return directly. I tried inline mode on x86_64 and arm64, it works well when one reviewer said inline mode could cost much more memory, I don't see any breakage w or w/o kasan=off when this patchset applied.. > > Perhaps, we could instead add a new kasan.shadow=on/off parameter to > make it more explicit that KASAN is not off, it's just that it stops > mapping shadow memory. Hmm, as I explained at above, kasan=off will stop mapping shadow memory, and also stop executing KASAN code to poison/unpoison memory and check the shadow. It may be inappropriate to say it only stops mapping shadow. > > Dmitry, Alexander, Marco, do you have any opinion on kasan=off for > non-HW_TAGS modes? > > On a side note, this series will need to be rebased onto Sabyrzhan's > patches [1] - those are close to being ready. But perhaps let's wait > for v7 first. I replied to Sabyrzhan's patchset, on top of this patchset, it's much easier and cleaner to remove kasan_arch_is_ready(). We don't need introduce CONFIG_ARCH_DEFER_KASAN. Please see below patchset which is based on this patchset introducing 'kasan=off|on' to genric|sw_tags mode. [PATCH 0/4] mm/kasan: remove kasan_arch_is_ready() https://lore.kernel.org/all/20250812130933.71593-1-bhe@redhat.com/T/#u > > [1] https://lore.kernel.org/all/20250810125746.1105476-1-snovitoll@gmail.com/ > Thanks a lot for reviewing and feedback.
On Thu, Sep 4, 2025 at 10:11 AM Baoquan He <bhe@redhat.com> wrote: > > > If so, would it help if we make the kasan.vmalloc command-line > > parameter work with the non-HW_TAGS modes (and make it do the same > > thing as disabling CONFIG_KASAN_VMALLOC)? > > > > What I don't like about introducing kasan=off for non-HW_TAGS modes is > > that this parameter does not actually disable KASAN. It just > > suppresses KASAN code for mapping proper shadow memory. But the > > compiler-added instrumentation is still executing (and I suspect this > > might break the inline instrumentation mode). > > I may not follow your saying it doesn't disable KASAN. In this patchset, > not only do I disable the code for mapping shadow memory, but also I > skip any KASAN checking. Please see change of check_region_inline() in > mm/kasan/generic.c and kasan_check_range() in mm/kasan/sw_tags.c. It > will skip any KASAN checking when accessing memory. > > Yeah, the compiler added instrumentation will be called, but the if > (!kasan_enabled()) checking will decide if going further into KASAN code > or just return directly. This all is true for the outline instrumentation mode. However, with the inline instrumentation, check_region_inline() is not called (in many cases, at least) and instead the compiler embeds the instructions to calculate the shadow memory address and check its value directly (this is why we have CONFIG_KASAN_SHADOW_OFFSET, whose value has to be known at compile time). > I tried inline mode on x86_64 and arm64, it > works well when one reviewer said inline mode could cost much more > memory, I don't see any breakage w or w/o kasan=off when this patchset > applied.. This is interesting. I guess what happens is that we still have the early shadow memory mapped so the shadow memory accesses inserted by the inline instrumentation do not crash. But have you tried running kasan=off + CONFIG_KASAN_STACK=y + CONFIG_VMAP_STACK=y (+ CONFIG_KASAN_VMALLOC=y)? I would expect this should causes crashes, as the early shadow is mapped as read-only and the inline stack instrumentation will try writing into it (or do the writes into the early shadow somehow get ignored?..). > > Perhaps, we could instead add a new kasan.shadow=on/off parameter to > > make it more explicit that KASAN is not off, it's just that it stops > > mapping shadow memory. > > Hmm, as I explained at above, kasan=off will stop mapping shadow memory, > and also stop executing KASAN code to poison/unpoison memory and check the > shadow. It may be inappropriate to say it only stops mapping shadow. That's true, but we can only achieve this for the outline instrumentation mode. With the inline instrumentation mode, the (early) shadow memory would still get accessed all the time even with kasan=off. Which can be considered inappropriate, as you pointed out (though this is what happens for vmalloc allocations when CONFIG_KASAN_VMALLOC is disabled and it does seem to work; but the inline stack instrumentation might be a problem). We could limit kasan=off to only the outline instrumentation mode, but I guess that defeats the purpose. I'm not completely opposed to making kasan=off work with all KASAN modes (assuming it works with the inline instrumentation), but then we will need to thoroughly document the behavior it creates. And let's also wait for an opinion from the other KASAN maintainers on this. > > Dmitry, Alexander, Marco, do you have any opinion on kasan=off for > > non-HW_TAGS modes? > > > > On a side note, this series will need to be rebased onto Sabyrzhan's > > patches [1] - those are close to being ready. But perhaps let's wait > > for v7 first. > > I replied to Sabyrzhan's patchset, on top of this patchset, it's much > easier and cleaner to remove kasan_arch_is_ready(). We don't need > introduce CONFIG_ARCH_DEFER_KASAN. Please see below patchset which is > based on this patchset introducing 'kasan=off|on' to genric|sw_tags > mode. Based on a brief look, both patch series seem to be doing similar things (except yours also allows using kasan=off for all modes). But I like the Sabyrzhan's approach of hiding the explicit static_branch_enable() calls under CONFIG_ARCH_DEFER_KASAN for the architectures where they are actually required. So I propose we moved forward with the Sabyrzhan's series and then apply additional patches for supporting kasan=off on top (but again, assuming they work with the inline instrumentation). Thank you!
On 9/4/25 4:58 PM, Andrey Konovalov wrote: > On Thu, Sep 4, 2025 at 10:11 AM Baoquan He <bhe@redhat.com> wrote: >> >>> If so, would it help if we make the kasan.vmalloc command-line >>> parameter work with the non-HW_TAGS modes (and make it do the same >>> thing as disabling CONFIG_KASAN_VMALLOC)? >>> >>> What I don't like about introducing kasan=off for non-HW_TAGS modes is >>> that this parameter does not actually disable KASAN. It just >>> suppresses KASAN code for mapping proper shadow memory. But the >>> compiler-added instrumentation is still executing (and I suspect this >>> might break the inline instrumentation mode). >> >> I may not follow your saying it doesn't disable KASAN. In this patchset, >> not only do I disable the code for mapping shadow memory, but also I >> skip any KASAN checking. Please see change of check_region_inline() in >> mm/kasan/generic.c and kasan_check_range() in mm/kasan/sw_tags.c. It >> will skip any KASAN checking when accessing memory. >> >> Yeah, the compiler added instrumentation will be called, but the if >> (!kasan_enabled()) checking will decide if going further into KASAN code >> or just return directly. > > This all is true for the outline instrumentation mode. > > However, with the inline instrumentation, check_region_inline() is not > called (in many cases, at least) and instead the compiler embeds the > instructions to calculate the shadow memory address and check its > value directly (this is why we have CONFIG_KASAN_SHADOW_OFFSET, whose > value has to be known at compile time). > >> I tried inline mode on x86_64 and arm64, it >> works well when one reviewer said inline mode could cost much more >> memory, I don't see any breakage w or w/o kasan=off when this patchset >> applied.. > > This is interesting. I guess what happens is that we still have the > early shadow memory mapped so the shadow memory accesses inserted by > the inline instrumentation do not crash. > > But have you tried running kasan=off + CONFIG_KASAN_STACK=y + > CONFIG_VMAP_STACK=y (+ CONFIG_KASAN_VMALLOC=y)? I would expect this > should causes crashes, as the early shadow is mapped as read-only and > the inline stack instrumentation will try writing into it (or do the > writes into the early shadow somehow get ignored?..). > It's not read-only, otherwise we would crash very early before full shadow setup and won't be able to boot at all. So writes still happen, and shadow checked, but reports are disabled. So the patchset should work, but it's a little bit odd feature. With kasan=off we still pay x2-x3 performance penalty of compiler instrumentation and get nothing in return. So the usecase for this is if you don't want to compile and manage additional kernel binary (with CONFIG_KASAN=n) and don't care about performance at all.
On Fri, Sep 5, 2025 at 7:12 PM Andrey Ryabinin <ryabinin.a.a@gmail.com> wrote: > > > But have you tried running kasan=off + CONFIG_KASAN_STACK=y + > > CONFIG_VMAP_STACK=y (+ CONFIG_KASAN_VMALLOC=y)? I would expect this > > should causes crashes, as the early shadow is mapped as read-only and > > the inline stack instrumentation will try writing into it (or do the > > writes into the early shadow somehow get ignored?..). > > It's not read-only, otherwise we would crash very early before full shadow > setup and won't be able to boot at all. So writes still happen, and shadow > checked, but reports are disabled. > > So the patchset should work, but it's a little bit odd feature. With kasan=off we still > pay x2-x3 performance penalty of compiler instrumentation and get nothing in return. > So the usecase for this is if you don't want to compile and manage additional kernel binary > (with CONFIG_KASAN=n) and don't care about performance at all. Ack. So kasan=off would work but it's only benefit would be to avoid the RAM overhead. Baoquan, I'd be in favor of implementing kasan.vmalloc=off instead of kasan=off. This seems to both (almost) solve the RAM overhead problem you're having (AFAIU) and also seems like a useful feature on its own (similar to CONFIG_KASAN_VMALLOC=n but via command-line). The patches to support kasan.vmalloc=off should also be orthogonal to the Sabyrzhan's series. If you feel strongly that the ~1/8th RAM overhead (coming from the physmap shadow and the slab redzones) is still unacceptable for your use case (noting that the performance overhead (and the constant silent detection of false-positive bugs) would still be there), I think you can proceed with your series (unless someone else is against). I also now get what you meant that with your patches for the kasan=off support, Sabyrzhan's CONFIG_ARCH_DEFER_KASAN would not be required anymore: as every architecture would need a kasan_enabled() check, every architecture would effectively need the CONFIG_ARCH_DEFER_KASAN functionality (i.e. the static key to switch off KASAN). Nevertheless, I still like the unification of the static keys usage and the KASAN initialization calls that the Sabyrzhan's series introduces, so I would propose to rebase your patches on top of his (even though you would remove CONFIG_ARCH_DEFER_KASAN, but that seems like a simple change) or pick out the related parts from his patches (but this might not be the best approach in case someone discovers a reason why kasan=off is a bad idea and we need to abandon the kasan=off series).
On 09/05/25 at 10:34pm, Andrey Konovalov wrote: > On Fri, Sep 5, 2025 at 7:12 PM Andrey Ryabinin <ryabinin.a.a@gmail.com> wrote: > > > > > But have you tried running kasan=off + CONFIG_KASAN_STACK=y + > > > CONFIG_VMAP_STACK=y (+ CONFIG_KASAN_VMALLOC=y)? I would expect this > > > should causes crashes, as the early shadow is mapped as read-only and > > > the inline stack instrumentation will try writing into it (or do the > > > writes into the early shadow somehow get ignored?..). > > > > It's not read-only, otherwise we would crash very early before full shadow > > setup and won't be able to boot at all. So writes still happen, and shadow > > checked, but reports are disabled. > > > > So the patchset should work, but it's a little bit odd feature. With kasan=off we still > > pay x2-x3 performance penalty of compiler instrumentation and get nothing in return. > > So the usecase for this is if you don't want to compile and manage additional kernel binary > > (with CONFIG_KASAN=n) and don't care about performance at all. Thanks a lot for your careful reviewing, and sorry for late reply. About kasan=off, we use static key to detect that, wondering if we will have x2-x3 performance penalty. Not only can kdump get the benefit, but I can think of one case where people may use kasan enabled kernel to detect MM issues, while use kasan=off to make sure kasan code itself won't make trouble. E.g you tested a normal kernel and it has no problem, while kasan enabled kernel will trigger issue, sometime do we doubt kasan code? In this case, kasan=off can prove its inonence? This could be trivial, while I don't see much kasan=off introducing will impact the old kasan performance and stir the current kasan implementation code. We have got the kasan_arch_is_ready() anyway. > > Ack. So kasan=off would work but it's only benefit would be to avoid > the RAM overhead. Right, I built kernel with below configs on, kasan=off|on works very well. ===== CONFIG_KASAN=y CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX=y CONFIG_KASAN_GENERIC=y CONFIG_KASAN_INLINE=y CONFIG_KASAN_STACK=y CONFIG_KASAN_VMALLOC=y CONFIG_KASAN_KUNIT_TEST=m ... CONFIG_VMAP_STACK=y ===== > > Baoquan, I'd be in favor of implementing kasan.vmalloc=off instead of > kasan=off. This seems to both (almost) solve the RAM overhead problem > you're having (AFAIU) and also seems like a useful feature on its own > (similar to CONFIG_KASAN_VMALLOC=n but via command-line). The patches > to support kasan.vmalloc=off should also be orthogonal to the > Sabyrzhan's series. > > If you feel strongly that the ~1/8th RAM overhead (coming from the > physmap shadow and the slab redzones) is still unacceptable for your > use case (noting that the performance overhead (and the constant > silent detection of false-positive bugs) would still be there), I > think you can proceed with your series (unless someone else is > against). Yeah, that would be great if we can also avoid any not needed memory consumption for kdump. > > I also now get what you meant that with your patches for the kasan=off > support, Sabyrzhan's CONFIG_ARCH_DEFER_KASAN would not be required > anymore: as every architecture would need a kasan_enabled() check, > every architecture would effectively need the CONFIG_ARCH_DEFER_KASAN > functionality (i.e. the static key to switch off KASAN). Exactly. In this case, the code with the static key enabling or disabling is clearer than CONFIG_ARCH_DEFER_KASAN setting or not. > > Nevertheless, I still like the unification of the static keys usage > and the KASAN initialization calls that the Sabyrzhan's series > introduces, so I would propose to rebase your patches on top of his > (even though you would remove CONFIG_ARCH_DEFER_KASAN, but that seems > like a simple change) or pick out the related parts from his patches > (but this might not be the best approach in case someone discovers a > reason why kasan=off is a bad idea and we need to abandon the > kasan=off series). Here I understand your reviewing policy. While I would like to explain a little about my posting. I planned to do this job in 2023, made draft patches on x86 for generic kasan, I dind't go further to try sw_tags mode on arm64 because other things interrupted me. This year, I made plan to disable some kernel features not necessary for kdump kernel, mainly by adding kernel parameter like ima= I made, and later the kasan=off. aa9bb1b32594 ima: add a knob ima= to allow disabling IMA in kdump kernel When I made patch and posted, I didn't see Sabyrzhan's patches because I usually don't go through mm mailing list. If I saw his patch earlier, I would have suggested him to solve this at the same time. About Sabyrzhan's patch sereis, I have picked up part of his patches and credit the author to Sabyrzhan in below patchset. [PATCH 0/4] mm/kasan: remove kasan_arch_is_ready() https://lore.kernel.org/all/20250812130933.71593-1-bhe@redhat.com/T/#u About reposting of this series, do you think which one is preferred: 1) Firstly merge Sabyrzhan's patch series, I reverted them and apply for my patchset. 2) Credit the author of patch 1,2,3 of this patch series to Sabyrzhan too as below, because Sabyrzhan do the unification of the static keys usage and the KASAN initialization calls earlier: [PATCH v3 01/12] mm/kasan: add conditional checks in functions to return directly if kasan is disabled [PATCH v3 02/12] mm/kasan: move kasan= code to common place [PATCH v3 03/12] mm/kasan/sw_tags: don't initialize kasan if it's disabled commit ac4004af0e1e8798d11c9310e500a88116d90271 Author: Baoquan He <bhe@redhat.com> Date: Mon Jan 2 08:58:36 2023 +0800 x86/kasan: check if kasan is available commit cddd343bdbf5d0331695da8100380fc4b8b47464 Author: Baoquan He <bhe@redhat.com> Date: Sun Jan 1 20:57:51 2023 +0800 mm/kasan: allow generic and sw_tags to be set in kernel cmdline Signed-off-by: Baoquan He <bhe@redhat.com> commit b149886995ecb2e464fee0cdd3a814035fc87226 Author: Baoquan He <bhe@redhat.com> Date: Sun Jan 1 21:07:29 2023 +0800 x86/kasan: allow to disable kasan during boot time
On Mon, Sep 15, 2025 at 11:05 AM Baoquan He <bhe@redhat.com> wrote: > > > If you feel strongly that the ~1/8th RAM overhead (coming from the > > physmap shadow and the slab redzones) is still unacceptable for your > > use case (noting that the performance overhead (and the constant > > silent detection of false-positive bugs) would still be there), I > > think you can proceed with your series (unless someone else is > > against). > > Yeah, that would be great if we can also avoid any not needed memory > consumption for kdump. Ack. Let's add support for kasan=off then. But please describe it in detail in the KASAN documentation. [...] > When I made patch and posted, I didn't see Sabyrzhan's patches because I > usually don't go through mm mailing list. If I saw his patch earlier, I > would have suggested him to solve this at the same time. > > About Sabyrzhan's patch sereis, I have picked up part of his patches and > credit the author to Sabyrzhan in below patchset. > > [PATCH 0/4] mm/kasan: remove kasan_arch_is_ready() > https://lore.kernel.org/all/20250812130933.71593-1-bhe@redhat.com/T/#u > > About reposting of this series, do you think which one is preferred: > > 1) Firstly merge Sabyrzhan's patch series, I reverted them and apply for > my patchset. > > 2) Credit the author of patch 1,2,3 of this patch series to Sabyrzhan > too as below, because Sabyrzhan do the unification of the static keys > usage and the KASAN initialization calls earlier: Since the Sabyrzhan's patches are already in mm-stable (and I assume will be merged during the next merge window), just rebase your changes on top. But also note that Sabyrzhan is planning to move out the kasan_enabled() checks into include/linux/kasan.h (which is a clean-up I would have also asked you to do with the kasan=off patches), so maybe you should sync up with him wrt these changes. Thanks!
On 09/23/25 at 07:49pm, Andrey Konovalov wrote: > On Mon, Sep 15, 2025 at 11:05 AM Baoquan He <bhe@redhat.com> wrote: > > > > > If you feel strongly that the ~1/8th RAM overhead (coming from the > > > physmap shadow and the slab redzones) is still unacceptable for your > > > use case (noting that the performance overhead (and the constant > > > silent detection of false-positive bugs) would still be there), I > > > think you can proceed with your series (unless someone else is > > > against). > > > > Yeah, that would be great if we can also avoid any not needed memory > > consumption for kdump. > > Ack. Let's add support for kasan=off then. Thanks. > > But please describe it in detail in the KASAN documentation. Will do in next round. > > [...] > > > When I made patch and posted, I didn't see Sabyrzhan's patches because I > > usually don't go through mm mailing list. If I saw his patch earlier, I > > would have suggested him to solve this at the same time. > > > > About Sabyrzhan's patch sereis, I have picked up part of his patches and > > credit the author to Sabyrzhan in below patchset. > > > > [PATCH 0/4] mm/kasan: remove kasan_arch_is_ready() > > https://lore.kernel.org/all/20250812130933.71593-1-bhe@redhat.com/T/#u > > > > About reposting of this series, do you think which one is preferred: > > > > 1) Firstly merge Sabyrzhan's patch series, I reverted them and apply for > > my patchset. > > > > 2) Credit the author of patch 1,2,3 of this patch series to Sabyrzhan > > too as below, because Sabyrzhan do the unification of the static keys > > usage and the KASAN initialization calls earlier: > > Since the Sabyrzhan's patches are already in mm-stable (and I assume > will be merged during the next merge window), just rebase your changes > on top. That's fine, I will rebase. > > But also note that Sabyrzhan is planning to move out the > kasan_enabled() checks into include/linux/kasan.h (which is a clean-up > I would have also asked you to do with the kasan=off patches), so > maybe you should sync up with him wrt these changes. Hi Sabyrzhan, What's your thought? You want to do the cleanup after my rebasing on your merged patches or you prefer to do it ahead of time? Please let me know so that I can adjust my posting accordingly. Thanks. Thanks Baoquan
On Fri, Sep 5, 2025 at 10:34 PM Andrey Konovalov <andreyknvl@gmail.com> wrote: > > Baoquan, I'd be in favor of implementing kasan.vmalloc=off instead of > kasan=off. This seems to both (almost) solve the RAM overhead problem > you're having (AFAIU) and also seems like a useful feature on its own > (similar to CONFIG_KASAN_VMALLOC=n but via command-line). The patches > to support kasan.vmalloc=off should also be orthogonal to the > Sabyrzhan's series. > > If you feel strongly that the ~1/8th RAM overhead (coming from the > physmap shadow and the slab redzones) is still unacceptable for your > use case (noting that the performance overhead (and the constant > silent detection of false-positive bugs) would still be there), I > think you can proceed with your series (unless someone else is > against). Hm, just realized that kasan.vmalloc=off would probably break if CONFIG_VMAP_STACK is enabled: read-only shadow for vmalloc => read-only shadow for stacks => stack instrumentation will try writing into read-only shadow and crash. So I wonder if there's a way to avoid the lazy vmap freeing to deal with the RAM overhead.
On 09/06/25 at 03:25pm, Andrey Konovalov wrote: > On Fri, Sep 5, 2025 at 10:34 PM Andrey Konovalov <andreyknvl@gmail.com> wrote: > > > > Baoquan, I'd be in favor of implementing kasan.vmalloc=off instead of > > kasan=off. This seems to both (almost) solve the RAM overhead problem > > you're having (AFAIU) and also seems like a useful feature on its own > > (similar to CONFIG_KASAN_VMALLOC=n but via command-line). The patches > > to support kasan.vmalloc=off should also be orthogonal to the > > Sabyrzhan's series. > > > > If you feel strongly that the ~1/8th RAM overhead (coming from the > > physmap shadow and the slab redzones) is still unacceptable for your > > use case (noting that the performance overhead (and the constant > > silent detection of false-positive bugs) would still be there), I > > think you can proceed with your series (unless someone else is > > against). > > Hm, just realized that kasan.vmalloc=off would probably break if > CONFIG_VMAP_STACK is enabled: read-only shadow for vmalloc => > read-only shadow for stacks => stack instrumentation will try writing > into read-only shadow and crash. > > So I wonder if there's a way to avoid the lazy vmap freeing to deal > with the RAM overhead. That's a very key feature of vmalloc, lazy vmap freeing not only integrate the virtual area freeing on one cpu at one time, but also merge the areas and flush tlb at one time too. Please see __purge_vmap_area_lazy() for the details. This can avoid performance degradation when many vfree() are called.
On Fri, Sep 5, 2025 at 7:12 PM Andrey Ryabinin <ryabinin.a.a@gmail.com> wrote: > > > But have you tried running kasan=off + CONFIG_KASAN_STACK=y + > > CONFIG_VMAP_STACK=y (+ CONFIG_KASAN_VMALLOC=y)? I would expect this > > should causes crashes, as the early shadow is mapped as read-only and > > the inline stack instrumentation will try writing into it (or do the > > writes into the early shadow somehow get ignored?..). > > > > It's not read-only, otherwise we would crash very early before full shadow > setup and won't be able to boot at all. So writes still happen, and shadow > checked, but reports are disabled. Hm, I thought it worked like that, but then what threw me off just now was seeing that zero_pte_populate()->pte_wrprotect() (on arm64) resets the PTE_WRITE bit and sets the PTE_RDONLY bit. So I thought the kasan_early_shadow_page is marked as read-only and then the instrumentation is disabled for all early code that might write into the page before the proper shadow is set up. Or am I reading this bit-setting code wrong?
Le 05/09/2025 à 20:08, Andrey Konovalov a écrit : > On Fri, Sep 5, 2025 at 7:12 PM Andrey Ryabinin <ryabinin.a.a@gmail.com> wrote: >> >>> But have you tried running kasan=off + CONFIG_KASAN_STACK=y + >>> CONFIG_VMAP_STACK=y (+ CONFIG_KASAN_VMALLOC=y)? I would expect this >>> should causes crashes, as the early shadow is mapped as read-only and >>> the inline stack instrumentation will try writing into it (or do the >>> writes into the early shadow somehow get ignored?..). >>> >> >> It's not read-only, otherwise we would crash very early before full shadow >> setup and won't be able to boot at all. So writes still happen, and shadow >> checked, but reports are disabled. > > Hm, I thought it worked like that, but then what threw me off just now > was seeing that zero_pte_populate()->pte_wrprotect() (on arm64) resets > the PTE_WRITE bit and sets the PTE_RDONLY bit. So I thought the > kasan_early_shadow_page is marked as read-only and then the > instrumentation is disabled for all early code that might write into > the page before the proper shadow is set up. Or am I reading this > bit-setting code wrong? But that zero_pte_populate() is called by kasan_init() when everything is ready. kasan_init()->kasan_init_shadow()->kasan_populate_early_shadow()->zero_p4d_populate()->zero_pud_populate()->zero_pmd_populate()->zero_pte_populate() Here we are talking about the shadow set at startup kasan_early_init(), aren't we ? Christophe
On Fri, Sep 5, 2025 at 9:13 PM Christophe Leroy <christophe.leroy@csgroup.eu> wrote: > > > Hm, I thought it worked like that, but then what threw me off just now > > was seeing that zero_pte_populate()->pte_wrprotect() (on arm64) resets > > the PTE_WRITE bit and sets the PTE_RDONLY bit. So I thought the > > kasan_early_shadow_page is marked as read-only and then the > > instrumentation is disabled for all early code that might write into > > the page before the proper shadow is set up. Or am I reading this > > bit-setting code wrong? > > But that zero_pte_populate() is called by kasan_init() when everything > is ready. > > kasan_init()->kasan_init_shadow()->kasan_populate_early_shadow()->zero_p4d_populate()->zero_pud_populate()->zero_pmd_populate()->zero_pte_populate() > > Here we are talking about the shadow set at startup kasan_early_init(), > aren't we ? Ah, you're right, thanks! I was confused by the name of kasan_populate_early_shadow(). I think we should rename it to kasan_populate_shadow_read_only() or something like that and also update the comment. As this function is not intended for populating early shadow (that is done via kasan_early_init() in the arch code instead), we're populating normal shadow for pages that can be accessed but whose shadow won't be written to. Perhaps it makes sense to come up with a better name for the kasan_early_shadow_page variable too to point out its dual purpose.
© 2016 - 2025 Red Hat, Inc.