Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932335AbdD0Fzj convert rfc822-to-8bit (ORCPT ); Thu, 27 Apr 2017 01:55:39 -0400 Received: from tyo162.gate.nec.co.jp ([114.179.232.162]:37332 "EHLO tyo162.gate.nec.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753726AbdD0Fzc (ORCPT ); Thu, 27 Apr 2017 01:55:32 -0400 From: Naoya Horiguchi To: Anshuman Khandual CC: "wujianguo@huawei.com" , "Linux Memory Management List" , Linux Kernel Mailing List Subject: Re: Freeing HugeTLB page into buddy allocator Thread-Topic: Freeing HugeTLB page into buddy allocator Thread-Index: AQHSvaIrVGPOxlBpBkqxJbwidD2eGKHYI3WA Date: Thu, 27 Apr 2017 05:54:58 +0000 Message-ID: <20170427055457.GA19344@hori1.linux.bs1.fc.nec.co.jp> References: <4f609205-fb69-4af5-3235-3abf05aa822a@linux.vnet.ibm.com> In-Reply-To: <4f609205-fb69-4af5-3235-3abf05aa822a@linux.vnet.ibm.com> Accept-Language: en-US, ja-JP Content-Language: ja-JP X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.128.101.1] Content-Type: text/plain; charset="iso-2022-jp" Content-ID: <185102A7C1CDE845923101F43FED5971@gisp.nec.co.jp> Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 X-TM-AS-MML: disable Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3433 Lines: 100 On Tue, Apr 25, 2017 at 02:27:27PM +0530, Anshuman Khandual wrote: > Hello Jianguo, > > In the commit a49ecbcd7b0d5a1cda, it talks about HugeTLB page being > freed into buddy allocator instead of hugepage_freelists. But if > I look the code closely for the function unmap_and_move_huge_page() > it only calls putback_active_hugepage() which puts the page into the > huge page active list to free up the source HugeTLB page after any > successful migration. I might be missing something here, so can you > please point me where we release the HugeTLB page into buddy allocator > directly during migration ? Hi Anshuman, As stated in the patch description, source hugetlb page is freed after successful migration if overcommit is configured. The call chain is like below: soft_offline_huge_page migrate_pages unmap_and_move_huge_page putback_active_hugepage(hpage) put_page // refcount is down to 0 __put_page __put_compound_page free_huge_page if (h->surplus_huge_pages_node[nid]) update_and_free_page __free_pages So the inline comment + /* overcommit hugetlb page will be freed to buddy */ might be confusing because at this point the overcommit hugetlb page was already freed to buddy. I hope this will help you. Thanks, Naoya Horiguchi > > > commit a49ecbcd7b0d5a1cda7d60e03df402dd0ef76ac8 > Author: Jianguo Wu > Date: Wed Dec 18 17:08:54 2013 -0800 > > mm/memory-failure.c: recheck PageHuge() after hugetlb page migrate successfully > > After a successful hugetlb page migration by soft offline, the source > page will either be freed into hugepage_freelists or buddy(over-commit > page). If page is in buddy, page_hstate(page) will be NULL. It will > hit a NULL pointer dereference in dequeue_hwpoisoned_huge_page(). > > BUG: unable to handle kernel NULL pointer dereference at 0000000000000058 > IP: [] dequeue_hwpoisoned_huge_page+0x131/0x1d0 > PGD c23762067 PUD c24be2067 PMD 0 > Oops: 0000 [#1] SMP > > So check PageHuge(page) after call migrate_pages() successfully. > > Signed-off-by: Jianguo Wu > Tested-by: Naoya Horiguchi > Reviewed-by: Naoya Horiguchi > Cc: > Signed-off-by: Andrew Morton > Signed-off-by: Linus Torvalds > > diff --git a/mm/memory-failure.c b/mm/memory-failure.c > index b7c1716..db08af9 100644 > --- a/mm/memory-failure.c > +++ b/mm/memory-failure.c > @@ -1505,10 +1505,16 @@ static int soft_offline_huge_page(struct page *page, int flags) > if (ret > 0) > ret = -EIO; > } else { > - set_page_hwpoison_huge_page(hpage); > - dequeue_hwpoisoned_huge_page(hpage); > - atomic_long_add(1 << compound_order(hpage), > - &num_poisoned_pages); > + /* overcommit hugetlb page will be freed to buddy */ > + if (PageHuge(page)) { > + set_page_hwpoison_huge_page(hpage); > + dequeue_hwpoisoned_huge_page(hpage); > + atomic_long_add(1 << compound_order(hpage), > + &num_poisoned_pages); > + } else { > + SetPageHWPoison(page); > + atomic_long_inc(&num_poisoned_pages); > + } > } > return ret; > } > > Regards > Anshuman > >