lkml.org 
[lkml]   [2017]   [Aug]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[v4 10/15] x86/kasan: explicitly zero kasan shadow memory
    Date
    To optimize the performance of struct page initialization,
    vmemmap_populate() will no longer zero memory.

    We must explicitly zero the memory that is allocated by vmemmap_populate()
    for kasan, as this memory does not go through struct page initialization
    path.

    Signed-off-by: Pavel Tatashin <pasha.tatashin@oracle.com>
    Reviewed-by: Steven Sistare <steven.sistare@oracle.com>
    Reviewed-by: Daniel Jordan <daniel.m.jordan@oracle.com>
    Reviewed-by: Bob Picco <bob.picco@oracle.com>
    ---
    arch/x86/mm/kasan_init_64.c | 29 +++++++++++++++++++++++++++++
    1 file changed, 29 insertions(+)

    diff --git a/arch/x86/mm/kasan_init_64.c b/arch/x86/mm/kasan_init_64.c
    index 02c9d7553409..7d06cf0b0b6e 100644
    --- a/arch/x86/mm/kasan_init_64.c
    +++ b/arch/x86/mm/kasan_init_64.c
    @@ -84,6 +84,28 @@ static struct notifier_block kasan_die_notifier = {
    };
    #endif

    +/*
    + * Memory that was allocated by vmemmap_populate is not zeroed, so we must
    + * zero it here explicitly.
    + */
    +static void
    +zero_vemmap_populated_memory(void)
    +{
    + u64 i, start, end;
    +
    + for (i = 0; i < E820_MAX_ENTRIES && pfn_mapped[i].end; i++) {
    + void *kaddr_start = pfn_to_kaddr(pfn_mapped[i].start);
    + void *kaddr_end = pfn_to_kaddr(pfn_mapped[i].end);
    +
    + start = (u64)kasan_mem_to_shadow(kaddr_start);
    + end = (u64)kasan_mem_to_shadow(kaddr_end);
    + memset((void *)start, 0, end - start);
    + }
    + start = (u64)kasan_mem_to_shadow(_stext);
    + end = (u64)kasan_mem_to_shadow(_end);
    + memset((void *)start, 0, end - start);
    +}
    +
    void __init kasan_early_init(void)
    {
    int i;
    @@ -156,6 +178,13 @@ void __init kasan_init(void)
    pte_t pte = __pte(__pa(kasan_zero_page) | __PAGE_KERNEL_RO);
    set_pte(&kasan_zero_pte[i], pte);
    }
    +
    + /*
    + * vmemmap_populate does not zero the memory, so we need to zero it
    + * explicitly
    + */
    + zero_vemmap_populated_memory();
    +
    /* Flush TLBs again to be sure that write protection applied. */
    __flush_tlb_all();

    --
    2.13.3
    \
     
     \ /
      Last update: 2017-08-02 22:42    [W:3.956 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site