• Joonsoo Kim's avatar
    mm/nommu: fix memory leak · da616534
    Joonsoo Kim authored
    Maxime reported the following memory leak regression due to commit
    dbc8358c ("mm/nommu: use alloc_pages_exact() rather than its own
    implementation").
    
    On v3.19, I am facing a memory leak.  Each time I run a command one page
    is lost.  Here an example with busybox's free command:
    
      / # free
                   total       used       free     shared    buffers     cached
      Mem:          7928       1972       5956          0          0        492
      -/+ buffers/cache:       1480       6448
      / # free
                   total       used       free     shared    buffers     cached
      Mem:          7928       1976       5952          0          0        492
      -/+ buffers/cache:       1484       6444
      / # free
                   total       used       free     shared    buffers     cached
      Mem:          7928       1980       5948          0          0        492
      -/+ buffers/cache:       1488       6440
      / # free
                   total       used       free     shared    buffers     cached
      Mem:          7928       1984       5944          0          0        492
      -/+ buffers/cache:       1492       6436
      / # free
                   total       used       free     shared    buffers     cached
      Mem:          7928       1988       5940          0          0        492
      -/+ buffers/cache:       1496       6432
    
    At some point, the system fails to sastisfy 256KB allocations:
    
      free: page allocation failure: order:6, mode:0xd0
      CPU: 0 PID: 67 Comm: free Not tainted 3.19.0-05389-gacf2cf1-dirty #64
      Hardware name: STM32 (Device Tree Support)
        show_stack+0xb/0xc
        warn_alloc_failed+0x97/0xbc
        __alloc_pages_nodemask+0x295/0x35c
        __get_free_pages+0xb/0x24
        alloc_pages_exact+0x19/0x24
        do_mmap_pgoff+0x423/0x658
        vm_mmap_pgoff+0x3f/0x4e
        load_flat_file+0x20d/0x4f8
        load_flat_binary+0x3f/0x26c
        search_binary_handler+0x51/0xe4
        do_execveat_common+0x271/0x35c
        do_execve+0x19/0x1c
        ret_fast_syscall+0x1/0x4a
      Mem-info:
      Normal per-cpu:
      CPU    0: hi:    0, btch:   1 usd:   0
      active_anon:0 inactive_anon:0 isolated_anon:0
       active_file:0 inactive_file:0 isolated_file:0
       unevictable:123 dirty:0 writeback:0 unstable:0
       free:1515 slab_reclaimable:17 slab_unreclaimable:139
       mapped:0 shmem:0 pagetables:0 bounce:0
       free_cma:0
      Normal free:6060kB min:352kB low:440kB high:528kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:492kB isolated(anon):0ks
      lowmem_reserve[]: 0 0
      Normal: 23*4kB (U) 22*8kB (U) 24*16kB (U) 23*32kB (U) 23*64kB (U) 23*128kB (U) 1*256kB (U) 0*512kB 0*1024kB 0*2048kB 0*4096kB = 6060kB
      123 total pagecache pages
      2048 pages of RAM
      1538 free pages
      66 reserved pages
      109 slab pages
      -46 pages shared
      0 pages swap cached
      nommu: Allocation of length 221184 from process 67 (free) failed
      Normal per-cpu:
      CPU    0: hi:    0, btch:   1 usd:   0
      active_anon:0 inactive_anon:0 isolated_anon:0
       active_file:0 inactive_file:0 isolated_file:0
       unevictable:123 dirty:0 writeback:0 unstable:0
       free:1515 slab_reclaimable:17 slab_unreclaimable:139
       mapped:0 shmem:0 pagetables:0 bounce:0
       free_cma:0
      Normal free:6060kB min:352kB low:440kB high:528kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:492kB isolated(anon):0ks
      lowmem_reserve[]: 0 0
      Normal: 23*4kB (U) 22*8kB (U) 24*16kB (U) 23*32kB (U) 23*64kB (U) 23*128kB (U) 1*256kB (U) 0*512kB 0*1024kB 0*2048kB 0*4096kB = 6060kB
      123 total pagecache pages
      Unable to allocate RAM for process text/data, errno 12 SEGV
    
    This problem happens because we allocate ordered page through
    __get_free_pages() in do_mmap_private() in some cases and we try to free
    individual pages rather than ordered page in free_page_series().  In
    this case, freeing pages whose refcount is not 0 won't be freed to the
    page allocator so memory leak happens.
    
    To fix the problem, this patch changes __get_free_pages() to
    alloc_pages_exact() since alloc_pages_exact() returns
    physically-contiguous pages but each pages are refcounted.
    
    Fixes: dbc8358c ("mm/nommu: use alloc_pages_exact() rather than its own implementation").
    Reported-by: default avatarMaxime Coquelin <mcoquelin.stm32@gmail.com>
    Tested-by: default avatarMaxime Coquelin <mcoquelin.stm32@gmail.com>
    Signed-off-by: default avatarJoonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: <stable@vger.kernel.org>	[3.19]
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    da616534
nommu.c 53.6 KB