lkml.org 
[lkml]   [2019]   [Apr]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RESEND PATCH 3/3] mm/vmap: add DEBUG_AUGMENT_LOWEST_MATCH_CHECK macro
    Date
    This macro adds some debug code to check that vmap allocations
    are happened in ascending order.

    By default this option is set to 0 and not active. It requires
    recompilation of the kernel to activate it. Set to 1, compile
    the kernel.

    Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
    ---
    mm/vmalloc.c | 43 +++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 43 insertions(+)

    diff --git a/mm/vmalloc.c b/mm/vmalloc.c
    index 1449a8c43aa2..dffc45e645e7 100644
    --- a/mm/vmalloc.c
    +++ b/mm/vmalloc.c
    @@ -323,6 +323,7 @@ EXPORT_SYMBOL(vmalloc_to_pfn);

    /*** Global kva allocator ***/
    #define DEBUG_AUGMENT_PROPAGATE_CHECK 0
    +#define DEBUG_AUGMENT_LOWEST_MATCH_CHECK 0

    #define VM_LAZY_FREE 0x02
    #define VM_VM_AREA 0x04
    @@ -844,6 +845,44 @@ __find_vmap_lowest_match(unsigned long size,
    return NULL;
    }

    +#if DEBUG_AUGMENT_LOWEST_MATCH_CHECK
    +#include <linux/random.h>
    +
    +static struct vmap_area *
    +__find_vmap_lowest_linear_match(unsigned long size,
    + unsigned long align, unsigned long vstart)
    +{
    + struct vmap_area *va;
    +
    + list_for_each_entry(va, &free_vmap_area_list, list) {
    + if (!is_within_this_va(va, size, align, vstart))
    + continue;
    +
    + return va;
    + }
    +
    + return NULL;
    +}
    +
    +static void
    +__find_vmap_lowest_match_check(unsigned long size)
    +{
    + struct vmap_area *va_1, *va_2;
    + unsigned long vstart;
    + unsigned int rnd;
    +
    + get_random_bytes(&rnd, sizeof(rnd));
    + vstart = VMALLOC_START + rnd;
    +
    + va_1 = __find_vmap_lowest_match(size, 1, vstart);
    + va_2 = __find_vmap_lowest_linear_match(size, 1, vstart);
    +
    + if (va_1 != va_2)
    + pr_emerg("not lowest: t: 0x%p, l: 0x%p, v: 0x%lx\n",
    + va_1, va_2, vstart);
    +}
    +#endif
    +
    enum alloc_fit_type {
    NOTHING_FIT = 0,
    FL_FIT_TYPE = 1, /* full fit */
    @@ -985,6 +1024,10 @@ __alloc_vmap_area(unsigned long size, unsigned long align,
    if (ret)
    return vend;

    +#if DEBUG_AUGMENT_LOWEST_MATCH_CHECK
    + __find_vmap_lowest_match_check(size);
    +#endif
    +
    return nva_start_addr;
    }

    --
    2.11.0
    \
     
     \ /
      Last update: 2019-04-02 18:26    [W:3.591 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site