From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C17EE43A7F1 for ; Tue, 28 Jul 2026 15:29:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.44 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785252558; cv=none; b=B4Ae2wYm5cfKGWo5ZqgGUI9Dm4+YQFpjD4d2QqWmjfSxQRoC/vK7QOxmq7wBVSFMpoyLqwM3kPUvvDQP1lR8x6x7dvvsFTVyml0gKoGaaJ9Op/IEJl4qSVB1ID8D5pVRCiGG03sTd9ZTEL9zTMB1Q6b2XVWz9HiTgzYu0K8XwZI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785252558; c=relaxed/simple; bh=d/HXh2+wtAy2KgKzzcueLfPbIzbvZiij/RnpXK41M/k=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=g+e8tcZtJQF8tVQn3wEz/eTm8QPcI+jaBfH2ihvwr545DkM1d5HIaMdNk04E8DYxEn8BarOVqQxbXatL00B3Z/3dZ+BJTRt7cKtBDuSVrHyVcti0+LZTa0aLc3tcdxs0aleoYIlCGYRGMDhjoGQALAVdaA5ebDok7/jTqznYom4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=lEdryBov; arc=none smtp.client-ip=209.85.218.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="lEdryBov" Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-c1c26d7e951so570607166b.0 for ; Tue, 28 Jul 2026 08:29:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785252554; x=1785857354; darn=vger.kernel.org; h=in-reply-to:content-disposition:content-type:mime-version :references:message-id:subject:cc:to:from:date:from:to:cc:subject :date:message-id:reply-to:content-type; bh=F8oFJfNXcX3rvNozL61a5flKxGo2/aiCWCnQ35Drmb0=; b=lEdryBovr8JpNvEusNCj7vPF5W2ThmrRBKRwDWLCh4JB6EDxUWP9G9Rmolb1AOZylk cEG/fgDZjY41L7+ozkiDGigkfUD5Bi/YemNpmdXI/4r3SaGT993a+g0tgz2KHhEvUYiZ bR5prI1uoMt4Ff9BuEw6IKX0crCRKAQXtv6GHYp4wGVWhTqudivckHSPrbrp+PiJnBjK HW/75WhQ8cu/cE3yhMeRL3sR2oo1tPQCHUZ/7b7+WPe8Jf46hE8agjXE/SA+PN3JnmP8 laFDZjvYHSOBr3Br0i9WbLPWpjRm0f6HGN/269TUtLkwWAikyKrT+ws7BYoInvQbjuYh 4sfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785252554; x=1785857354; h=in-reply-to:content-disposition:content-type:mime-version :references:message-id:subject:cc:to:from:date:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=F8oFJfNXcX3rvNozL61a5flKxGo2/aiCWCnQ35Drmb0=; b=EUqb6wpXRF4g5JD5pO91y5/Rd8pHZriwixPro7j/UOs++mo3Fs7nk69yWm7tZySMP0 iNHAQdY/6lHaQj5bEdf1XrtB2LntUdIkusXzOgTqA+c4XfMqrexcfUJgdbkh9+o4J3MZ 4Mfp5cHAU9NDUUaEF3OOHCdYXtqcvIwWIE5T+UaeWUuElswAg7C2K7XAH7gC64beBFwN thDMSm7w+RPbvmnxxMhsPZ/WctaEvpD3ZG9PdaEfHdXTPBX8P/+mURm2V+U/AU15hqXq yIb7L8RlK0cum2XAQdj6WT8yvQXHOK8Di+gOlEtnvvoXmlcPUXTVxesYBd9vTCI6rJwn rINg== X-Forwarded-Encrypted: i=1; AHgh+RoWoGkrC07RAd3h5VS16+GhqyOFHbDbTwlnGgeQLrTV6KF5yTMeoNzmo4Q8PYCrIDIyXI4L/rE48W7OFdg=@vger.kernel.org X-Gm-Message-State: AOJu0YzI7AWKJW3JOhsHNaclQRNZeC81ibWFHoNB+Z6JfwWEMoEv+l/+ tXGiQkLyL5oQ5et+/boBniJr4QCAhLVP6uYhrWn8p2rcL/YB1dL5gqXHWa/Ay7WA9w== X-Gm-Gg: AR+sD122DOTN4a3bcciB9BDkDinsAx6Yomjsa05R2Yf6YQxcHS6g0Y6ES2okRoivTmL zfq0nfRw8etz0hS7T9HN5KV/QezTlyK2mk6nDKGMyCBJi6vgWTKIQhMCw67mAbkQXtzt9prHS0n kQnKtl1Fe8s+BLgqU1Bs+hURl9SD1SKI6VBN7dfqFxfWZRgN/FKbtNOe/ZLRj7xNQrL81Y0o5o4 yIm3pOKBsmHKyxMllyGMGdCts2V25Hs9U4XyKbEgo2z9PduP97gIdn+p6Oow/OonENy5ty8QFHS 2PIiGcQO66C9EkC1yyu7JlZAoaR7n2vxqdjwEiX43C3GT139+heprD2Ef1H5eQKds4VURRryssQ OfOw1AaWTXsSSsMYPGeVOeVyQS1D5NjOzRmgvAKCR59Txr1Im3r/BtLWYBhXMLYfchZ/BdVLezy d3S8lfkKOkWO/2Lr5z2RwF0vpODk6vG5j5gk7Uc1yhm5v5X6wi5529f+hM X-Received: by 2002:a17:907:73cd:b0:c15:d0ef:a0c3 with SMTP id a640c23a62f3a-c1f7221d235mr160291866b.32.1785252553743; Tue, 28 Jul 2026 08:29:13 -0700 (PDT) Received: from google.com (135.91.155.104.bc.googleusercontent.com. [104.155.91.135]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c1f83cde4dbsm685366b.15.2026.07.28.08.29.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jul 2026 08:29:12 -0700 (PDT) Date: Tue, 28 Jul 2026 16:29:08 +0100 From: Vincent Donnefort To: Fuad Tabba Cc: Marc Zyngier , Oliver Upton , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Shuah Khan , Quentin Perret , Alexandru Elisei , Gavin Shan , Dev Jain , Bradley Morgan , Fuad Tabba , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH v5 1/7] KVM: arm64: Skip cache maintenance for non-cacheable pKVM mappings Message-ID: References: <20260717130317.1953574-1-fuad.tabba@linux.dev> <20260717130317.1953574-2-fuad.tabba@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20260717130317.1953574-2-fuad.tabba@linux.dev> On Fri, Jul 17, 2026 at 02:03:11PM +0100, Fuad Tabba wrote: > From: Bradley Morgan > > The pKVM flush path walks its own pkvm_mappings list and cleans the > data cache for every mapping, unlike the generic stage-2 walker it > shadows, which skips non-cacheable leaves. Cleaning the cacheable > alias of a non-cacheable mapping is pointless and can corrupt a > device endpoint. Record whether a mapping is non-cacheable in spare > bits of nr_pages and skip cache maintenance for it. > > Fixes: e912efed485a ("KVM: arm64: Introduce the EL1 pKVM MMU") > Suggested-by: Marc Zyngier > Signed-off-by: Bradley Morgan > [tabba: use Marc's anonymous bitfield in place of the open-coded mask and helpers] > Signed-off-by: Fuad Tabba Reviewed-by: Vincent Donnefort > --- > arch/arm64/include/asm/kvm_pkvm.h | 5 ++++- > arch/arm64/kvm/pkvm.c | 15 +++++++++------ > 2 files changed, 13 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/include/asm/kvm_pkvm.h b/arch/arm64/include/asm/kvm_pkvm.h > index 74fedd9c5ff0..57afb07d6b13 100644 > --- a/arch/arm64/include/asm/kvm_pkvm.h > +++ b/arch/arm64/include/asm/kvm_pkvm.h > @@ -195,7 +195,10 @@ struct pkvm_mapping { > struct rb_node node; > u64 gfn; > u64 pfn; > - u64 nr_pages; > + struct { > + u64 nr_pages:48; > + u64 nc:1; > + }; > u64 __subtree_last; /* Internal member for interval tree */ > }; > > diff --git a/arch/arm64/kvm/pkvm.c b/arch/arm64/kvm/pkvm.c > index 053e4f733e4b..f70c601dcf4c 100644 > --- a/arch/arm64/kvm/pkvm.c > +++ b/arch/arm64/kvm/pkvm.c > @@ -369,7 +369,7 @@ static int __pkvm_pgtable_stage2_unshare(struct kvm_pgtable *pgt, u64 start, u64 > > for_each_mapping_in_range_safe(pgt, start, end, mapping) { > ret = kvm_call_hyp_nvhe(__pkvm_host_unshare_guest, handle, mapping->gfn, > - mapping->nr_pages); > + (u64)mapping->nr_pages); > if (WARN_ON(ret)) > return ret; > pkvm_mapping_remove(mapping, &pgt->pkvm_mappings); > @@ -473,6 +473,7 @@ int pkvm_pgtable_stage2_map(struct kvm_pgtable *pgt, u64 addr, u64 size, > mapping->gfn = gfn; > mapping->pfn = pfn; > mapping->nr_pages = size / PAGE_SIZE; > + mapping->nc = !!(prot & (KVM_PGTABLE_PROT_DEVICE | KVM_PGTABLE_PROT_NORMAL_NC)); > pkvm_mapping_insert(mapping, &pgt->pkvm_mappings); > > return ret; > @@ -503,7 +504,7 @@ int pkvm_pgtable_stage2_wrprotect(struct kvm_pgtable *pgt, u64 addr, u64 size) > lockdep_assert_held(&kvm->mmu_lock); > for_each_mapping_in_range_safe(pgt, addr, addr + size, mapping) { > ret = kvm_call_hyp_nvhe(__pkvm_host_wrprotect_guest, handle, mapping->gfn, > - mapping->nr_pages); > + (u64)mapping->nr_pages); > if (WARN_ON(ret)) > break; > } > @@ -517,9 +518,11 @@ int pkvm_pgtable_stage2_flush(struct kvm_pgtable *pgt, u64 addr, u64 size) > struct pkvm_mapping *mapping; > > lockdep_assert_held(&kvm->mmu_lock); > - for_each_mapping_in_range_safe(pgt, addr, addr + size, mapping) > - __clean_dcache_guest_page(pfn_to_kaddr(mapping->pfn), > - PAGE_SIZE * mapping->nr_pages); > + for_each_mapping_in_range_safe(pgt, addr, addr + size, mapping) { > + if (!mapping->nc) > + __clean_dcache_guest_page(pfn_to_kaddr(mapping->pfn), > + PAGE_SIZE * mapping->nr_pages); > + } > > return 0; > } > @@ -537,7 +540,7 @@ bool pkvm_pgtable_stage2_test_clear_young(struct kvm_pgtable *pgt, u64 addr, u64 > lockdep_assert_held(&kvm->mmu_lock); > for_each_mapping_in_range_safe(pgt, addr, addr + size, mapping) > young |= kvm_call_hyp_nvhe(__pkvm_host_test_clear_young_guest, handle, mapping->gfn, > - mapping->nr_pages, mkold); > + (u64)mapping->nr_pages, mkold); > > return young; > } > -- > 2.39.5 > -- -- Vincent