Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1036448AbdDUILc (ORCPT ); Fri, 21 Apr 2017 04:11:32 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:55136 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1036409AbdDUIL0 (ORCPT ); Fri, 21 Apr 2017 04:11:26 -0400 Subject: Re: [PATCH v5 08/11] mm: hwpoison: soft offline supports thp migration To: Zi Yan , n-horiguchi@ah.jp.nec.com, kirill.shutemov@linux.intel.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org References: <20170420204752.79703-1-zi.yan@sent.com> <20170420204752.79703-9-zi.yan@sent.com> Cc: akpm@linux-foundation.org, minchan@kernel.org, vbabka@suse.cz, mgorman@techsingularity.net, mhocko@kernel.org, khandual@linux.vnet.ibm.com, zi.yan@cs.rutgers.edu, dnellans@nvidia.com From: Anshuman Khandual Date: Fri, 21 Apr 2017 13:40:20 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 MIME-Version: 1.0 In-Reply-To: <20170420204752.79703-9-zi.yan@sent.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-TM-AS-MML: disable x-cbid: 17042108-0004-0000-0000-000001F7DA19 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17042108-0005-0000-0000-000009EC250B Message-Id: <62d7eea3-96c8-3230-3e1b-fdc2bfbea6bd@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-04-21_06:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1703280000 definitions=main-1704210151 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3018 Lines: 86 On 04/21/2017 02:17 AM, Zi Yan wrote: > From: Naoya Horiguchi > > This patch enables thp migration for soft offline. > > Signed-off-by: Naoya Horiguchi > > ChangeLog: v1 -> v5: > - fix page isolation counting error > > Signed-off-by: Zi Yan > --- > mm/memory-failure.c | 35 ++++++++++++++--------------------- > 1 file changed, 14 insertions(+), 21 deletions(-) > > diff --git a/mm/memory-failure.c b/mm/memory-failure.c > index 9b77476ef31f..23ff02eb3ed4 100644 > --- a/mm/memory-failure.c > +++ b/mm/memory-failure.c > @@ -1481,7 +1481,17 @@ static struct page *new_page(struct page *p, unsigned long private, int **x) > if (PageHuge(p)) > return alloc_huge_page_node(page_hstate(compound_head(p)), > nid); > - else > + else if (thp_migration_supported() && PageTransHuge(p)) { > + struct page *thp; > + > + thp = alloc_pages_node(nid, > + (GFP_TRANSHUGE | __GFP_THISNODE) & ~__GFP_RECLAIM, Why not __GFP_RECLAIM ? Its soft offline path we wait a bit before declaring that THP page cannot be allocated and hence should invoke reclaim methods as well. > + HPAGE_PMD_ORDER); > + if (!thp) > + return NULL; > + prep_transhuge_page(thp); > + return thp; > + } else > return __alloc_pages_node(nid, GFP_HIGHUSER_MOVABLE, 0); > } > > @@ -1665,8 +1675,8 @@ static int __soft_offline_page(struct page *page, int flags) > * cannot have PAGE_MAPPING_MOVABLE. > */ > if (!__PageMovable(page)) > - inc_node_page_state(page, NR_ISOLATED_ANON + > - page_is_file_cache(page)); > + mod_node_page_state(page_pgdat(page), NR_ISOLATED_ANON + > + page_is_file_cache(page), hpage_nr_pages(page)); > list_add(&page->lru, &pagelist); > ret = migrate_pages(&pagelist, new_page, NULL, MPOL_MF_MOVE_ALL, > MIGRATE_SYNC, MR_MEMORY_FAILURE); > @@ -1689,28 +1699,11 @@ static int __soft_offline_page(struct page *page, int flags) > static int soft_offline_in_use_page(struct page *page, int flags) > { > int ret; > - struct page *hpage = compound_head(page); > - > - if (!PageHuge(page) && PageTransHuge(hpage)) { > - lock_page(hpage); > - if (!PageAnon(hpage) || unlikely(split_huge_page(hpage))) { > - unlock_page(hpage); > - if (!PageAnon(hpage)) > - pr_info("soft offline: %#lx: non anonymous thp\n", page_to_pfn(page)); > - else > - pr_info("soft offline: %#lx: thp split failed\n", page_to_pfn(page)); > - put_hwpoison_page(hpage); > - return -EBUSY; > - } > - unlock_page(hpage); > - get_hwpoison_page(page); > - put_hwpoison_page(hpage); > - } > > if (PageHuge(page)) > ret = soft_offline_huge_page(page, flags); > else > - ret = __soft_offline_page(page, flags); > + ret = __soft_offline_page(compound_head(page), flags); Hmm, what if the THP allocation fails in the new_page() path and we fallback for general page allocation. In that case we will always be still calling with the head page ? Because we dont split the huge page any more.