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=-12.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT 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 4E5C3C433E2 for ; Thu, 3 Sep 2020 14:01:04 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id F3571206A5 for ; Thu, 3 Sep 2020 14:01:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=soleen.com header.i=@soleen.com header.b="fFFFaWm8" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org F3571206A5 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=soleen.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 616856B005D; Thu, 3 Sep 2020 10:01:03 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5A00E6B0062; Thu, 3 Sep 2020 10:01:03 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4688B6B0068; Thu, 3 Sep 2020 10:01:03 -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 2E2B16B005D for ; Thu, 3 Sep 2020 10:01:03 -0400 (EDT) Received: from smtpin14.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id D90072C8F for ; Thu, 3 Sep 2020 14:01:02 +0000 (UTC) X-FDA: 77221911564.14.hose37_371499f270aa Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin14.hostedemail.com (Postfix) with ESMTP id B8A0E18227CF0 for ; Thu, 3 Sep 2020 14:00:42 +0000 (UTC) X-HE-Tag: hose37_371499f270aa X-Filterd-Recvd-Size: 6610 Received: from mail-qv1-f66.google.com (mail-qv1-f66.google.com [209.85.219.66]) by imf28.hostedemail.com (Postfix) with ESMTP for ; Thu, 3 Sep 2020 14:00:35 +0000 (UTC) Received: by mail-qv1-f66.google.com with SMTP id x7so1347624qvi.5 for ; Thu, 03 Sep 2020 07:00:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=soleen.com; s=google; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=JZfJMp3zvHnMX4z50lv6bmh7AfNeSTMMAnF/ge8iWQ4=; b=fFFFaWm86MoOYysgjFdRdEJebs//BYwO9Lze/0DkLVNck4XsEeYuVtCq9E7IFgUgxf kf6Y2eUZcXf4JuXDS9L5UlKYprM2ShOtHsb7EWscI7WAFPm8SjDAmMFkbn60QfhHfXwi 1/YIivtfIcyjlhVS9SfytTJMGJc/z53TkmDUXvFvlsyzqn7z5+UxFf2V73xsI5OWdvUf iqjppvJcTaLyGtRlhJLi6bAGvuCFoSpjJhVRRJeKimlNmEgxG4A0zJTjhypWbU5nXgjA TKjG2wh5npKd3+Sp/VkHQmzBsQIppMCXbYv3eAI+VUQWKC+RzCjtLTGrUTcDelMbQIcv FgOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=JZfJMp3zvHnMX4z50lv6bmh7AfNeSTMMAnF/ge8iWQ4=; b=NrHksWB14P7rCv83smxm7e4x56CgTwCC/45eMArRBSnYlVSd7xMp/0i0aRZixErArB V5WM4lejg2gCRsUulXJqixVqAaIpQ6T2UWHJ2ajT85hKNrdWqOW6K7GB4Od8NWG+IN7q se2Cc6nsQT76Djmt+aRBJ6gAaXLA4iEqkT6ZoP7c1f8szzvVu/hN/A8BKb2lWg9gFVXp NzPTs8PcZRCJQLyreBe9/4HxiMKu1E4yES0j//GyxvAIz9L/5EKdr7GLIs9k9eoKghXo bu2C6hyLLXs++DhUZ5yj8EZtfAgfZo0ETQyO+Y8evBsm6c+NSna0Y5fp9YCAwRF+SumA zTgg== X-Gm-Message-State: AOAM532CeIyduSysksMLqnHm5WuEmKp4cYv0D1xHw8L9ZkAHyyqzXq0U jcp28rDInx5ov7hsN55awcIH1w== X-Google-Smtp-Source: ABdhPJxxigHbFeETjldLKaHP1TgreulryDFBuVc+XRnTZ2BDbcXWM2LjeXD3sEZktvaPAokzh6fRGA== X-Received: by 2002:ad4:51d1:: with SMTP id p17mr2953984qvq.14.1599141634366; Thu, 03 Sep 2020 07:00:34 -0700 (PDT) Received: from localhost.localdomain (c-73-69-118-222.hsd1.nh.comcast.net. [73.69.118.222]) by smtp.gmail.com with ESMTPSA id k6sm2104899qti.23.2020.09.03.07.00.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Sep 2020 07:00:33 -0700 (PDT) From: Pavel Tatashin To: linux-kernel@vger.kernel.org, akpm@linux-foundation.org, mhocko@suse.com, linux-mm@kvack.org, pasha.tatashin@soleen.com, osalvador@suse.de, richard.weiyang@gmail.com, david@redhat.com, vbabka@suse.cz, rientjes@google.com Subject: [PATCH v2] mm/memory_hotplug: drain per-cpu pages again during memory offline Date: Thu, 3 Sep 2020 10:00:32 -0400 Message-Id: <20200903140032.380431-1-pasha.tatashin@soleen.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Rspamd-Queue-Id: B8A0E18227CF0 X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam02 Content-Transfer-Encoding: quoted-printable 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: There is a race during page offline that can lead to infinite loop: a page never ends up on a buddy list and __offline_pages() keeps retrying infinitely or until a termination signal is received. Thread#1 - a new process: load_elf_binary begin_new_exec exec_mmap mmput exit_mmap tlb_finish_mmu tlb_flush_mmu release_pages free_unref_page_list free_unref_page_prepare set_pcppage_migratetype(page, migratetype); // Set page->index migration type below MIGRATE_PCPTYPES Thread#2 - hot-removes memory __offline_pages start_isolate_page_range set_migratetype_isolate set_pageblock_migratetype(page, MIGRATE_ISOLATE); Set migration type to MIGRATE_ISOLATE-> set drain_all_pages(zone); // drain per-cpu page lists to buddy allocator. Thread#1 - continue free_unref_page_commit migratetype =3D get_pcppage_migratetype(page); // get old migration type list_add(&page->lru, &pcp->lists[migratetype]); // add new page to already drained pcp list Thread#2 Never drains pcp again, and therefore gets stuck in the loop. The fix is to try to drain per-cpu lists again after check_pages_isolated_cb() fails. Fixes: c52e75935f8d ("mm: remove extra drain pages on pcp list") Signed-off-by: Pavel Tatashin Cc: stable@vger.kernel.org Acked-by: David Rientjes Acked-by: Vlastimil Babka --- mm/memory_hotplug.c | 14 ++++++++++++++ mm/page_isolation.c | 8 ++++++++ 2 files changed, 22 insertions(+) diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index e9d5ab5d3ca0..b11a269e2356 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1575,6 +1575,20 @@ static int __ref __offline_pages(unsigned long sta= rt_pfn, /* check again */ ret =3D walk_system_ram_range(start_pfn, end_pfn - start_pfn, NULL, check_pages_isolated_cb); + /* + * 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 (ret); =20 /* Ok, all of our target is isolated. diff --git a/mm/page_isolation.c b/mm/page_isolation.c index 242c03121d73..63a3db10a8c0 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c @@ -170,6 +170,14 @@ __first_valid_page(unsigned long pfn, unsigned long = nr_pages) * pageblocks we may have modified and return -EBUSY to caller. This * prevents two threads from simultaneously working on overlapping range= s. * + * Please note that there is no strong synchronization with the page all= ocator + * either. Pages might be freed while their page blocks are marked ISOLA= TED. + * In some cases pages might still end up on pcp lists and that would al= low + * for their allocation even when they are in fact isolated already. Dep= ending + * on how strong of a guarantee the caller needs drain_all_pages might b= e needed + * (e.g. __offline_pages will need to call it after check for isolated r= ange for + * a next retry). + * * Return: the number of isolated pageblocks on success and -EBUSY if an= y part * of range cannot be isolated. */ --=20 2.25.1