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.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,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 466F1C433E0 for ; Tue, 16 Jun 2020 12:44:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 213672071A for ; Tue, 16 Jun 2020 12:44:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592311443; bh=ZJrkztEgCfuM4qbnb3ippuO1cdMPwl106+DZDSMQ0Po=; h=Date:From:To:Cc:Subject:References:In-Reply-To:List-ID:From; b=sdbT9WVY/jzwR9V0ENVTaKXZXR7Yi2IsBr35TPi0bUw8Dt34EyA2qN5+dSw9T++Rl +oSMnwZCJBtCcj3S7SL4hykLTGIJNaU47oKVbnt5Yqa3yzV07hYoni0OZwjaCYtyYX SiaUJD+0KwXqHU6RQVjyes6nu7bP1mbTIPSs+Lns= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728622AbgFPMoB (ORCPT ); Tue, 16 Jun 2020 08:44:01 -0400 Received: from mail-ej1-f65.google.com ([209.85.218.65]:45903 "EHLO mail-ej1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725843AbgFPMoB (ORCPT ); Tue, 16 Jun 2020 08:44:01 -0400 Received: by mail-ej1-f65.google.com with SMTP id o15so21307832ejm.12; 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=dAXQqUOiPwpURwSVG9oLhLCgp1WgO4WkZCm566k5yMKuK4NALvag4DxKfIOi7sqVJI 4BrthJdHzpaiRNgtVm7f+VMz7VfxTQWkHshazHyAcS3fwi9Ao2UWwIhdRah7n59NHwql gW9Dn0p2rR+MxfWUGp7/XRuzxL5ma/GtlmTiJO9w2HgrswsV0Nms+CmGDfihJtGu/xmL zbvcKzzJMEZc1ED3+LKipS3ufj2iB9QZvk6a4p5Hy+IxveWb67T7z8MLLgRs0NgRXI0S hj3sNyoraZCak1R6qaJgRqu1vYoyMuqN3w+C74EmUIDZb2RUNjLU1t0raHxKeiEnPLtQ 0/pg== X-Gm-Message-State: AOAM532p47F4IUj1Nb9zQKS9VY1MZ0RaxlFKgj/XMA0Tot5e3Tnm8pUB 7f4Oz/Xh4Qur6zHBIfP7Igga7ZdM 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> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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