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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1A6F7C3DA64 for ; Thu, 1 Aug 2024 14:47:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:In-Reply-To:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=ew0JmLU30DsugVwXX3fkPtRJq09DrXmLrubp4Kg+KSg=; b=CaTfZRoSQxjG27pqsNJ7ATe6Oo yCYXZjMztKONZHCRlYSUUjAxPeVQJSmT0mwLbd+57wYBG4S06kBicecVgH/6njYEoBrk8h5xfjK+r EBHJDuopDYrsESB9M6mOJgcElZJSquGESw6QywgP2FIz7RQUYVXBIUiOzN7xeFgvKGe+5wj/9NKPg u2CPYMhmSuERxwbEbbGv07LXwwkZkfqhClxWYfzjH0CdkGqN5C7t2ADsEMQ/xbVaXBNSkTiXL44ll oJNYkAIEuqMNYq/q2yoEilRPmDMp/0jYxH9vGC7rUSXbb8OcQHMbPZFZ8n3kOrDJF7paeuKdlnzrm cm7KlBpQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZX5M-00000005jpd-2wRI; Thu, 01 Aug 2024 14:47:20 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sZX4r-00000005jgw-2CSa for linux-arm-kernel@lists.infradead.org; Thu, 01 Aug 2024 14:46:51 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id E402B62381; Thu, 1 Aug 2024 14:46:48 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8C21DC32786; Thu, 1 Aug 2024 14:46:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722523608; bh=bPcFST2ekcj/0v3/PDTDbdq3NIbOxwJ+hdiAsR0MKy8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=JmLkxTzNBqt4gBpX3zxyLTxZ/eVW2SKiUcxfyw0NRd92KVj52HjXCK8hQnFTf1tpw ejmB78g3/8lQoXF9/YiL7GTQmrs2uzMbEMgrJlOE4OWpDz/xjNxTFcDkkNZisPm5Ja sRbUaaKXnTLpqUtY7plE1maySZxJwybt54lo9eVLwwTevUD+U/br2sJWiVXCfP2DXQ Tt16/z2hsLJWwoH9uXP+uN37naXI96+YhqBc+cwsR2PpQVYS8BCa4AYDpg/laxdPcm nr/RU1dkIk+CYWwQVbzJmfxn5RRKfbTFlD87EbKDOzVeFutlXTMSAu7UP0IdDA8O9F B9/w7SrcZ/FOw== Date: Thu, 1 Aug 2024 15:46:43 +0100 From: Will Deacon To: Ryan Roberts Cc: Anshuman Khandual , linux-arm-kernel@lists.infradead.org, Catalin Marinas , linux-kernel@vger.kernel.org Subject: Re: [PATCH] arm64/mm: Avoid direct referencing page table enties in map_range() Message-ID: <20240801144643.GA4980@willie-the-truck> References: <20240725091052.314750-1-anshuman.khandual@arm.com> <3e82687a-0183-42f3-b32c-6d99dbd4fe49@arm.com> <20240801113440.GB4476@willie-the-truck> <20240801132326.GA4794@willie-the-truck> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240801_074649_634573_07BFEE8E X-CRM114-Status: GOOD ( 14.99 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Thu, Aug 01, 2024 at 03:07:31PM +0100, Ryan Roberts wrote: > diff --git a/arch/arm64/kernel/pi/map_range.c b/arch/arm64/kernel/pi/map_range.c > index 5410b2cac5907..3f6c5717ff782 100644 > --- a/arch/arm64/kernel/pi/map_range.c > +++ b/arch/arm64/kernel/pi/map_range.c > @@ -55,13 +55,14 @@ void __init map_range(u64 *pte, u64 start, u64 end, u64 pa, pgprot_t prot, > * This chunk needs a finer grained mapping. Create a > * table mapping if necessary and recurse. > */ > - if (pte_none(*tbl)) { > - *tbl = __pte(__phys_to_pte_val(*pte) | > - PMD_TYPE_TABLE | PMD_TABLE_UXN); > + if (pte_none(__ptep_get(tbl))) { > + __set_pte_nosync(tbl, > + __pte(__phys_to_pte_val(*pte) | > + PMD_TYPE_TABLE | PMD_TABLE_UXN)); > *pte += PTRS_PER_PTE * sizeof(pte_t); > } > map_range(pte, start, next, pa, prot, level + 1, > - (pte_t *)(__pte_to_phys(*tbl) + va_offset), > + (pte_t *)(__pte_to_phys(__ptep_get(tbl)) + va_offset), > may_use_cont, va_offset); > } else { > /* > @@ -79,7 +80,7 @@ void __init map_range(u64 *pte, u64 start, u64 end, u64 pa, pgprot_t prot, > protval &= ~PTE_CONT; > > /* Put down a block or page mapping */ > - *tbl = __pte(__phys_to_pte_val(pa) | protval); > + __set_pte_nosync(tbl, __pte(__phys_to_pte_val(pa) | protval)); > } > pa += next - start; > start = next; That looks good to me! Will