From patchwork Fri Nov 13 20:53:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yang Shi X-Patchwork-Id: 11904567 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2D90E697 for ; Fri, 13 Nov 2020 20:54:29 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id DB1732224D for ; Fri, 13 Nov 2020 20:54:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="r5dzGtWN" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DB1732224D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id C35AD6B0078; Fri, 13 Nov 2020 15:54:27 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id BE6B46B007B; Fri, 13 Nov 2020 15:54:27 -0500 (EST) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AFDCE6B007D; Fri, 13 Nov 2020 15:54:27 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0221.hostedemail.com [216.40.44.221]) by kanga.kvack.org (Postfix) with ESMTP id 7D01E6B0078 for ; Fri, 13 Nov 2020 15:54:27 -0500 (EST) Received: from smtpin16.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 2C49F181AEF07 for ; Fri, 13 Nov 2020 20:54:27 +0000 (UTC) X-FDA: 77480598174.16.anger30_490950c27312 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin16.hostedemail.com (Postfix) with ESMTP id 07A78100E690C for ; Fri, 13 Nov 2020 20:54:27 +0000 (UTC) X-Spam-Summary: 1,0,0,8bb02ee962ed1090,d41d8cd98f00b204,shy828301@gmail.com,,RULES_HIT:41:69:355:379:541:800:960:966:968:973:988:989:1202:1260:1311:1314:1345:1359:1437:1515:1535:1543:1605:1711:1730:1747:1777:1792:2194:2196:2199:2200:2393:2553:2559:2562:2693:2899:3138:3139:3140:3141:3142:3865:3866:3867:3868:3870:3871:3872:4117:4250:4321:4385:5007:6119:6120:6261:6653:7514:7875:7901:7903:8957:9010:9413:10004:11026:11658:11914:12043:12048:12291:12296:12297:12438:12517:12519:12555:12683:12895:13894:14096:14181:14687:14721:21060:21080:21444:21627:21666:21990:30054:30090:30091,0,RBL:209.85.210.196:@gmail.com:.lbl8.mailshell.net-62.50.0.100 66.100.201.100;04yfeoojd68mcmtn79gsitimspprsoc5y5w97c6c51kjpi1qe6qe1a63wqujwjn.xfg76f3ci7sws3bg19mexfnpktnwkssxbpo6c1snjju5da4zzoch4erq1x5g6xd.s-lbl8.mailshell.net-223.238.255.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fp,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:68,LUA_SUMMARY:none X-HE-Tag: anger30_490950c27312 X-Filterd-Recvd-Size: 6744 Received: from mail-pf1-f196.google.com (mail-pf1-f196.google.com [209.85.210.196]) by imf25.hostedemail.com (Postfix) with ESMTP for ; Fri, 13 Nov 2020 20:54:26 +0000 (UTC) Received: by mail-pf1-f196.google.com with SMTP id z3so8626903pfb.10 for ; Fri, 13 Nov 2020 12:54:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=CvuRYtIWP4UHd11OQXH+00CGziU0NWit5UcWJl2Apfg=; b=r5dzGtWNg/mpS+L45R1MXt6/lO/QS8/uCWBMj9w+ktEc6Vo4B6Xy/hw9X+YldMpWTs xWxC9Voa3j4Sb9Qub0oSKf+FkyY3Gcy79pIs9LxmFd2jqO7Ps7bZkYUsSqZDC5Q1kQoE DaHdfmxCFedkfeQNjiqmfqIOjDluCRIbOALCHAC02vlJ2PX6180hiGgIIQZpt1rCssgU x+1usfjyOgW2VBG0tSCcvWhGtXCMlSBcNemYfmyuLcIABPsAFBAYUYrWP37ZJaGRDcCb 7ohZSp10JeohHQDWp9xpyrEuFIO+va2Z8lV3xqPAxHn4xsGLS9l/f2J+lZxoCl5iC9fc 0ssA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CvuRYtIWP4UHd11OQXH+00CGziU0NWit5UcWJl2Apfg=; b=TOrTrdZ7ECDxHO1ULZCLrja17CuaDvovvuP/nIO8d6uA8XeXS+2uXMz08HbuSG36Qb ZZA1lTCgFM5AIIOXAFwjCQDKI6UFMzJwQmrf7cNEVhVWL12tqH+mTm8sYI48FuybeH1b 8HODBTehCJise8XSTbg7/UBF8c9Z5IY24yImnT5SlyWkSvNpUUMIgqQqUIMTAZWGxW/q 453p3oTJJv1Pxv5wTNDnu2cdxg2ayI6CF5lUer5c5gtHZh5NuyiL7XIl9bILdYtqg0rk 640nv4JeTD2F53HNyH9UpKvOUIC37BMIE5LQmJ2crhq4vLXKESv+1p4Av1Ti33BEWCuG KSNQ== X-Gm-Message-State: AOAM530ZviNY0FTVZC55OHrkP9kB/v+nXw0PXlfacLSr8EhaDxlOuOcv DY7nQU7lj2+25vcFZxFvOFY= X-Google-Smtp-Source: ABdhPJxEE6lvaPdy3hU36wODc6jVPrBk45SRVqFfz1PSofo7RMf8IJilOgQVBbS0DqU5EH76cSxAHQ== X-Received: by 2002:a17:90a:b790:: with SMTP id m16mr4666099pjr.149.1605300865815; Fri, 13 Nov 2020 12:54:25 -0800 (PST) Received: from localhost.localdomain (c-107-3-138-210.hsd1.ca.comcast.net. [107.3.138.210]) by smtp.gmail.com with ESMTPSA id a18sm3780234pfa.151.2020.11.13.12.54.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Nov 2020 12:54:24 -0800 (PST) From: Yang Shi To: mhocko@suse.com, ziy@nvidia.com, songliubraving@fb.com, mgorman@suse.de, jack@suse.cz, willy@infradead.org, akpm@linux-foundation.org Cc: shy828301@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [v3 PATCH 5/5] mm: migrate: return -ENOSYS if THP migration is unsupported Date: Fri, 13 Nov 2020 12:53:59 -0800 Message-Id: <20201113205359.556831-6-shy828301@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20201113205359.556831-1-shy828301@gmail.com> References: <20201113205359.556831-1-shy828301@gmail.com> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: In the current implementation unmap_and_move() would return -ENOMEM if THP migration is unsupported, then the THP will be split. If split is failed just exit without trying to migrate other pages. It doesn't make too much sense since there may be enough free memory to migrate other pages and there may be a lot base pages on the list. Return -ENOSYS to make consistent with hugetlb. And if THP split is failed just skip and try other pages on the list. Just skip the whole list and exit when free memory is really low. Signed-off-by: Yang Shi --- mm/migrate.c | 62 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/mm/migrate.c b/mm/migrate.c index 4d3d173a1706..344ac645c1f1 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -1172,7 +1172,7 @@ static int unmap_and_move(new_page_t get_new_page, struct page *newpage = NULL; if (!thp_migration_supported() && PageTransHuge(page)) - return -ENOMEM; + return -ENOSYS; if (page_count(page) == 1) { /* page was freed from under us. So we are done. */ @@ -1376,6 +1376,20 @@ static int unmap_and_move_huge_page(new_page_t get_new_page, return rc; } +static inline int try_split_thp(struct page *page, struct page **page2, + struct list_head *from) +{ + int rc = 0; + + lock_page(page); + rc = split_huge_page_to_list(page, from); + unlock_page(page); + if (!rc) + list_safe_reset_next(page, *page2, lru); + + return rc; +} + /* * migrate_pages - migrate the pages specified in a list, to the free pages * supplied as the target for the page migration @@ -1453,24 +1467,40 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, * from list */ switch(rc) { + /* + * THP migration might be unsupported or the + * allocation could've failed so we should + * retry on the same page with the THP split + * to base pages. + * + * Head page is retried immediately and tail + * pages are added to the tail of the list so + * we encounter them after the rest of the list + * is processed. + */ + case -ENOSYS: + /* THP migration is unsupported */ + if (is_thp) { + if (!try_split_thp(page, &page2, from)) { + nr_thp_split++; + goto retry; + } + + nr_thp_failed++; + nr_failed += nr_subpages; + break; + } + + /* Hugetlb migration is unsupported */ + nr_failed++; + break; case -ENOMEM: /* - * THP migration might be unsupported or the - * allocation could've failed so we should - * retry on the same page with the THP split - * to base pages. - * - * Head page is retried immediately and tail - * pages are added to the tail of the list so - * we encounter them after the rest of the list - * is processed. + * When memory is low, don't bother to try to migrate + * other pages, just exit. */ if (is_thp) { - lock_page(page); - rc = split_huge_page_to_list(page, from); - unlock_page(page); - if (!rc) { - list_safe_reset_next(page, page2, lru); + if (!try_split_thp(page, &page2, from)) { nr_thp_split++; goto retry; } @@ -1498,7 +1528,7 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, break; default: /* - * Permanent failure (-EBUSY, -ENOSYS, etc.): + * Permanent failure (-EBUSY, etc.): * unlike -EAGAIN case, the failed page is * removed from migration page list and not * retried in the next outer loop.