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=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 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 0EBC6C35240 for ; Fri, 31 Jan 2020 11:33:17 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id CD07A20CC7 for ; Fri, 31 Jan 2020 11:33:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CD07A20CC7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 542FC6B05BC; Fri, 31 Jan 2020 06:33:16 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 4F3AE6B05BD; Fri, 31 Jan 2020 06:33:16 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3E2736B05BE; Fri, 31 Jan 2020 06:33:16 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0161.hostedemail.com [216.40.44.161]) by kanga.kvack.org (Postfix) with ESMTP id 27A3F6B05BC for ; Fri, 31 Jan 2020 06:33:16 -0500 (EST) Received: from smtpin27.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id CC5832495 for ; Fri, 31 Jan 2020 11:33:15 +0000 (UTC) X-FDA: 76437718350.27.cub18_3981724580f29 X-HE-Tag: cub18_3981724580f29 X-Filterd-Recvd-Size: 4242 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf03.hostedemail.com (Postfix) with ESMTP for ; Fri, 31 Jan 2020 11:33:15 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id D994C1063; Fri, 31 Jan 2020 03:33:13 -0800 (PST) Received: from arm.com (e112269-lin.cambridge.arm.com [10.1.194.52]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3476B3F67D; Fri, 31 Jan 2020 03:33:13 -0800 (PST) Date: Fri, 31 Jan 2020 11:33:08 +0000 From: Steven Price To: Thomas =?iso-8859-1?Q?Hellstr=F6m_=28VMware=29?= Cc: "linux-mm@kvack.org" , "linux-kernel@vger.kernel.org" , Thomas Hellstrom Subject: Re: [PATCH] mm/mapping_dirty_helpers: Update huge page-table entry callbacks Message-ID: <20200131113307.GA34020@arm.com> References: <20200131100052.58761-1-thomas_os@shipmail.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <20200131100052.58761-1-thomas_os@shipmail.org> User-Agent: Mutt/1.10.1 (2018-07-13) 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: On Fri, Jan 31, 2020 at 10:00:52AM +0000, Thomas Hellstr=F6m (VMware) wro= te: > From: Thomas Hellstrom >=20 > Following the update of pagewalk code > commit a07984d48146 ("mm: pagewalk: add p4d_entry() and pgd_entry()") > we can modify the mapping_dirty_helpers' huge page-table entry callback= s > to avoid splitting when a huge pud or -pmd is encountered. >=20 > Signed-off-by: Thomas Hellstrom > Cc: Steven Price LGTM Reviewed-by: Steven Price > --- > mm/mapping_dirty_helpers.c | 42 ++++++++++++++++++++++++++++++++++---- > 1 file changed, 38 insertions(+), 4 deletions(-) >=20 > diff --git a/mm/mapping_dirty_helpers.c b/mm/mapping_dirty_helpers.c > index 71070dda9643..2c7d03675903 100644 > --- a/mm/mapping_dirty_helpers.c > +++ b/mm/mapping_dirty_helpers.c > @@ -111,26 +111,60 @@ static int clean_record_pte(pte_t *pte, unsigned = long addr, > return 0; > } > =20 > -/* wp_clean_pmd_entry - The pagewalk pmd callback. */ > +/* > + * wp_clean_pmd_entry - The pagewalk pmd callback. > + * > + * Dirty-tracking should take place on the PTE level, so > + * WARN() if encountering a dirty huge pmd. > + * Furthermore, never split huge pmds, since that currently > + * causes dirty info loss. The pagefault handler should do > + * that if needed. > + */ > static int wp_clean_pmd_entry(pmd_t *pmd, unsigned long addr, unsigned= long end, > struct mm_walk *walk) > { > - /* Dirty-tracking should be handled on the pte level */ > pmd_t pmdval =3D pmd_read_atomic(pmd); > =20 > + if (!pmd_trans_unstable(&pmdval)) > + return 0; > + > + if (pmd_none(pmdval)) { > + walk->action =3D ACTION_AGAIN; > + return 0; > + } > + > + /* Huge pmd, present or migrated */ > + walk->action =3D ACTION_CONTINUE; > if (pmd_trans_huge(pmdval) || pmd_devmap(pmdval)) > WARN_ON(pmd_write(pmdval) || pmd_dirty(pmdval)); > =20 > return 0; > } > =20 > -/* wp_clean_pud_entry - The pagewalk pud callback. */ > +/* > + * wp_clean_pud_entry - The pagewalk pud callback. > + * > + * Dirty-tracking should take place on the PTE level, so > + * WARN() if encountering a dirty huge puds. > + * Furthermore, never split huge puds, since that currently > + * causes dirty info loss. The pagefault handler should do > + * that if needed. > + */ > static int wp_clean_pud_entry(pud_t *pud, unsigned long addr, unsigned= long end, > struct mm_walk *walk) > { > - /* Dirty-tracking should be handled on the pte level */ > pud_t pudval =3D READ_ONCE(*pud); > =20 > + if (!pud_trans_unstable(&pudval)) > + return 0; > + > + if (pud_none(pudval)) { > + walk->action =3D ACTION_AGAIN; > + return 0; > + } > + > + /* Huge pud */ > + walk->action =3D ACTION_CONTINUE; > if (pud_trans_huge(pudval) || pud_devmap(pudval)) > WARN_ON(pud_write(pudval) || pud_dirty(pudval)); > =20 > --=20 > 2.21.1 >=20