lkml.org 
[lkml]   [2021]   [Feb]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] hugetlb: fix uninitialized subpool pointer
    On Tue 23-02-21 13:55:44, Mike Kravetz wrote:
    > Gerald Schaefer reported a panic on s390 in hugepage_subpool_put_pages()
    > with linux-next 5.12.0-20210222.
    > Call trace:
    > hugepage_subpool_put_pages.part.0+0x2c/0x138
    > __free_huge_page+0xce/0x310
    > alloc_pool_huge_page+0x102/0x120
    > set_max_huge_pages+0x13e/0x350
    > hugetlb_sysctl_handler_common+0xd8/0x110
    > hugetlb_sysctl_handler+0x48/0x58
    > proc_sys_call_handler+0x138/0x238
    > new_sync_write+0x10e/0x198
    > vfs_write.part.0+0x12c/0x238
    > ksys_write+0x68/0xf8
    > do_syscall+0x82/0xd0
    > __do_syscall+0xb4/0xc8
    > system_call+0x72/0x98
    >
    > This is a result of the change which moved the hugetlb page subpool
    > pointer from page->private to page[1]->private. When new pages are
    > allocated from the buddy allocator, the private field of the head
    > page will be cleared, but the private field of subpages is not modified.
    > Therefore, old values may remain.

    Very interesting. I have expected that the page->private would be in a
    reasonable state when allocated. On the other hand hugetlb doesn't do
    __GFP_COMP so tail pages are not initialized by the allocator.

    > Fix by initializing hugetlb page subpool pointer in prep_new_huge_page().
    >
    > Fixes: f1280272ae4d ("hugetlb: use page.private for hugetlb specific page flags")

    This is not a stable sha to refer to as it comes from linux next.

    > Reported-by: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
    > Signed-off-by: Mike Kravetz <mike.kravetz@oracle.com>

    Acked-by: Michal Hocko <mhocko@suse.com>

    I think this would be worth a separate patch rather than having it
    folded into the original patch. Thi is really subtle.

    > ---
    > mm/hugetlb.c | 1 +
    > 1 file changed, 1 insertion(+)
    >
    > diff --git a/mm/hugetlb.c b/mm/hugetlb.c
    > index c232cb67dda2..7ae5c18c98a7 100644
    > --- a/mm/hugetlb.c
    > +++ b/mm/hugetlb.c
    > @@ -1465,6 +1465,7 @@ static void prep_new_huge_page(struct hstate *h, struct page *page, int nid)
    > {
    > INIT_LIST_HEAD(&page->lru);
    > set_compound_page_dtor(page, HUGETLB_PAGE_DTOR);
    > + hugetlb_set_page_subpool(page, NULL);
    > set_hugetlb_cgroup(page, NULL);
    > set_hugetlb_cgroup_rsvd(page, NULL);
    > spin_lock(&hugetlb_lock);
    > --
    > 2.29.2
    >

    --
    Michal Hocko
    SUSE Labs

    \
     
     \ /
      Last update: 2021-02-24 10:48    [W:7.519 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site