On Tue, Sep 3, 2019 at 4:56 PM Daniel Axtens <dja@xxxxxxxxxx> wrote: > > Provide the current number of vmalloc shadow pages in > /sys/kernel/debug/kasan_vmalloc/shadow_pages. Maybe it makes sense to put this into /sys/kernel/debug/kasan/ (without _vmalloc) and name e.g. vmalloc_shadow_pages? In case we want to expose more generic KASAN debugging info later. > > Signed-off-by: Daniel Axtens <dja@xxxxxxxxxx> > > --- > > Merging this is probably overkill, but I leave it to the discretion > of the broader community. > > On v4 (no dynamic freeing), I saw the following approximate figures > on my test VM: > > - fresh boot: 720 > - after test_vmalloc: ~14000 > > With v5 (lazy dynamic freeing): > > - boot: ~490-500 > - running modprobe test_vmalloc pushes the figures up to sometimes > as high as ~14000, but they drop down to ~560 after the test ends. > I'm not sure where the extra sixty pages are from, but running the > test repeately doesn't cause the number to keep growing, so I don't > think we're leaking. > - with vmap_stack, spawning tasks pushes the figure up to ~4200, then > some clearing kicks in and drops it down to previous levels again. > --- > mm/kasan/common.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/mm/kasan/common.c b/mm/kasan/common.c > index e33cbab83309..e40854512417 100644 > --- a/mm/kasan/common.c > +++ b/mm/kasan/common.c > @@ -35,6 +35,7 @@ > #include <linux/vmalloc.h> > #include <linux/bug.h> > #include <linux/uaccess.h> > +#include <linux/debugfs.h> > > #include <asm/tlbflush.h> > > @@ -750,6 +751,8 @@ core_initcall(kasan_memhotplug_init); > #endif > > #ifdef CONFIG_KASAN_VMALLOC > +static u64 vmalloc_shadow_pages; > + > static int kasan_populate_vmalloc_pte(pte_t *ptep, unsigned long addr, > void *unused) > { > @@ -776,6 +779,7 @@ static int kasan_populate_vmalloc_pte(pte_t *ptep, unsigned long addr, > if (likely(pte_none(*ptep))) { > set_pte_at(&init_mm, addr, ptep, pte); > page = 0; > + vmalloc_shadow_pages++; > } > spin_unlock(&init_mm.page_table_lock); > if (page) > @@ -829,6 +833,7 @@ static int kasan_depopulate_vmalloc_pte(pte_t *ptep, unsigned long addr, > if (likely(!pte_none(*ptep))) { > pte_clear(&init_mm, addr, ptep); > free_page(page); > + vmalloc_shadow_pages--; > } > spin_unlock(&init_mm.page_table_lock); > > @@ -947,4 +952,25 @@ void kasan_release_vmalloc(unsigned long start, unsigned long end, > (unsigned long)shadow_end); > } > } > + > +static __init int kasan_init_vmalloc_debugfs(void) > +{ > + struct dentry *root, *count; > + > + root = debugfs_create_dir("kasan_vmalloc", NULL); > + if (IS_ERR(root)) { > + if (PTR_ERR(root) == -ENODEV) > + return 0; > + return PTR_ERR(root); > + } > + > + count = debugfs_create_u64("shadow_pages", 0444, root, > + &vmalloc_shadow_pages); > + > + if (IS_ERR(count)) > + return PTR_ERR(root); > + > + return 0; > +} > +late_initcall(kasan_init_vmalloc_debugfs); > #endif > -- > 2.20.1 > > -- > You received this message because you are subscribed to the Google Groups "kasan-dev" group. > To unsubscribe from this group and stop receiving emails from it, send an email to kasan-dev+unsubscribe@xxxxxxxxxxxxxxxx. > To view this discussion on the web visit https://groups.google.com/d/msgid/kasan-dev/20190903145536.3390-6-dja%40axtens.net.