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=-7.0 required=3.0 tests=INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable 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 71B63C433E1 for ; Tue, 16 Jun 2020 12:44:02 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 3FBE82071A for ; Tue, 16 Jun 2020 12:44:02 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3FBE82071A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id A3F446B00A3; Tue, 16 Jun 2020 08:44:01 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9F0826B00A4; Tue, 16 Jun 2020 08:44:01 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8DE206B00A5; Tue, 16 Jun 2020 08:44:01 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0219.hostedemail.com [216.40.44.219]) by kanga.kvack.org (Postfix) with ESMTP id 6C82D6B00A3 for ; Tue, 16 Jun 2020 08:44:01 -0400 (EDT) Received: from smtpin28.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 15AC6181AC9BF for ; Tue, 16 Jun 2020 12:44:01 +0000 (UTC) X-FDA: 76935042282.28.view06_4f0f36526dff Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin28.hostedemail.com (Postfix) with ESMTP id C0D9E6C04 for ; Tue, 16 Jun 2020 12:44:00 +0000 (UTC) X-HE-Tag: view06_4f0f36526dff X-Filterd-Recvd-Size: 6066 Received: from mail-ej1-f67.google.com (mail-ej1-f67.google.com [209.85.218.67]) by imf02.hostedemail.com (Postfix) with ESMTP for ; Tue, 16 Jun 2020 12:43:59 +0000 (UTC) Received: by mail-ej1-f67.google.com with SMTP id dr13so21296751ejc.3 for ; Tue, 16 Jun 2020 05:43:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=L/I9TQBEt18OzZ/8w372CUMf0AE7xIJW6HydiiBZVb8=; b=BWWIrf/usrjC8btY+uGkXY+TVA15DNGKestK5u8DKoA5EGgdVmks2wMXXboE/8k52H ptPiRFOMJwpLKWfohjYWs3IHliSkD7+kHaLJ6k1gh0gdxx7AwgkqPMalMl5ie9E3gYeH By2YGU8ERn1MDyetz6ts3CNIz/iUdAFyVzTemJCLOXffdYzRFwieiUdLxLd6bXMcHoJ+ sTco2M/V8tdLtO2V1nl/EW/MB81aP/OFXLNn74jyuCXBK6vmHSncZeMqvK2tjVvg1fkv BYF0/BlRkNsBU58UkPMDFtMz4hZDXGBVwpZRPDz+IEwtx1yhn47k03wqpuN6KbMy6H2e /kUA== X-Gm-Message-State: AOAM530RGl5UMYzku5AYwE4paXaf4SxLMqPiI5o9yk9KVLi0ovjoPfaT Jr/yHOXF6p5DfyhGZEaOTXo= X-Google-Smtp-Source: ABdhPJzzAyauYgNSmpw+IUniLjnYlhQsdYeBtEWlAjFJ80fRrH/Ji3VgfQQzjLNyUooFZ5WvJKKVcg== X-Received: by 2002:a17:906:2a4d:: with SMTP id k13mr2679824eje.253.1592311438934; Tue, 16 Jun 2020 05:43:58 -0700 (PDT) Received: from localhost (ip-37-188-174-201.eurotel.cz. [37.188.174.201]) by smtp.gmail.com with ESMTPSA id i9sm10911153ejv.44.2020.06.16.05.43.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Jun 2020 05:43:58 -0700 (PDT) Date: Tue, 16 Jun 2020 14:43:57 +0200 From: Michal Hocko To: David Hildenbrand Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, stable@vger.kernel.org, Andrew Morton , Johannes Weiner , Minchan Kim , Huang Ying , Wei Yang , Mel Gorman Subject: Re: [PATCH v1 1/3] mm/shuffle: don't move pages between zones and don't read garbage memmaps Message-ID: <20200616124357.GG9499@dhcp22.suse.cz> References: <20200616115213.13109-1-david@redhat.com> <20200616115213.13109-2-david@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200616115213.13109-2-david@redhat.com> X-Rspamd-Queue-Id: C0D9E6C04 X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam01 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 Tue 16-06-20 13:52:11, David Hildenbrand wrote: > Especially with memory hotplug, we can have offline sections (with a > garbage memmap) and overlapping zones. We have to make sure to only > touch initialized memmaps (online sections managed by the buddy) and that > the zone matches, to not move pages between zones. > > To test if this can actually happen, I added a simple > BUG_ON(page_zone(page_i) != page_zone(page_j)); > right before the swap. When hotplugging a 256M DIMM to a 4G x86-64 VM and > onlining the first memory block "online_movable" and the second memory > block "online_kernel", it will trigger the BUG, as both zones (NORMAL > and MOVABLE) overlap. > > This might result in all kinds of weird situations (e.g., double > allocations, list corruptions, unmovable allocations ending up in the > movable zone). > > Fixes: e900a918b098 ("mm: shuffle initial free memory to improve memory-side-cache utilization") > Cc: stable@vger.kernel.org # v5.2+ > Cc: Andrew Morton > Cc: Johannes Weiner > Cc: Michal Hocko > Cc: Minchan Kim > Cc: Huang Ying > Cc: Wei Yang > Cc: Mel Gorman > Signed-off-by: David Hildenbrand Acked-by: Michal Hocko Thanks! > --- > mm/shuffle.c | 18 +++++++++--------- > 1 file changed, 9 insertions(+), 9 deletions(-) > > diff --git a/mm/shuffle.c b/mm/shuffle.c > index 44406d9977c77..dd13ab851b3ee 100644 > --- a/mm/shuffle.c > +++ b/mm/shuffle.c > @@ -58,25 +58,25 @@ module_param_call(shuffle, shuffle_store, shuffle_show, &shuffle_param, 0400); > * For two pages to be swapped in the shuffle, they must be free (on a > * 'free_area' lru), have the same order, and have the same migratetype. > */ > -static struct page * __meminit shuffle_valid_page(unsigned long pfn, int order) > +static struct page * __meminit shuffle_valid_page(struct zone *zone, > + unsigned long pfn, int order) > { > - struct page *page; > + struct page *page = pfn_to_online_page(pfn); > > /* > * Given we're dealing with randomly selected pfns in a zone we > * need to ask questions like... > */ > > - /* ...is the pfn even in the memmap? */ > - if (!pfn_valid_within(pfn)) > + /* ... is the page managed by the buddy? */ > + if (!page) > return NULL; > > - /* ...is the pfn in a present section or a hole? */ > - if (!pfn_in_present_section(pfn)) > + /* ... is the page assigned to the same zone? */ > + if (page_zone(page) != zone) > return NULL; > > /* ...is the page free and currently on a free_area list? */ > - page = pfn_to_page(pfn); > if (!PageBuddy(page)) > return NULL; > > @@ -123,7 +123,7 @@ void __meminit __shuffle_zone(struct zone *z) > * page_j randomly selected in the span @zone_start_pfn to > * @spanned_pages. > */ > - page_i = shuffle_valid_page(i, order); > + page_i = shuffle_valid_page(z, i, order); > if (!page_i) > continue; > > @@ -137,7 +137,7 @@ void __meminit __shuffle_zone(struct zone *z) > j = z->zone_start_pfn + > ALIGN_DOWN(get_random_long() % z->spanned_pages, > order_pages); > - page_j = shuffle_valid_page(j, order); > + page_j = shuffle_valid_page(z, j, order); > if (page_j && page_j != page_i) > break; > } > -- > 2.26.2 -- Michal Hocko SUSE Labs