• Mike Kravetz's avatar
    hugetlb: fix hugetlb cgroup refcounting during vma split · 09a26e83
    Mike Kravetz authored
    Guillaume Morin reported hitting the following WARNING followed by GPF or
    NULL pointer deference either in cgroups_destroy or in the kill_css path.:
    
        percpu ref (css_release) <= 0 (-1) after switching to atomic
        WARNING: CPU: 23 PID: 130 at lib/percpu-refcount.c:196 percpu_ref_switch_to_atomic_rcu+0x127/0x130
        CPU: 23 PID: 130 Comm: ksoftirqd/23 Kdump: loaded Tainted: G           O      5.10.60 #1
        RIP: 0010:percpu_ref_switch_to_atomic_rcu+0x127/0x130
        Call Trace:
           rcu_core+0x30f/0x530
           rcu_core_si+0xe/0x10
           __do_softirq+0x103/0x2a2
           run_ksoftirqd+0x2b/0x40
           smpboot_thread_fn+0x11a/0x170
           kthread+0x10a/0x140
           ret_from_fork+0x22/0x30
    
    Upon further examination, it was discovered that the css structure was
    associated with hugetlb reservations.
    
    For private hugetlb mappings the vma points to a reserve map that
    contains a pointer to the css.  At mmap time, reservations are set up
    and a reference to the css is taken.  This reference is dropped in the
    vma close operation; hugetlb_vm_op_close.  However, if a vma is split no
    additional reference to the css is taken yet hugetlb_vm_op_close will be
    called twice for the split vma resulting in an underflow.
    
    Fix by taking another reference in hugetlb_vm_op_open.  Note that the
    reference is only taken for the owner of the reserve map.  In the more
    common fork case, the pointer to the reserve map is cleared for
    non-owning vmas.
    
    Link: https://lkml.kernel.org/r/20210830215015.155224-1-mike.kravetz@oracle.com
    Fixes: e9fe92ae ("hugetlb_cgroup: add reservation accounting for private mappings")
    Signed-off-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Reported-by: default avatarGuillaume Morin <guillaume@morinfr.org>
    Suggested-by: default avatarGuillaume Morin <guillaume@morinfr.org>
    Tested-by: default avatarGuillaume Morin <guillaume@morinfr.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    09a26e83
hugetlb.c 176 KB