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 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0AA58C433F5 for ; Mon, 25 Oct 2021 10:52:35 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 9C9A260EBD for ; Mon, 25 Oct 2021 10:52:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 9C9A260EBD Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvack.org Received: by kanga.kvack.org (Postfix) id 10C686B006C; Mon, 25 Oct 2021 06:52:34 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 094156B0072; Mon, 25 Oct 2021 06:52:34 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E773E940007; Mon, 25 Oct 2021 06:52:33 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0216.hostedemail.com [216.40.44.216]) by kanga.kvack.org (Postfix) with ESMTP id D96E86B006C for ; Mon, 25 Oct 2021 06:52:33 -0400 (EDT) Received: from smtpin28.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 9C9FC29DFF for ; Mon, 25 Oct 2021 10:52:33 +0000 (UTC) X-FDA: 78734646186.28.98AB14C Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) by imf18.hostedemail.com (Postfix) with ESMTP id 3F4A04002088 for ; Mon, 25 Oct 2021 10:52:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=In-Reply-To:Content-Type:MIME-Version: References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=37pEA9KAU9KSHTfwbmN3OIgu/ct9YJ/MS91p5yc7dvY=; b=cb20feDN+uNCfAtXD2CJVv0CzV ARZqjBAlXKlAWjRhdf1WilByn8mkbHBnYYIkJj/D5wmUfF69WIVPNVZ0syA5T1YcouXLPJiHjq5v4 bziNSKXDW2/d+1OpsN4MoZNAp6vmZ2wASFUpXH57Yn5lJQh68BG28vrltepXipF1FNKyOjrWXgZw1 lYCTqSh0tIK4/GjYPYTXJCIFgJN8FJr13szXlsq4DSOqs9URx7T42cS9fa6uo4rRmBbUbrd3TO5a/ b6eZD07pwSm7dLeEbLUnta1bman38CfzMbOSMUgJS7iEXhS9SMz+9HLvXTeEENX1mF5bMWICeQqxi iehKFzWQ==; Received: from j217100.upc-j.chello.nl ([24.132.217.100] helo=noisy.programming.kicks-ass.net) by desiato.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1mexac-00C86Z-BQ; Mon, 25 Oct 2021 10:52:26 +0000 Received: from hirez.programming.kicks-ass.net (hirez.programming.kicks-ass.net [192.168.1.225]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (Client did not present a certificate) by noisy.programming.kicks-ass.net (Postfix) with ESMTPS id F27D23003A9; Mon, 25 Oct 2021 12:52:25 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 1000) id DC17220C6C147; Mon, 25 Oct 2021 12:52:25 +0200 (CEST) Date: Mon, 25 Oct 2021 12:52:25 +0200 From: Peter Zijlstra To: Nadav Amit Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Nadav Amit , Andrea Arcangeli , Andrew Cooper , Andrew Morton , Andy Lutomirski , Dave Hansen , Peter Xu , Thomas Gleixner , Will Deacon , Yu Zhao , Nick Piggin , x86@kernel.org Subject: Re: [PATCH v2 2/5] mm: avoid unnecessary flush on change_huge_pmd() Message-ID: References: <20211021122112.592634-1-namit@vmware.com> <20211021122112.592634-3-namit@vmware.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20211021122112.592634-3-namit@vmware.com> X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: 3F4A04002088 X-Stat-Signature: 4u3rgis448qxahwwci6b9qpmwr89ym9h Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=infradead.org header.s=desiato.20200630 header.b=cb20feDN; dmarc=none; spf=none (imf18.hostedemail.com: domain of peterz@infradead.org has no SPF policy when checking 90.155.92.199) smtp.mailfrom=peterz@infradead.org X-HE-Tag: 1635159153-856370 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 Thu, Oct 21, 2021 at 05:21:09AM -0700, Nadav Amit wrote: > diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h > index 448cd01eb3ec..18c3366f8f4d 100644 > --- a/arch/x86/include/asm/pgtable.h > +++ b/arch/x86/include/asm/pgtable.h > @@ -1146,6 +1146,14 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma, > } > } > #endif > + > +#define __HAVE_ARCH_PMDP_INVALIDATE_AD > +static inline pmd_t pmdp_invalidate_ad(struct vm_area_struct *vma, > + unsigned long address, pmd_t *pmdp) > +{ > + return pmdp_establish(vma, address, pmdp, pmd_mkinvalid(*pmdp)); Did this want to be something like: pmd_t old = pmdp_establish(vma, address, pmdp, pmd_mkinvalid(*pmdp)); if (cpu_feature_enabled(X86_BUG_PTE_LEAK)) flush_pmd_tlb_range(vma, address, address + HPAGE_PMD_SIZE); return old; instead? > +} > + > /* > * Page table pages are page-aligned. The lower half of the top > * level is used for userspace and the top half for the kernel. > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index e5ea5f775d5c..435da011b1a2 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -1795,10 +1795,11 @@ int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, > * The race makes MADV_DONTNEED miss the huge pmd and don't clear it > * which may break userspace. > * > - * pmdp_invalidate() is required to make sure we don't miss > - * dirty/young flags set by hardware. > + * pmdp_invalidate_ad() is required to make sure we don't miss > + * dirty/young flags (which are also known as access/dirty) cannot be > + * further modifeid by the hardware. "modified", I think is the more common spelling. > */ > - entry = pmdp_invalidate(vma, addr, pmd); > + entry = pmdp_invalidate_ad(vma, addr, pmd); > > entry = pmd_modify(entry, newprot); > if (preserve_write) > diff --git a/mm/pgtable-generic.c b/mm/pgtable-generic.c > index 4e640baf9794..b0ce6c7391bf 100644 > --- a/mm/pgtable-generic.c > +++ b/mm/pgtable-generic.c > @@ -200,6 +200,14 @@ pmd_t pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, > } > #endif > > +#ifndef __HAVE_ARCH_PMDP_INVALIDATE_AD /* * Does this deserve a comment to explain the intended difference vs * pmdp_invalidate() ? */ > +pmd_t pmdp_invalidate_ad(struct vm_area_struct *vma, unsigned long address, > + pmd_t *pmdp) > +{ > + return pmdp_invalidate(vma, address, pmdp); > +} > +#endif > + > #ifndef pmdp_collapse_flush > pmd_t pmdp_collapse_flush(struct vm_area_struct *vma, unsigned long address, > pmd_t *pmdp) > -- > 2.25.1 >