• Baoquan He's avatar
    mm/vmalloc.c: add used_map into vmap_block to track space of vmap_block · d76f9954
    Baoquan He authored
    Patch series "mm/vmalloc.c: allow vread() to read out vm_map_ram areas", v5.
    
    Problem:
    ***
    
    Stephen reported vread() will skip vm_map_ram areas when reading out
    /proc/kcore with drgn utility.  Please see below link to get more details.
     
    
      /proc/kcore reads 0's for vmap_block
      https://lore.kernel.org/all/87ilk6gos2.fsf@oracle.com/T/#u
    
    Root cause:
    ***
    
    The normal vmalloc API uses struct vmap_area to manage the virtual kernel
    area allocated, and associate a vm_struct to store more information and
    pass out.  However, area reserved through vm_map_ram() interface doesn't
    allocate vm_struct to associate with.  So the current code in vread() will
    skip the vm_map_ram area through 'if (!va->vm)' conditional checking.
    
    Solution:
    ***
    
    To mark the area reserved through vm_map_ram() interface, add field
    'flags' into struct vmap_area.  Bit 0 indicates this is vm_map_ram area
    created through vm_map_ram() interface, bit 1 marks out the type of
    vm_map_ram area which makes use of vmap_block to manage split regions via
    vb_alloc/free().
    
    And also add bitmap field 'used_map' into struct vmap_block to mark those
    further subdivided regions being used to differentiate with dirty and free
    regions in vmap_block.
    
    With the help of above vmap_area->flags and vmap_block->used_map, we can
    recognize and handle vm_map_ram areas successfully.  All these are done in
    patch 1~3.
    
    Meanwhile, do some improvement on areas related to vm_map_ram areas in
    patch 4, 5.  And also change area flag from VM_ALLOC to VM_IOREMAP in
    patch 6, 7 because this will show them as 'ioremap' in /proc/vmallocinfo,
    and exclude them from /proc/kcore.
    
    
    This patch (of 7):
    
    In one vmap_block area, there could be three types of regions: region
    being used which is allocated through vb_alloc(), dirty region which is
    freed via vb_free() and free region.  Among them, only used region has
    available data.  While there's no way to track those used regions
    currently.
    
    Here, add bitmap field used_map into vmap_block, and set/clear it during
    allocation or freeing regions of vmap_block area.
    
    This is a preparation for later use.
    
    Link: https://lkml.kernel.org/r/20230206084020.174506-1-bhe@redhat.com
    Link: https://lkml.kernel.org/r/20230206084020.174506-2-bhe@redhat.comSigned-off-by: default avatarBaoquan He <bhe@redhat.com>
    Reviewed-by: default avatarLorenzo Stoakes <lstoakes@gmail.com>
    Reviewed-by: default avatarUladzislau Rezki (Sony) <urezki@gmail.com>
    Cc: Dan Carpenter <error27@gmail.com>
    Cc: Stephen Brennan <stephen.s.brennan@oracle.com>
    Cc: Uladzislau Rezki (Sony) <urezki@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    d76f9954
vmalloc.c 108 KB