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=-11.2 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 1BB73C2D0A3 for ; Wed, 4 Nov 2020 17:42:18 +0000 (UTC) Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 162F2206F1 for ; Wed, 4 Nov 2020 17:42:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 162F2206F1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 4CRDVt4SbHzDqdX for ; Thu, 5 Nov 2020 04:42:14 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=suse.cz (client-ip=195.135.220.15; helo=mx2.suse.de; envelope-from=vbabka@suse.cz; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.cz Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4CRDSw6S9ZzDqLT for ; Thu, 5 Nov 2020 04:40:32 +1100 (AEDT) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id D157CAC92; Wed, 4 Nov 2020 17:40:29 +0000 (UTC) Subject: Re: [PATCH v4 2/4] PM: hibernate: make direct map manipulations more explicit To: Mike Rapoport , Andrew Morton References: <20201103162057.22916-1-rppt@kernel.org> <20201103162057.22916-3-rppt@kernel.org> From: Vlastimil Babka Message-ID: <9a0780b4-35f8-0ded-c473-d8ab4a26ade5@suse.cz> Date: Wed, 4 Nov 2020 18:40:28 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.4.0 MIME-Version: 1.0 In-Reply-To: <20201103162057.22916-3-rppt@kernel.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Rafael J . Wysocki" , David Hildenbrand , Peter Zijlstra , Dave Hansen , linux-mm@kvack.org, Paul Mackerras , Pavel Machek , "H. Peter Anvin" , sparclinux@vger.kernel.org, Christoph Lameter , Will Deacon , linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, x86@kernel.org, Mike Rapoport , Christian Borntraeger , Ingo Molnar , Catalin Marinas , Len Brown , Albert Ou , Vasily Gorbik , linux-pm@vger.kernel.org, Heiko Carstens , David Rientjes , Borislav Petkov , Andy Lutomirski , Paul Walmsley , "Kirill A. Shutemov" , Thomas Gleixner , linux-arm-kernel@lists.infradead.org, "Rafael J. Wysocki" , linux-kernel@vger.kernel.org, Pekka Enberg , Palmer Dabbelt , Joonsoo Kim , "Edgecombe, Rick P" , linuxppc-dev@lists.ozlabs.org, "David S. Miller" , "Kirill A . Shutemov" Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" On 11/3/20 5:20 PM, Mike Rapoport wrote: > From: Mike Rapoport > > When DEBUG_PAGEALLOC or ARCH_HAS_SET_DIRECT_MAP is enabled a page may be > not present in the direct map and has to be explicitly mapped before it > could be copied. > > Introduce hibernate_map_page() that will explicitly use > set_direct_map_{default,invalid}_noflush() for ARCH_HAS_SET_DIRECT_MAP case > and debug_pagealloc_map_pages() for DEBUG_PAGEALLOC case. > > The remapping of the pages in safe_copy_page() presumes that it only > changes protection bits in an existing PTE and so it is safe to ignore > return value of set_direct_map_{default,invalid}_noflush(). > > Still, add a pr_warn() so that future changes in set_memory APIs will not > silently break hibernation. > > Signed-off-by: Mike Rapoport > Acked-by: Rafael J. Wysocki > Reviewed-by: David Hildenbrand > Acked-by: Kirill A. Shutemov Acked-by: Vlastimil Babka The bool param is a bit more acceptable here, being a private API. But if debug_pagealloc_map_pages() becomes split, then it might be easier to split this one too... > --- > include/linux/mm.h | 12 ------------ > kernel/power/snapshot.c | 32 ++++++++++++++++++++++++++++++-- > 2 files changed, 30 insertions(+), 14 deletions(-) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 1fc0609056dc..14e397f3752c 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -2927,16 +2927,6 @@ static inline bool debug_pagealloc_enabled_static(void) > #if defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_ARCH_HAS_SET_DIRECT_MAP) > extern void __kernel_map_pages(struct page *page, int numpages, int enable); > > -/* > - * When called in DEBUG_PAGEALLOC context, the call should most likely be > - * guarded by debug_pagealloc_enabled() or debug_pagealloc_enabled_static() > - */ > -static inline void > -kernel_map_pages(struct page *page, int numpages, int enable) > -{ > - __kernel_map_pages(page, numpages, enable); > -} > - > static inline void debug_pagealloc_map_pages(struct page *page, > int numpages, int enable) > { > @@ -2948,8 +2938,6 @@ static inline void debug_pagealloc_map_pages(struct page *page, > extern bool kernel_page_present(struct page *page); > #endif /* CONFIG_HIBERNATION */ > #else /* CONFIG_DEBUG_PAGEALLOC || CONFIG_ARCH_HAS_SET_DIRECT_MAP */ > -static inline void > -kernel_map_pages(struct page *page, int numpages, int enable) {} > static inline void debug_pagealloc_map_pages(struct page *page, > int numpages, int enable) {} > #ifdef CONFIG_HIBERNATION > diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c > index 46b1804c1ddf..57d54b9d84bb 100644 > --- a/kernel/power/snapshot.c > +++ b/kernel/power/snapshot.c > @@ -76,6 +76,34 @@ static inline void hibernate_restore_protect_page(void *page_address) {} > static inline void hibernate_restore_unprotect_page(void *page_address) {} > #endif /* CONFIG_STRICT_KERNEL_RWX && CONFIG_ARCH_HAS_SET_MEMORY */ > > +static inline void hibernate_map_page(struct page *page, int enable) > +{ > + if (IS_ENABLED(CONFIG_ARCH_HAS_SET_DIRECT_MAP)) { > + unsigned long addr = (unsigned long)page_address(page); > + int ret; > + > + /* > + * This should not fail because remapping a page here means > + * that we only update protection bits in an existing PTE. > + * It is still worth to have a warning here if something > + * changes and this will no longer be the case. > + */ > + if (enable) > + ret = set_direct_map_default_noflush(page); > + else > + ret = set_direct_map_invalid_noflush(page); > + > + if (ret) { > + pr_warn_once("Failed to remap page\n"); > + return; > + } > + > + flush_tlb_kernel_range(addr, addr + PAGE_SIZE); > + } else { > + debug_pagealloc_map_pages(page, 1, enable); > + } > +} > + > static int swsusp_page_is_free(struct page *); > static void swsusp_set_page_forbidden(struct page *); > static void swsusp_unset_page_forbidden(struct page *); > @@ -1355,9 +1383,9 @@ static void safe_copy_page(void *dst, struct page *s_page) > if (kernel_page_present(s_page)) { > do_copy_page(dst, page_address(s_page)); > } else { > - kernel_map_pages(s_page, 1, 1); > + hibernate_map_page(s_page, 1); > do_copy_page(dst, page_address(s_page)); > - kernel_map_pages(s_page, 1, 0); > + hibernate_map_page(s_page, 0); > } > } > >