Skip to content
  • Mike Kravetz's avatar
    hugetlb: make free_huge_page irq safe · db71ef79
    Mike Kravetz authored
    Commit c77c0a8a ("mm/hugetlb: defer freeing of huge pages if in
    non-task context") was added to address the issue of free_huge_page being
    called from irq context.  That commit hands off free_huge_page processing
    to a workqueue if !in_task.  However, this doesn't cover all the cases as
    pointed out by 0day bot lockdep report [1].
    
    :  Possible interrupt unsafe locking scenario:
    :
    :        CPU0                    CPU1
    :        ----                    ----
    :   lock(hugetlb_lock);
    :                                local_irq_disable();
    :                                lock(slock-AF_INET);
    :                                lock(hugetlb_lock);
    :   <Interrupt>
    :     lock(slock-AF_INET);
    
    Shakeel has later explained that this is very likely TCP TX zerocopy from
    hugetlb pages scenario when the networking code drops a last reference to
    hugetlb page while having IRQ disabled.  Hugetlb freeing path doesn't
    disable IRQ while holding hugetlb_lock so a lock dependency chain can lead
    to a deadlock.
    
    This commit addresses the issue by doing the following:
     - Make hugetlb_lock irq safe. This is mostly a simple process of
       changing spin_*lock calls to spin_*lock_irq* calls.
     - Make subpool lock irq safe in a similar manner.
     - Revert the !in_task check and workqueue handoff.
    
    [1] https://lore.kernel.org/linux-mm/000000000000f1c03b05bc43aadc@google.com/
    
    Link: https://lkml.kernel.org/r/20210409205254.242291-8-mike.kravetz@oracle.com
    
    
    Signed-off-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Reviewed-by: default avatarMuchun Song <songmuchun@bytedance.com>
    Reviewed-by: default avatarOscar Salvador <osalvador@suse.de>
    Cc: "Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>
    Cc: Barry Song <song.bao.hua@hisilicon.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Hillf Danton <hdanton@sina.com>
    Cc: HORIGUCHI NAOYA <naoya.horiguchi@nec.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Mina Almasry <almasrymina@google.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Roman Gushchin <guro@fb.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Waiman Long <longman@redhat.com>
    Cc: Will Deacon <will@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    db71ef79