From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, NICE_REPLY_A,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8B3D1C433E2 for ; Thu, 3 Sep 2020 21:58:47 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 340E820797 for ; Thu, 3 Sep 2020 21:58:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="cgMLLtkB" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 340E820797 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=linux-foundation.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id AA40A6B0070; Thu, 3 Sep 2020 17:58:46 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A550A6B0071; Thu, 3 Sep 2020 17:58:46 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 94369900002; Thu, 3 Sep 2020 17:58:46 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0180.hostedemail.com [216.40.44.180]) by kanga.kvack.org (Postfix) with ESMTP id 7E3926B0070 for ; Thu, 3 Sep 2020 17:58:46 -0400 (EDT) Received: from smtpin15.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 4FCD2181AC9C6 for ; Thu, 3 Sep 2020 21:58:46 +0000 (UTC) X-FDA: 77223115452.15.oven56_3f07cc5270ad Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin15.hostedemail.com (Postfix) with ESMTP id 1E2151814B0C1 for ; Thu, 3 Sep 2020 21:58:46 +0000 (UTC) X-HE-Tag: oven56_3f07cc5270ad X-Filterd-Recvd-Size: 8344 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by imf01.hostedemail.com (Postfix) with ESMTP for ; Thu, 3 Sep 2020 21:58:45 +0000 (UTC) Received: from X1 (nat-ab2241.sltdut.senawave.net [162.218.216.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 7CF0C20716; Thu, 3 Sep 2020 21:58:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1599170324; bh=EC6CX/KNbyV5W8h0mO8/qnp463DvcqyLD4Qi+RZkZ3A=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=cgMLLtkB0q10Wzr9BigkKgUusENFyE6b3jgBsEBwETtXsJhVWIZ8aTg4F7vcDisgt ZM/vym9XXALvf+N5mRSPUgcVn0BnRqvTOFhNxmqHlGJv6L9SD3RdFne2ylBcsXtU6c K45oP0eMLmZZjxmr47KwuTSglDNjivNxK5txXizk= Date: Thu, 3 Sep 2020 14:58:44 -0700 From: Andrew Morton To: David Hildenbrand Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Michal Hocko , Wei Yang , Baoquan He , Pankaj Gupta , Oscar Salvador Subject: Re: [PATCH v2 03/10] mm/memory_hotplug: simplify page offlining Message-Id: <20200903145844.2ead558f5bc3ef3d5230d30f@linux-foundation.org> In-Reply-To: <20200819175957.28465-4-david@redhat.com> References: <20200819175957.28465-1-david@redhat.com> <20200819175957.28465-4-david@redhat.com> X-Mailer: Sylpheed 3.5.1 (GTK+ 2.24.32; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: 1E2151814B0C1 X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam03 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: On Wed, 19 Aug 2020 19:59:50 +0200 David Hildenbrand wrote: > We make sure that we cannot have any memory holes right at the beginning > of offline_pages(). We no longer need walk_system_ram_range() and can > call test_pages_isolated() and __offline_isolated_pages() directly. > > offlined_pages always corresponds to nr_pages, so we can simplify that. This patch ran afoul of Pavel's "mm/memory_hotplug: drain per-cpu pages again during memory offline", here: > @@ -1481,7 +1459,7 @@ static int count_system_ram_pages_cb(unsigned long start_pfn, > int __ref offline_pages(unsigned long start_pfn, unsigned long nr_pages) > { > const unsigned long end_pfn = start_pfn + nr_pages; > - unsigned long pfn, system_ram_pages = 0, offlined_pages = 0; > + unsigned long pfn, system_ram_pages = 0; > int ret, node, nr_isolate_pageblock; > unsigned long flags; > struct zone *zone; > @@ -1579,16 +1557,12 @@ int __ref offline_pages(unsigned long start_pfn, unsigned long nr_pages) > reason = "failure to dissolve huge pages"; > goto failed_removal_isolated; > } > - /* check again */ > - ret = walk_system_ram_range(start_pfn, end_pfn - start_pfn, > - NULL, check_pages_isolated_cb); > - } while (ret); > - > - /* Ok, all of our target is isolated. > - We cannot do rollback at this point. */ > - walk_system_ram_range(start_pfn, end_pfn - start_pfn, > - &offlined_pages, offline_isolated_pages_cb); > - pr_info("Offlined Pages %ld\n", offlined_pages); > + } while (test_pages_isolated(start_pfn, end_pfn, MEMORY_OFFLINE)); > + > + /* Mark all sections offline and remove free pages from the buddy. */ > + __offline_isolated_pages(start_pfn, end_pfn); > + pr_info("Offlined Pages %ld\n", nr_pages); > + > /* > * Onlining will reset pagetype flags and makes migrate type I did this. Looks OK? From: David Hildenbrand Subject: mm/memory_hotplug: simplify page offlining We make sure that we cannot have any memory holes right at the beginning of offline_pages(). We no longer need walk_system_ram_range() and can call test_pages_isolated() and __offline_isolated_pages() directly. offlined_pages always corresponds to nr_pages, so we can simplify that. Link: https://lkml.kernel.org/r/20200819175957.28465-4-david@redhat.com Signed-off-by: David Hildenbrand Acked-by: Michal Hocko Reviewed-by: Oscar Salvador Cc: Wei Yang Cc: Baoquan He Cc: Pankaj Gupta Cc: Charan Teja Reddy Cc: Dan Williams Cc: Fenghua Yu Cc: Logan Gunthorpe Cc: "Matthew Wilcox (Oracle)" Cc: Mel Gorman Cc: Mel Gorman Cc: Michel Lespinasse Cc: Mike Rapoport Cc: Tony Luck Signed-off-by: Andrew Morton --- mm/memory_hotplug.c | 61 +++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 36 deletions(-) --- a/mm/memory_hotplug.c~mm-memory_hotplug-simplify-page-offlining +++ a/mm/memory_hotplug.c @@ -1383,28 +1383,6 @@ do_migrate_range(unsigned long start_pfn return ret; } -/* Mark all sections offline and remove all free pages from the buddy. */ -static int -offline_isolated_pages_cb(unsigned long start, unsigned long nr_pages, - void *data) -{ - unsigned long *offlined_pages = (unsigned long *)data; - - *offlined_pages += __offline_isolated_pages(start, start + nr_pages); - return 0; -} - -/* - * Check all pages in range, recorded as memory resource, are isolated. - */ -static int -check_pages_isolated_cb(unsigned long start_pfn, unsigned long nr_pages, - void *data) -{ - return test_pages_isolated(start_pfn, start_pfn + nr_pages, - MEMORY_OFFLINE); -} - static int __init cmdline_parse_movable_node(char *p) { movable_node_enabled = true; @@ -1491,7 +1469,7 @@ static int count_system_ram_pages_cb(uns int __ref offline_pages(unsigned long start_pfn, unsigned long nr_pages) { const unsigned long end_pfn = start_pfn + nr_pages; - unsigned long pfn, system_ram_pages = 0, offlined_pages = 0; + unsigned long pfn, system_ram_pages = 0; int ret, node, nr_isolate_pageblock; unsigned long flags; struct zone *zone; @@ -1589,16 +1567,27 @@ int __ref offline_pages(unsigned long st reason = "failure to dissolve huge pages"; goto failed_removal_isolated; } - /* check again */ - ret = walk_system_ram_range(start_pfn, end_pfn - start_pfn, - NULL, check_pages_isolated_cb); - } while (ret); - - /* Ok, all of our target is isolated. - We cannot do rollback at this point. */ - walk_system_ram_range(start_pfn, end_pfn - start_pfn, - &offlined_pages, offline_isolated_pages_cb); - pr_info("Offlined Pages %ld\n", offlined_pages); + + /* + * per-cpu pages are drained in start_isolate_page_range, but if + * there are still pages that are not free, make sure that we + * drain again, because when we isolated range we might + * have raced with another thread that was adding pages to pcp + * list. + * + * Forward progress should be still guaranteed because + * pages on the pcp list can only belong to MOVABLE_ZONE + * because has_unmovable_pages explicitly checks for + * PageBuddy on freed pages on other zones. + */ + if (ret) + drain_all_pages(zone); + } while (test_pages_isolated(start_pfn, end_pfn, MEMORY_OFFLINE)); + + /* Mark all sections offline and remove free pages from the buddy. */ + __offline_isolated_pages(start_pfn, end_pfn); + pr_info("Offlined Pages %ld\n", nr_pages); + /* * Onlining will reset pagetype flags and makes migrate type * MOVABLE, so just need to decrease the number of isolated @@ -1609,11 +1598,11 @@ int __ref offline_pages(unsigned long st spin_unlock_irqrestore(&zone->lock, flags); /* removal success */ - adjust_managed_page_count(pfn_to_page(start_pfn), -offlined_pages); - zone->present_pages -= offlined_pages; + adjust_managed_page_count(pfn_to_page(start_pfn), -nr_pages); + zone->present_pages -= nr_pages; pgdat_resize_lock(zone->zone_pgdat, &flags); - zone->zone_pgdat->node_present_pages -= offlined_pages; + zone->zone_pgdat->node_present_pages -= nr_pages; pgdat_resize_unlock(zone->zone_pgdat, &flags); init_per_zone_wmark_min(); _