Skip to content
  • Huang Ying's avatar
    mm, swap: use kvzalloc to allocate some swap data structures · 54f180d3
    Huang Ying authored
    Now vzalloc() is used in swap code to allocate various data structures,
    such as swap cache, swap slots cache, cluster info, etc.  Because the
    size may be too large on some system, so that normal kzalloc() may fail.
    But using kzalloc() has some advantages, for example, less memory
    fragmentation, less TLB pressure, etc.  So change the data structure
    allocation in swap code to use kvzalloc() which will try kzalloc()
    firstly, and fallback to vzalloc() if kzalloc() failed.
    
    In general, although kmalloc() will reduce the number of high-order
    pages in short term, vmalloc() will cause more pain for memory
    fragmentation in the long term.  And the swap data structure allocation
    that is changed in this patch is expected to be long term allocation.
    
    From Dave Hansen:
     "for example, we have a two-page data structure. vmalloc() takes two
      effectively random order-0 pages, probably from two different 2M pages
      and pins them. That "kills" two 2M pages. kmalloc(), allocating two
      *contiguous* pages, will not cross a 2M boundary. That means it will
      only "kill" the possibility of a single 2M page. More 2M pages == less
      fragmentation.
    
    The allocation in this patch occurs during swap on time, which is
    usually done during system boot, so usually we have high opportunity to
    allocate the contiguous pages successfully.
    
    The allocation for swap_map[] in struct swap_info_struct is not changed,
    because that is usually quite large and vmalloc_to_page() is used for
    it.  That makes it a little harder to change.
    
    Link: http://lkml.kernel.org/r/20170407064911.25447-1-ying.huang@intel.com
    
    
    Signed-off-by: default avatarHuang Ying <ying.huang@intel.com>
    Acked-by: default avatarTim Chen <tim.c.chen@intel.com>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Acked-by: default avatarRik van Riel <riel@redhat.com>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Shaohua Li <shli@kernel.org>
    Cc: Minchan Kim <minchan@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    54f180d3