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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 276DEC4321E for ; Thu, 17 Nov 2022 14:00:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240087AbiKQOAC (ORCPT ); Thu, 17 Nov 2022 09:00:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38144 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233179AbiKQN77 (ORCPT ); Thu, 17 Nov 2022 08:59:59 -0500 Received: from xry111.site (xry111.site [89.208.246.23]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A8FC212616; Thu, 17 Nov 2022 05:59:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1668693594; bh=BEJkus9SbXI3rKcbLiusL3L/dHDxpMdZ5fUjakFE5MU=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=fj+2TDqFTLoW0xpGUKDdR4O0EJmxgcAAhzsN6IWl84bp2UrCUiSCFFj7GsZ6VVtSJ TlGzYQSwv885crsUiOzQEkIScGNu2ysES5vM7iRBS+ba0rkZzOPD7nBEMje883XPpc eeeWtnq8f3/np6PrlvYOggWTi9TJ4e9bCdDjoc2w= Received: from localhost.localdomain (xry111.site [IPv6:2001:470:683e::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id ACC0D6692F; Thu, 17 Nov 2022 08:59:51 -0500 (EST) Message-ID: Subject: Re: [PATCH 04/47] LoongArch: Set _PAGE_DIRTY only if _PAGE_WRITE is set in {pmd,pte}_mkdirty() From: Xi Ruoyao To: Huacai Chen , Huacai Chen Cc: loongarch@lists.linux.dev, Xuefeng Li , Guo Ren , Xuerui Wang , Jiaxun Yang , "David S . Miller" , sparclinux@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, Peter Xu Date: Thu, 17 Nov 2022 21:59:49 +0800 In-Reply-To: <20221117042532.4064448-1-chenhuacai@loongson.cn> References: <20221117042532.4064448-1-chenhuacai@loongson.cn> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.46.0 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Huacai, On Thu, 2022-11-17 at 12:25 +0800, Huacai Chen wrote: > Now {pmd,pte}_mkdirty() set _PAGE_DIRTY bit unconditionally, this causes > random segmentation fault after commit 0ccf7f168e17bb7e ("mm/thp: carry > over dirty bit when thp splits on pmd"). Hmm, the pte_mkdirty call is already removed in commit 624a2c94f5b7a081 ("Partly revert \"mm/thp: carry over dirty bit when thp splits on pmd\""). Not sure if this issue is related to some random segfaults I've observed recently though. My last kernel build contains 0ccf7f168e17bb7e but does not contain 624a2c94f5b7a081. >=20 > The reason is: when fork(), parent process use pmd_wrprotect() to clear > huge page's _PAGE_WRITE and _PAGE_DIRTY (for COW); then pte_mkdirty() set > _PAGE_DIRTY as well as _PAGE_MODIFIED while splitting dirty huge pages; > once _PAGE_DIRTY is set, there will be no tlb modify exception so the COW > machanism fails; and at last memory corruption occurred between parent > and child processes. >=20 > So, we should set _PAGE_DIRTY only when _PAGE_WRITE is set in {pmd,pte}_ > mkdirty(). >=20 > Cc: stable@vger.kernel.org > Cc: Peter Xu > Signed-off-by: Huacai Chen > --- > Note: CC sparc maillist because they have similar issues. > =C2=A0 > =C2=A0arch/loongarch/include/asm/pgtable.h | 8 ++++++-- > =C2=A01 file changed, 6 insertions(+), 2 deletions(-) >=20 > diff --git a/arch/loongarch/include/asm/pgtable.h b/arch/loongarch/includ= e/asm/pgtable.h > index 946704bee599..debbe116f105 100644 > --- a/arch/loongarch/include/asm/pgtable.h > +++ b/arch/loongarch/include/asm/pgtable.h > @@ -349,7 +349,9 @@ static inline pte_t pte_mkclean(pte_t pte) > =C2=A0 > =C2=A0static inline pte_t pte_mkdirty(pte_t pte) > =C2=A0{ > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pte_val(pte) |=3D (_PAGE_DIRTY= | _PAGE_MODIFIED); > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pte_val(pte) |=3D _PAGE_MODIFI= ED; > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (pte_val(pte) & _PAGE_WRITE= ) > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0pte_val(pte) |=3D _PAGE_DIRTY; > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return pte; > =C2=A0} > =C2=A0 > @@ -478,7 +480,9 @@ static inline pmd_t pmd_mkclean(pmd_t pmd) > =C2=A0 > =C2=A0static inline pmd_t pmd_mkdirty(pmd_t pmd) > =C2=A0{ > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pmd_val(pmd) |=3D (_PAGE_DIRTY= | _PAGE_MODIFIED); > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pmd_val(pmd) |=3D _PAGE_MODIFI= ED; > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (pmd_val(pmd) & _PAGE_WRITE= ) > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0pmd_val(pmd) |=3D _PAGE_DIRTY; > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return pmd; > =C2=A0} > =C2=A0 --=20 Xi Ruoyao School of Aerospace Science and Technology, Xidian University