Re: [PATCH RFC v2 09/25] kmsan: add KMSAN runtime

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Nov 8, 2019 at 1:08 PM Dmitry Vyukov <dvyukov@xxxxxxxxxx> wrote:
>
> On Wed, Oct 30, 2019 at 3:23 PM <glider@xxxxxxxxxx> wrote:
> >
> > This patch adds the KernelMemorySanitizer runtime and associated files:
> >
> >   - arch/x86/include/asm/kmsan.h: assembly definitions for hooking
> >     interrupt handlers;
> >   - include/linux/kmsan-checks.h: user API to enable/disable KMSAN,
> >     poison/unpoison memory etc.
> >   - include/linux/kmsan.h: declarations of KMSAN memory hooks to be
> >     referenced outside KMSAN runtime
> >   - lib/Kconfig.kmsan: declarations for CONFIG_KMSAN and
> >     CONFIG_TEST_KMSAN
> >   - mm/kmsan/Makefile: boilerplate Makefile
> >   - mm/kmsan/kmsan.h: internal KMSAN declarations
> >   - mm/kmsan/kmsan.c: core functions that operate with shadow and
> >     origin memory and perform checks, utility functions
> >   - mm/kmsan/kmsan_entry.c: KMSAN hooks for entry_64.S
> >   - mm/kmsan/kmsan_hooks.c: KMSAN hooks for kernel subsystems
> >   - mm/kmsan/kmsan_init.c: KMSAN initialization routines
> >   - mm/kmsan/kmsan_instr.c: functions called by KMSAN instrumentation
> >   - scripts/Makefile.kmsan: CFLAGS_KMSAN
> >
> > Signed-off-by: Alexander Potapenko <glider@xxxxxxxxxx>
> > To: Alexander Potapenko <glider@xxxxxxxxxx>
> > Cc: Vegard Nossum <vegard.nossum@xxxxxxxxxx>
> > Cc: Dmitry Vyukov <dvyukov@xxxxxxxxxx>
> > Cc: linux-mm@xxxxxxxxx
>
> >+                       kmsan_pr_err("Local variable description: %s\n", descr);
> >+                       kmsan_pr_err("Variable was created at:\n");
>
> It would be nice to tidy up the description, it contains lots of
> duplicate/unneeded/confusing info:
>
> Local variable description: ----br.i@vp7045_read_mac_addr
> Variable was created at:
>  vp7045_read_eeprom drivers/media/usb/dvb-usb/vp7045.c:119 [inline]
>  vp7045_read_mac_addr+0x7b/0xbe0 drivers/media/usb/dvb-usb/vp7045.c:132
>  vp7045_read_eeprom drivers/media/usb/dvb-usb/vp7045.c:119 [inline]
>  vp7045_read_mac_addr+0x7b/0xbe0 drivers/media/usb/dvb-usb/vp7045.c:132
>
> It could be just:
>
> Local variable br was created at:
>  vp7045_read_eeprom drivers/media/usb/dvb-usb/vp7045.c:119 [inline]
>  vp7045_read_mac_addr+0x7b/0xbe0 drivers/media/usb/dvb-usb/vp7045.c:132
>  vp7045_read_eeprom drivers/media/usb/dvb-usb/vp7045.c:119 [inline]
>  vp7045_read_mac_addr+0x7b/0xbe0 drivers/media/usb/dvb-usb/vp7045.c:132


>+                       kmsan_pr_err("Uninit was stored to memory at:\n");
>+                       chained_nr_entries =
>+                               stack_depot_fetch(head, &chained_entries);
>+                       stack_trace_print(chained_entries, chained_nr_entries,
>+                                         0);

I like how KCSAN trims all stacks of internal runtime frames. It would
be nice to do the same for KMSAN, currently we have 3-4 uninteresting
frames in the beginning of each stack. Besides taking space, it also
requires to manually visually search for the actual interesting frame
somewhere in the middle of the stack. E.g. all these frames are
pointing into kmsan runtime guts:

Call Trace:
 __dump_stack lib/dump_stack.c:77 [inline]
 dump_stack+0x1c9/0x220 lib/dump_stack.c:113
 kmsan_report+0x12d/0x290 mm/kmsan/kmsan.c:682
 __msan_warning+0x76/0xc0 mm/kmsan/kmsan_instr.c:316

Uninit was stored to memory at:
 kmsan_save_stack_with_flags mm/kmsan/kmsan.c:247 [inline]
 kmsan_save_stack mm/kmsan/kmsan.c:262 [inline]
 kmsan_internal_chain_origin+0x162/0x260 mm/kmsan/kmsan.c:470
 __msan_chain_origin+0x6d/0xb0 mm/kmsan/kmsan_instr.c:197

Uninit was stored to memory at:
 kmsan_save_stack_with_flags mm/kmsan/kmsan.c:247 [inline]
 kmsan_save_stack mm/kmsan/kmsan.c:262 [inline]
 kmsan_internal_chain_origin+0x162/0x260 mm/kmsan/kmsan.c:470
 __msan_chain_origin+0x6d/0xb0 mm/kmsan/kmsan_instr.c:197

Uninit was stored to memory at:
 kmsan_save_stack_with_flags mm/kmsan/kmsan.c:247 [inline]
 kmsan_save_stack mm/kmsan/kmsan.c:262 [inline]
 kmsan_internal_chain_origin+0x162/0x260 mm/kmsan/kmsan.c:470
 kmsan_memcpy_memmove_metadata+0x1a9/0xf30 mm/kmsan/kmsan.c:345
 kmsan_memcpy_metadata+0xb/0x10 mm/kmsan/kmsan.c:363
 __msan_memcpy+0x61/0x70 mm/kmsan/kmsan_instr.c:148

Uninit was created at:
 kmsan_save_stack_with_flags mm/kmsan/kmsan.c:247 [inline]
 kmsan_internal_poison_shadow+0x92/0x150 mm/kmsan/kmsan.c:170
 kmsan_kmalloc+0xa1/0x100 mm/kmsan/kmsan_hooks.c:179
 kmsan_slab_alloc+0xe/0x10 mm/kmsan/kmsan_hooks.c:188
 slab_post_alloc_hook mm/slab.h:446 [inline]
 slab_alloc_node mm/slub.c:2759 [inline]
 __kmalloc_node_track_caller+0xf06/0x1120 mm/slub.c:4383




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux