From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 591DB82866 for ; Wed, 18 Jun 2025 04:24:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220671; cv=none; b=NiSeXI9I8rIw1D5vzvvxlLLEUJ0qLaevQ3LMLqfcg9sVd1wfZip9ffjL6Tt2ALxF8+zFUNKPYPSG/7GvSABPJyMT3KLiMXgbQu+XWKpAlvPASm65SA+cn3Xf8WVoW8Vvvy4RpsQ4gZ7PHt8bQCSV2dvXhMfjdL2Bl+2CoAMWiqI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220671; c=relaxed/simple; bh=eP46jQ+rNHU6ISgY5UQik8NONkiapiV65A0WTIlahXU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=qNWCI86YGmVZPlgbrv+8rkjQZ06WhH14l450U3tZy7KI4GjwTZnDL2nF3wnH8uCrzckQOvb4g2MwO7UyJrmIcCFzU6ZA4/nkmqdxDCuBBVY/teh3/FFhRD5W2zeXp7zdaBmZ84O8VWEQA40lNqfXkZspTCOQCRMNndQhvtIX5HI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=pwQ7m/aJ; arc=none smtp.client-ip=209.85.214.202 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="pwQ7m/aJ" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-23692793178so15513065ad.0 for ; Tue, 17 Jun 2025 21:24:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220669; x=1750825469; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=lktvEP9OF/yBrtwNGnOYj58Kkb3on7duF4eax38mNfc=; b=pwQ7m/aJYNJ9qV3WuTexPOQMqpZIK4AoG8+0A3J1DpKLxAKsmGL1uGACfRQcbNOO50 iPiDFZFGqeebfMVOI9GvHQpWG8ywK9ywvc6CmSXN+CGtyGkt/G7KuXLG5h7H6J3b7/6D xo4GIJS1V7eaefRInasje6bPHU/5LflE7sR+SQJjxdI0fd833f6UUlyu+RVmcdciHFV6 IOFhGS87/5NBbKNJPDp2dsVHWFZJf/NUjeQT3flpO1GbDZe4uiEWchAQ9EQlVbjdKSrZ tknF4o8W+XwzpRenq88txK/oQc1eGIRFiyeqqKz0Hlzvn2vKaBHCl1FlaXC5oabRPDPL ZyNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220669; x=1750825469; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=lktvEP9OF/yBrtwNGnOYj58Kkb3on7duF4eax38mNfc=; b=E4MgUhnhVE9ieIj25SEtfjZdFKDKs0n66SM0KHsX3mkF27rtvn78DGnio8LSrauQVC Ge4mVNE66eg3EhJr9EnlWySORpDFaznUuOc1iCthzfrMIqqceYrcOoumsBEebp8beQgn N3dT1kL8S+RPYD1Ig0r2M0Lco8H1W4Z7Xm3hWEzx5TngZcqvEzfl5sNnCmamHYgsPed/ o30EU6WURRHLOBAoHc20pK0HPoMjjR8NsO5Qe3bFc9FalSDCX/XOzOLTIKElKE/um3lA JbgGHOJ7uC0kKBxgWJ/586vpihR4zg1TiMHsKnPytYUyFUz4YME8Vegw2ZTuqgSfNO1f XnJQ== X-Forwarded-Encrypted: i=1; AJvYcCUtOoN7TJL2HvSB69XoV2pjiH2BZtV9E9S38boNNpkgbYDAiUcKWkd+Slk2WHO7czHVvy35TrDhQE2yteM=@vger.kernel.org X-Gm-Message-State: AOJu0Yy4kc1aLJPBoq6QITddih8vVmB1uLaNCJ9FNLPbNJR0Ldexi7MM lk3tsY4BB5rZdWHDobb5pKaOf9d5ha1TE2RfcsB/ZCV4qPMh6JNVKoVTDLlzjj1uEMM/hCrW4on v+mJDna8ajmskQ00M6jdIaw== X-Google-Smtp-Source: AGHT+IFjtADbYlxljhsDQTOZW3D7A0uJ9AI1mGomIpn2hF7RaxHZsBqEwbheSqwAOtTN5nAEPPlQmENaTESm3DrC X-Received: from pgbck15.prod.google.com ([2002:a05:6a02:90f:b0:b2c:4bfe:fb79]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:da81:b0:234:a063:e2c1 with SMTP id d9443c01a7336-2366b17b667mr224708415ad.42.1750220668697; Tue, 17 Jun 2025 21:24:28 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:10 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-2-jthoughton@google.com> Subject: [PATCH v3 01/15] KVM: x86/mmu: Move "struct kvm_page_fault" definition to asm/kvm_host.h From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Sean Christopherson Make "struct kvm_page_fault" globally visible via asm/kvm_host.h so that the structure can be referenced by common KVM. No functional change intended. Signed-off-by: Sean Christopherson Signed-off-by: James Houghton --- arch/x86/include/asm/kvm_host.h | 68 ++++++++++++++++++++++++++++++++- arch/x86/kvm/mmu/mmu_internal.h | 67 -------------------------------- 2 files changed, 67 insertions(+), 68 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index b4a391929cdba..f9d3333f6d64b 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -443,7 +443,73 @@ struct kvm_mmu_root_info { #define KVM_HAVE_MMU_RWLOCK =20 struct kvm_mmu_page; -struct kvm_page_fault; + +struct kvm_page_fault { + /* arguments to kvm_mmu_do_page_fault. */ + const gpa_t addr; + const u64 error_code; + const bool prefetch; + + /* Derived from error_code. */ + const bool exec; + const bool write; + const bool present; + const bool rsvd; + const bool user; + + /* Derived from mmu and global state. */ + const bool is_tdp; + const bool is_private; + const bool nx_huge_page_workaround_enabled; + + /* + * Whether a >4KB mapping can be created or is forbidden due to NX + * hugepages. + */ + bool huge_page_disallowed; + + /* + * Maximum page size that can be created for this fault; input to + * FNAME(fetch), direct_map() and kvm_tdp_mmu_map(). + */ + u8 max_level; + + /* + * Page size that can be created based on the max_level and the + * page size used by the host mapping. + */ + u8 req_level; + + /* + * Page size that will be created based on the req_level and + * huge_page_disallowed. + */ + u8 goal_level; + + /* + * Shifted addr, or result of guest page table walk if addr is a gva. In + * the case of VM where memslot's can be mapped at multiple GPA aliases + * (i.e. TDX), the gfn field does not contain the bit that selects between + * the aliases (i.e. the shared bit for TDX). + */ + gfn_t gfn; + + /* The memslot containing gfn. May be NULL. */ + struct kvm_memory_slot *slot; + + /* Outputs of kvm_mmu_faultin_pfn(). */ + unsigned long mmu_seq; + kvm_pfn_t pfn; + struct page *refcounted_page; + bool map_writable; + + /* + * Indicates the guest is trying to write a gfn that contains one or + * more of the PTEs used to translate the write itself, i.e. the access + * is changing its own translation in the guest page tables. + */ + bool write_fault_to_shadow_pgtable; +}; =20 /* * x86 supports 4 paging modes (5-level 64-bit, 4-level 64-bit, 3-level 32= -bit, diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_interna= l.h index db8f33e4de624..384fc4d0bfec0 100644 --- a/arch/x86/kvm/mmu/mmu_internal.h +++ b/arch/x86/kvm/mmu/mmu_internal.h @@ -230,73 +230,6 @@ static inline bool is_nx_huge_page_enabled(struct kvm = *kvm) return READ_ONCE(nx_huge_pages) && !kvm->arch.disable_nx_huge_pages; } =20 -struct kvm_page_fault { - /* arguments to kvm_mmu_do_page_fault. */ - const gpa_t addr; - const u64 error_code; - const bool prefetch; - - /* Derived from error_code. */ - const bool exec; - const bool write; - const bool present; - const bool rsvd; - const bool user; - - /* Derived from mmu and global state. */ - const bool is_tdp; - const bool is_private; - const bool nx_huge_page_workaround_enabled; - - /* - * Whether a >4KB mapping can be created or is forbidden due to NX - * hugepages. - */ - bool huge_page_disallowed; - - /* - * Maximum page size that can be created for this fault; input to - * FNAME(fetch), direct_map() and kvm_tdp_mmu_map(). - */ - u8 max_level; - - /* - * Page size that can be created based on the max_level and the - * page size used by the host mapping. - */ - u8 req_level; - - /* - * Page size that will be created based on the req_level and - * huge_page_disallowed. - */ - u8 goal_level; - - /* - * Shifted addr, or result of guest page table walk if addr is a gva. In - * the case of VM where memslot's can be mapped at multiple GPA aliases - * (i.e. TDX), the gfn field does not contain the bit that selects between - * the aliases (i.e. the shared bit for TDX). - */ - gfn_t gfn; - - /* The memslot containing gfn. May be NULL. */ - struct kvm_memory_slot *slot; - - /* Outputs of kvm_mmu_faultin_pfn(). */ - unsigned long mmu_seq; - kvm_pfn_t pfn; - struct page *refcounted_page; - bool map_writable; - - /* - * Indicates the guest is trying to write a gfn that contains one or - * more of the PTEs used to translate the write itself, i.e. the access - * is changing its own translation in the guest page tables. - */ - bool write_fault_to_shadow_pgtable; -}; - int kvm_tdp_page_fault(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault= ); =20 /* --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 2BA331E503D for ; Wed, 18 Jun 2025 04:24:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220672; cv=none; b=dEySqRAF0mTBMzdimlgBhuEQ+WC0MnJXhGe7xwgDUDfHjX+GgcOCqIRDPdOiUTXuVxXJqXK37bzNKcZ1/8eEq9l79Vb0ezFpC+ZSFcm626419jrd6KiVPH/X9xrPXxk1fTZK89PEMwE7EndPEkKdMURWde7yPxLLbNIMdb+Po3Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220672; c=relaxed/simple; bh=jJzFpMIoMXrFEbFfMZHeGhQ7EoGOH6MxXy/6a5t1jZg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=nR/aTTgQFE2wGtZ+hwboRRMIXWa+WG4I8RBP7iP40SAnvVJDJlJO6DBpfSeUXoY60qhOIJYNcfuD3vSlBwzumgibmqNX+w78OZfaGdPz79J9MxgMXDtFKkRDkEBPxdj/+HcdjhxSbyOuqgP6+cwtKEc+5kYz0LYA6L7HJuU10K8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=MwLg6uqP; arc=none smtp.client-ip=209.85.210.201 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="MwLg6uqP" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-748e1e474f8so1022261b3a.2 for ; Tue, 17 Jun 2025 21:24:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220670; x=1750825470; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=JanEUXOf1XWVs3kpYfHVyTXFyH+qIidbAMdFV6akegY=; b=MwLg6uqPc6n6F5WmHItpxeOkI4sDtC4MPxdPxfn4A2XQRz5tn3TnCrODYxNvd4GzsV ljWhWGQBSg4g1vGOEnybtsItWlNWcNm3/IWM+jp3tekamoxCmISN2+SayyG3xeS3UTsc 0aM1kRvlaHQvMjEOZtqqxZjSjNuDqqQECgaxnrXp8gIiGerLcSHNqzobW3K80B+Wsoh0 iT9yUMfZlG7tZEgIBp9OAR/rUUJSX7PL5hzkwgFH3Ym+a6QdZ/42XKbyyupxqQy7mn7R caHz5iceJp1EZ9JyJlboZe7glbtF4oVmDZ/xLnDuEsQkE57vspNUADzqyQCWy+0f9F8E hQqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220670; x=1750825470; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=JanEUXOf1XWVs3kpYfHVyTXFyH+qIidbAMdFV6akegY=; b=DYwPfUFDyHWy7g996IGb3yt5AvQK9XN6P82J9BXLQ1M4R5zMudXXlBt5/e7cdLJFwC MYaz8OykW9yod7P/02Me66K9S7+xmhFEmy4XxfLBporE1gZHDQipbo4XX9OszzU0+3sF wP9LSGkozFIHTKHg8DLsLpoGfssmlthNEpii7WgSsKzH5F1CLJy7gJCs3cACwZbY2JVm FVkRC9hCaumxq/wwWiGiRkRanp2gTAScb23jDc61NHE/2pvN4QA5asoI+agRnjuzrziY 73HoPhC92S+h3Et32SMMozYmZodKLVTFSvBl/hLo+pENjSaCfoqo3+uue8gwOI+uxZfD iX6w== X-Forwarded-Encrypted: i=1; AJvYcCUexDfO276c7K2nkeoyp/DHiL82Te9EmYkxvfWS9Inb6Z5nGSFg+rNATnmC6DnRvbK8D/BcRheS1A1/oX4=@vger.kernel.org X-Gm-Message-State: AOJu0YzdkNCCMl5Y2ibS9oUaCImzOfI/zgIPCGCEEZNhG7aDE6phCj+P UIi1iFFl7J8dE9Jd1YVi3kl+h4e5tCy9ix5OGo7t/6lt09/rJd08P9KpkE5IDXSo4KZXmdDsJve TlGII82iOdiMNLRpjXAU53w== X-Google-Smtp-Source: AGHT+IGhGlpakj0eJizLYc0gxiQ3hQXVWEsMAv964wrGEVgAjsjBPQA9RJtsv4jH/rvULsmo/zU/Pq4mbBOQ1uSF X-Received: from pfhp23.prod.google.com ([2002:a05:6a00:a17:b0:746:21fd:3f7a]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3a06:b0:748:e1e4:71d9 with SMTP id d2e1a72fcca58-748e1e475a6mr2959042b3a.22.1750220670239; Tue, 17 Jun 2025 21:24:30 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:11 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-3-jthoughton@google.com> Subject: [PATCH v3 02/15] KVM: arm64: Add "struct kvm_page_fault" to gather common fault variables From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Sean Christopherson Introduce "struct kvm_page_fault" and use it in user_mem_abort() in lieu of a collection of local variables. Providing "struct kvm_page_fault" will allow common KVM to provide APIs to take in said structure, e.g. when preparing memory fault exits. No functional change intended. Signed-off-by: Sean Christopherson Signed-off-by: James Houghton --- arch/arm64/include/asm/kvm_host.h | 9 +++++++++ arch/arm64/kvm/mmu.c | 32 +++++++++++++++++-------------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm= _host.h index 6ce2c51734820..ae83d95d11b74 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -413,6 +413,15 @@ struct kvm_vcpu_fault_info { u64 disr_el1; /* Deferred [SError] Status Register */ }; =20 +struct kvm_page_fault { + const bool exec; + const bool write; + const bool is_private; + + gfn_t gfn; + struct kvm_memory_slot *slot; +}; + /* * VNCR() just places the VNCR_capable registers in the enum after * __VNCR_START__, and the value (after correction) to be an 8-byte offset diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 2942ec92c5a4a..0c209f2e1c7b2 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -1476,8 +1476,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys= _addr_t fault_ipa, bool fault_is_perm) { int ret =3D 0; - bool write_fault, writable, force_pte =3D false; - bool exec_fault, mte_allowed; + bool writable, force_pte =3D false; + bool mte_allowed; bool device =3D false, vfio_allow_any_uc =3D false; unsigned long mmu_seq; phys_addr_t ipa =3D fault_ipa; @@ -1485,7 +1485,6 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys= _addr_t fault_ipa, struct vm_area_struct *vma; short vma_shift; void *memcache; - gfn_t gfn; kvm_pfn_t pfn; bool logging_active =3D memslot_is_logging(memslot); long vma_pagesize, fault_granule; @@ -1494,13 +1493,18 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, ph= ys_addr_t fault_ipa, struct page *page; enum kvm_pgtable_walk_flags flags =3D KVM_PGTABLE_WALK_HANDLE_FAULT | KVM= _PGTABLE_WALK_SHARED; =20 + struct kvm_page_fault fault =3D { + .write =3D kvm_is_write_fault(vcpu), + .exec =3D kvm_vcpu_trap_is_exec_fault(vcpu), + + .slot =3D memslot, + }; + if (fault_is_perm) fault_granule =3D kvm_vcpu_trap_get_perm_fault_granule(vcpu); - write_fault =3D kvm_is_write_fault(vcpu); - exec_fault =3D kvm_vcpu_trap_is_exec_fault(vcpu); - VM_BUG_ON(write_fault && exec_fault); + VM_BUG_ON(fault.write && fault.exec); =20 - if (fault_is_perm && !write_fault && !exec_fault) { + if (fault_is_perm && !fault.write && !fault.exec) { kvm_err("Unexpected L2 read permission error\n"); return -EFAULT; } @@ -1516,7 +1520,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys= _addr_t fault_ipa, * only exception to this is when dirty logging is enabled at runtime * and a write fault needs to collapse a block entry into a table. */ - if (!fault_is_perm || (logging_active && write_fault)) { + if (!fault_is_perm || (logging_active && fault.write)) { int min_pages =3D kvm_mmu_cache_min_pages(vcpu->arch.hw_mmu); =20 if (!is_protected_kvm_enabled()) @@ -1614,7 +1618,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys= _addr_t fault_ipa, ipa &=3D ~(vma_pagesize - 1); } =20 - gfn =3D ipa >> PAGE_SHIFT; + fault.gfn =3D ipa >> PAGE_SHIFT; mte_allowed =3D kvm_vma_mte_allowed(vma); =20 vfio_allow_any_uc =3D vma->vm_flags & VM_ALLOW_ANY_UNCACHED; @@ -1633,7 +1637,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys= _addr_t fault_ipa, mmu_seq =3D vcpu->kvm->mmu_invalidate_seq; mmap_read_unlock(current->mm); =20 - pfn =3D __kvm_faultin_pfn(memslot, gfn, write_fault ? FOLL_WRITE : 0, + pfn =3D __kvm_faultin_pfn(memslot, fault.gfn, fault.write ? FOLL_WRITE : = 0, &writable, &page); if (pfn =3D=3D KVM_PFN_ERR_HWPOISON) { kvm_send_hwpoison_signal(hva, vma_shift); @@ -1654,7 +1658,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys= _addr_t fault_ipa, * change things at the last minute. */ device =3D true; - } else if (logging_active && !write_fault) { + } else if (logging_active && !fault.write) { /* * Only actually map the page as writable if this was a write * fault. @@ -1662,7 +1666,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys= _addr_t fault_ipa, writable =3D false; } =20 - if (exec_fault && device) + if (fault.exec && device) return -ENOEXEC; =20 /* @@ -1722,7 +1726,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys= _addr_t fault_ipa, if (writable) prot |=3D KVM_PGTABLE_PROT_W; =20 - if (exec_fault) + if (fault.exec) prot |=3D KVM_PGTABLE_PROT_X; =20 if (device) { @@ -1759,7 +1763,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys= _addr_t fault_ipa, =20 /* Mark the page dirty only if the fault is handled successfully */ if (writable && !ret) - mark_page_dirty_in_slot(kvm, memslot, gfn); + mark_page_dirty_in_slot(kvm, memslot, fault.gfn); =20 return ret !=3D -EAGAIN ? ret : 0; } --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 9F9C71FC0EA for ; Wed, 18 Jun 2025 04:24:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220674; cv=none; b=P7hF/YjfgYAvEBYNUljBBGN1nWrtJMks56yS5VkLNo2c2lngELGP+kqm7IcXXr8jNrBYKL6XUhA0kegNaDTT7BAb67/L0svehNxQ56JgSM1S70nQjFkvxL/ZEgx+f1h9FErJv/XTGJczp6Mtmii/WHdBzqYyCGdmabpwGNwGjcA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220674; c=relaxed/simple; bh=gpLnCbZ2QT66InCL+IQSfKdjaE0VlJUfUrY2ZyIBHpg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=KDbX2FxgoR9G8+XhLNOA+/kEbQbU3yok1JHyMPtx1bF2U277jFBZ12OGa4UbUp0L1WvV/qXZDCU4JmLILxIoKDHkgPnaejeiy0KDyUGtGU6+OHxIw9wI6SMDuKsWymr1gFLeKGB4+ttM07mnMZehC+Lmnh/58WC5jakNMpwlb3I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=vVAiBVq4; arc=none smtp.client-ip=209.85.210.202 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="vVAiBVq4" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-748b4d5c045so2436393b3a.1 for ; Tue, 17 Jun 2025 21:24:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220672; x=1750825472; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=lAANK9EatRgM8qlVuTkHcUTTaZtpLq75H6hzaPLeuxs=; b=vVAiBVq4vJGNSUub2iHTye3iyJpCCkYUDRUkhWRuiWXy0btu+g7EMixIKESLACZ5qC iS1vAZGtXmylB+1CpuIqnDseU53cC/dzzQwdWIwHvlNi8b9WNjH562+Ox07JHzrQR4v9 3ZtN+y6gddn4BFb85Rr+ir0fC4jcIVQGQq/xhoF4NkpMBphZRxNroSo4bSLZQt1hvVrk ss0s0QGFv+m6Okg+8oIc8kGYypBocc+JP8YP6QOpY+kDz4ELxUDGsS0gHSv+xZe/o63y wOLXQftXA5pyLnTjA0GA1JXFBdNs45PYHLAr/0noFJjMI+45NGySFYcniyxwCip3a6P+ YXwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220672; x=1750825472; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=lAANK9EatRgM8qlVuTkHcUTTaZtpLq75H6hzaPLeuxs=; b=ngLU85TU8A6i4/UxGW4IGF8/pdglKsUmWkmr+rNb6bhVM7m6I6q0X+ilQqgwO+iSvR +wFfnz4BwXxCRjPD5QSAaN4sZYU0u9ebT377YKh9jQKEiNtop/ZSx6/2LU++PkkHIg3j EB1puqmKdHVclumpRX0QyDeeWds5EKjl4wuOwK8/cq3T6+Tfy4uwRkG/8I6pq7/i3dTz w67eKZQmw9mh4u6yftAu0SbXYFNjbsHRnQkfF5zWX/oFGCWtjFfU32uazdz/uQqWFyQA ttnA+u2XqCh8bStMnJtHxkkrsPALzU0nt2RqnUWh4IM7meAVrO8ZhpNvkxPtefllVmWf fvIg== X-Forwarded-Encrypted: i=1; AJvYcCVoLw1l/HNzwLgut7B4s52WXndgfi6Gu0/JPCn7uBW3tBywqLYHT6NOKvReo6wIKpDWZzQYbO7TKDHnMVs=@vger.kernel.org X-Gm-Message-State: AOJu0YwJiog1AXEuZlsykZli6SBqJ2+AtqWRuc2nhhDDehVjLmCijCz4 FlivepTYfhjGnEzwtjsSAtBGcEv5T2nuTt0VipC55DbAPkQw/dlA5DoSawit7ia9lv621a3Iklr gUZPX6KMUablB7KcF8mjYkQ== X-Google-Smtp-Source: AGHT+IGfw/fuYp0YvoE+rn33nARlIYiN3aa5M590yzdjQSAaiecYqF5p0spxRmCeRQgOGDvJLrq4ZeRSCV3QEL3v X-Received: from pfjw27.prod.google.com ([2002:aa7:9a1b:0:b0:748:de42:3b4]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:a86:b0:732:2923:b70f with SMTP id d2e1a72fcca58-7489d00631fmr17847993b3a.11.1750220671791; Tue, 17 Jun 2025 21:24:31 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:12 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-4-jthoughton@google.com> Subject: [PATCH v3 03/15] KVM: arm64: x86: Require "struct kvm_page_fault" for memory fault exits From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Sean Christopherson Now that both arm64 and x86 define "struct kvm_page_fault" with a base set of fields, rework kvm_prepare_memory_fault_exit() to take a kvm_page_fault structure instead of passing in a pile of parameters. Guard the related code with CONFIG_KVM_GENERIC_PAGE_FAULT to play nice with architectures that don't yet support kvm_page_fault. Rather than define a common kvm_page_fault and kvm_arch_page_fault child, simply assert that the handful of required fields are provided by the arch-defined structure. Unlike vCPU and VMs, the number of common fields is expected to be small, and letting arch code fully define the structure allows for maximum flexibility with respect to const, layout, etc. No functional change intended. Signed-off-by: Sean Christopherson Signed-off-by: James Houghton --- arch/arm64/kvm/Kconfig | 1 + arch/x86/kvm/Kconfig | 1 + arch/x86/kvm/mmu/mmu.c | 8 ++++---- arch/x86/kvm/mmu/mmu_internal.h | 10 +--------- include/linux/kvm_host.h | 26 ++++++++++++++++++++------ virt/kvm/Kconfig | 3 +++ 6 files changed, 30 insertions(+), 19 deletions(-) diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig index 713248f240e03..3c299735b1668 100644 --- a/arch/arm64/kvm/Kconfig +++ b/arch/arm64/kvm/Kconfig @@ -37,6 +37,7 @@ menuconfig KVM select HAVE_KVM_VCPU_RUN_PID_CHANGE select SCHED_INFO select GUEST_PERF_EVENTS if PERF_EVENTS + select KVM_GENERIC_PAGE_FAULT help Support hosting virtualized guest machines. =20 diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 2eeffcec53828..2d5966f15738d 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -48,6 +48,7 @@ config KVM_X86 select KVM_GENERIC_PRE_FAULT_MEMORY select KVM_GENERIC_PRIVATE_MEM if KVM_SW_PROTECTED_VM select KVM_WERROR if WERROR + select KVM_GENERIC_PAGE_FAULT =20 config KVM tristate "Kernel-based Virtual Machine (KVM) support" diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index cbc84c6abc2e3..a4439e9e07268 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -3429,7 +3429,7 @@ static int kvm_handle_noslot_fault(struct kvm_vcpu *v= cpu, gva_t gva =3D fault->is_tdp ? 0 : fault->addr; =20 if (fault->is_private) { - kvm_mmu_prepare_memory_fault_exit(vcpu, fault); + kvm_prepare_memory_fault_exit(vcpu, fault); return -EFAULT; } =20 @@ -4499,14 +4499,14 @@ static int kvm_mmu_faultin_pfn_private(struct kvm_v= cpu *vcpu, int max_order, r; =20 if (!kvm_slot_can_be_private(fault->slot)) { - kvm_mmu_prepare_memory_fault_exit(vcpu, fault); + kvm_prepare_memory_fault_exit(vcpu, fault); return -EFAULT; } =20 r =3D kvm_gmem_get_pfn(vcpu->kvm, fault->slot, fault->gfn, &fault->pfn, &fault->refcounted_page, &max_order); if (r) { - kvm_mmu_prepare_memory_fault_exit(vcpu, fault); + kvm_prepare_memory_fault_exit(vcpu, fault); return r; } =20 @@ -4586,7 +4586,7 @@ static int kvm_mmu_faultin_pfn(struct kvm_vcpu *vcpu, * private vs. shared mismatch. */ if (fault->is_private !=3D kvm_mem_is_private(kvm, fault->gfn)) { - kvm_mmu_prepare_memory_fault_exit(vcpu, fault); + kvm_prepare_memory_fault_exit(vcpu, fault); return -EFAULT; } =20 diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_interna= l.h index 384fc4d0bfec0..c15060ed6e8be 100644 --- a/arch/x86/kvm/mmu/mmu_internal.h +++ b/arch/x86/kvm/mmu/mmu_internal.h @@ -269,14 +269,6 @@ enum { */ static_assert(RET_PF_CONTINUE =3D=3D 0); =20 -static inline void kvm_mmu_prepare_memory_fault_exit(struct kvm_vcpu *vcpu, - struct kvm_page_fault *fault) -{ - kvm_prepare_memory_fault_exit(vcpu, fault->gfn << PAGE_SHIFT, - PAGE_SIZE, fault->write, fault->exec, - fault->is_private); -} - static inline int kvm_mmu_do_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_o= r_gpa, u64 err, bool prefetch, int *emulation_type, u8 *level) @@ -329,7 +321,7 @@ static inline int kvm_mmu_do_page_fault(struct kvm_vcpu= *vcpu, gpa_t cr2_or_gpa, */ if (r =3D=3D RET_PF_EMULATE && fault.is_private) { pr_warn_ratelimited("kvm: unexpected emulation request on private memory= \n"); - kvm_mmu_prepare_memory_fault_exit(vcpu, &fault); + kvm_prepare_memory_fault_exit(vcpu, &fault); return -EFAULT; } =20 diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 3bde4fb5c6aa4..9a85500cd5c50 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2497,20 +2497,34 @@ static inline void kvm_account_pgtable_pages(void *= virt, int nr) /* Max number of entries allowed for each kvm dirty ring */ #define KVM_DIRTY_RING_MAX_ENTRIES 65536 =20 +#ifdef CONFIG_KVM_GENERIC_PAGE_FAULT + +#define KVM_ASSERT_TYPE_IS(type_t, x) \ +do { \ + type_t __maybe_unused tmp; \ + \ + BUILD_BUG_ON(!__types_ok(tmp, x) || !__typecheck(tmp, x)); \ +} while (0) + static inline void kvm_prepare_memory_fault_exit(struct kvm_vcpu *vcpu, - gpa_t gpa, gpa_t size, - bool is_write, bool is_exec, - bool is_private) + struct kvm_page_fault *fault) { + KVM_ASSERT_TYPE_IS(gfn_t, fault->gfn); + KVM_ASSERT_TYPE_IS(bool, fault->exec); + KVM_ASSERT_TYPE_IS(bool, fault->write); + KVM_ASSERT_TYPE_IS(bool, fault->is_private); + KVM_ASSERT_TYPE_IS(struct kvm_memory_slot *, fault->slot); + vcpu->run->exit_reason =3D KVM_EXIT_MEMORY_FAULT; - vcpu->run->memory_fault.gpa =3D gpa; - vcpu->run->memory_fault.size =3D size; + vcpu->run->memory_fault.gpa =3D fault->gfn << PAGE_SHIFT; + vcpu->run->memory_fault.size =3D PAGE_SIZE; =20 /* RWX flags are not (yet) defined or communicated to userspace. */ vcpu->run->memory_fault.flags =3D 0; - if (is_private) + if (fault->is_private) vcpu->run->memory_fault.flags |=3D KVM_MEMORY_EXIT_FLAG_PRIVATE; } +#endif =20 #ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES static inline unsigned long kvm_get_memory_attributes(struct kvm *kvm, gfn= _t gfn) diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 727b542074e7e..28ed6b241578b 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -128,3 +128,6 @@ config HAVE_KVM_ARCH_GMEM_PREPARE config HAVE_KVM_ARCH_GMEM_INVALIDATE bool depends on KVM_PRIVATE_MEM + +config KVM_GENERIC_PAGE_FAULT + bool --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 05D4D204C0C for ; Wed, 18 Jun 2025 04:24:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220675; cv=none; b=rlXwzvnSfo6yVb8sQo2hb0SdY58ZvFQSESS6/xF5G4ExQ9eDRCJFwjh3Xp0vx9hEEg7FzRziGvZ6nTdeTbQbjuBpPaLDA71hriN0xGlFDlCGS8RLjyGgzSgvmWYaVfdPJWe4RuEvKrY9Q2uAxBURlO+Y2OBGx5gGf1/zbcDbUvA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220675; c=relaxed/simple; bh=ktpeP3vGqvb2VrKVgvEJ+JbvYtkH68vgsXA6IZugPJ8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=c72RnoDppgtjbOJB+45CsMZD9FuNBYW1gD7G8oPR0hO5LnIgyQgdx+HGC7gXTbLGngb3jNP2Vl27RzObcv43ABm9nQOghGKDg3RnUpjzN+l7NXZaMPp1yvKwb/SGf2CjxFrBNC2KodMRKwkvrHfj0fLKdAzEcq0IzSudlm0fcAE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=cPL4pQVE; arc=none smtp.client-ip=209.85.215.202 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="cPL4pQVE" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b31bc3128fcso1583798a12.0 for ; Tue, 17 Jun 2025 21:24:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220673; x=1750825473; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=oFoW3AOc+QuFugacj5s9TiS04hgfBImIEFygFMt/Gog=; b=cPL4pQVEq0EoF49GPtsICRIBeDHI9KSLZOGdLTfzU7++/kWeqA5Vj651WH/McWTwXl 4cNEqoPPoISj3dgKmNP3Pe/rmXETGvxZJ793l93cZxadppd5FCnSFyD+x6m8lJla4VsH aRxEl8Pl3bSYAolz0vjel5jWtPjCwb8j7pXMRpa3ENR3VxtFE2BoeMd71aZ9Vdn7IHCV eeikv0gXlvj1tt1/qsLIWgsN6ohqoDV7bSpujcj6IAjdcj9UU1MqXUFjQf+FznsAg2tL 6D4QOFADKZxkk3+Vkr1r5mdRW+McBKEkRu4NigXQ4qvIiRIoyYaLM7e/Q/M/cT9rAt7M W0Hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220673; x=1750825473; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=oFoW3AOc+QuFugacj5s9TiS04hgfBImIEFygFMt/Gog=; b=GEJ5FestbC8uGGLFO++fIfYexB+IyymBUfqP6lUxLBpo7MvBI+QsJpzPx/cL/Quaft 2FdcDnH/9XAKJ1ucQhjMPTCmNcaJgEwUuDoc+FbLwGTzlTuPUQpNbxRKWpjBwp3KGpy7 jiEy2s5QbD4GVzjCYymBMtxKqLwBf9vNK/eFX4j80HQ+RFy3vQIHgU08O078PMVRhXGa 7hMfT1DyzLKUWVDO+mKghsnWdmWXpfPAC49IUmHX+9tXdQusq6anPC/9oWx2ZWy3p7zk tdBmLmiQYNYeYFKvDqFTd9JBhQTCuP3JVbT5MUJvQ1j/cUDbEsgZQzHGYdFk/M39ldwp XQ6Q== X-Forwarded-Encrypted: i=1; AJvYcCWEY64i9wh7BBGnGvTdN3R6UPHKdrpsD+GPS9u9dPGkXKHFL4nzeTXWZ7WyAGj6ksl6sUgvSJ7Rx1nvUjw=@vger.kernel.org X-Gm-Message-State: AOJu0YxndJEv9FlV9OT2VpwZAHb8YgoCbqD6yeK7GkWi0IftEObqX6IH 8ohjPz7ma+or9Y+4thM0L3Y7KM5+SJi1t5cZwtkOkKln2nCNNqfq7hyurzqSac48v24jlfg4j3F XALGm8/PlZexb8aMof3wfKg== X-Google-Smtp-Source: AGHT+IFbfVtTMrlDGyQ0S31hA6FZ725AcPC2U4LvoTBYCTExhfd2YSckOKywCjqOOmu17hz/wpGpnzKXQhdQJMVq X-Received: from pgan185.prod.google.com ([2002:a63:40c2:0:b0:b31:cd5e:6d0e]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:e687:b0:1f5:9330:29fe with SMTP id adf61e73a8af0-21fbd4c7e08mr20135116637.17.1750220673296; Tue, 17 Jun 2025 21:24:33 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:13 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-5-jthoughton@google.com> Subject: [PATCH v3 04/15] KVM: Add common infrastructure for KVM Userfaults From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" KVM Userfault consists of a bitmap in userspace that describes which pages the user wants exits on (when KVM_MEM_USERFAULT is enabled). To get those exits, the memslot where KVM_MEM_USERFAULT is being enabled must drop (at least) all of the translations that the bitmap says should generate faults. Today, simply drop all translations for the memslot. Do so with a new arch interface, kvm_arch_userfault_enabled(), which can be specialized in the future by any architecture for which optimizations make sense. Make some changes to kvm_set_memory_region() to support setting KVM_MEM_USERFAULT on KVM_MEM_GUEST_MEMFD memslots, including relaxing the retrictions on guest_memfd memslots from only deletion to no moving. Signed-off-by: James Houghton Signed-off-by: Sean Christopherson --- include/linux/kvm_host.h | 23 ++++++++++++++++++ include/uapi/linux/kvm.h | 5 +++- virt/kvm/kvm_main.c | 51 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 74 insertions(+), 5 deletions(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 9a85500cd5c50..bd5fb5ae10d05 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -597,6 +597,7 @@ struct kvm_memory_slot { unsigned long *dirty_bitmap; struct kvm_arch_memory_slot arch; unsigned long userspace_addr; + unsigned long __user *userfault_bitmap; u32 flags; short id; u16 as_id; @@ -1236,6 +1237,20 @@ void kvm_arch_flush_shadow_all(struct kvm *kvm); void kvm_arch_flush_shadow_memslot(struct kvm *kvm, struct kvm_memory_slot *slot); =20 +#ifndef __KVM_HAVE_ARCH_USERFAULT_ENABLED +static inline void kvm_arch_userfault_enabled(struct kvm *kvm, + struct kvm_memory_slot *slot) +{ + /* + * kvm_arch_userfault_enabled() must ensure that new faults on pages + * marked as userfault will exit to userspace. Dropping all + * translations is sufficient; architectures may choose to optimize + * this. + */ + return kvm_arch_flush_shadow_memslot(kvm, slot); +} +#endif + int kvm_prefetch_pages(struct kvm_memory_slot *slot, gfn_t gfn, struct page **pages, int nr_pages); =20 @@ -2524,6 +2539,14 @@ static inline void kvm_prepare_memory_fault_exit(str= uct kvm_vcpu *vcpu, if (fault->is_private) vcpu->run->memory_fault.flags |=3D KVM_MEMORY_EXIT_FLAG_PRIVATE; } + +bool kvm_do_userfault(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault); + +static inline bool kvm_is_userfault_memslot(struct kvm_memory_slot *memslo= t) +{ + return memslot && memslot->flags & KVM_MEM_USERFAULT; +} + #endif =20 #ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index d00b85cb168c3..e3b871506ec85 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -40,7 +40,8 @@ struct kvm_userspace_memory_region2 { __u64 guest_memfd_offset; __u32 guest_memfd; __u32 pad1; - __u64 pad2[14]; + __u64 userfault_bitmap; + __u64 pad2[13]; }; =20 /* @@ -51,6 +52,7 @@ struct kvm_userspace_memory_region2 { #define KVM_MEM_LOG_DIRTY_PAGES (1UL << 0) #define KVM_MEM_READONLY (1UL << 1) #define KVM_MEM_GUEST_MEMFD (1UL << 2) +#define KVM_MEM_USERFAULT (1UL << 3) =20 /* for KVM_IRQ_LINE */ struct kvm_irq_level { @@ -443,6 +445,7 @@ struct kvm_run { /* KVM_EXIT_MEMORY_FAULT */ struct { #define KVM_MEMORY_EXIT_FLAG_PRIVATE (1ULL << 3) +#define KVM_MEMORY_EXIT_FLAG_USERFAULT (1ULL << 4) __u64 flags; __u64 gpa; __u64 size; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index eec82775c5bfb..bef6760cd1c0e 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1747,6 +1747,14 @@ static void kvm_commit_memory_region(struct kvm *kvm, if (old->dirty_bitmap && !new->dirty_bitmap) kvm_destroy_dirty_bitmap(old); =20 + /* + * If KVM_MEM_USERFAULT is being enabled for the slot, drop the + * translations that are marked as userfault. + */ + if (!(old_flags & KVM_MEM_USERFAULT) && + (new_flags & KVM_MEM_USERFAULT)) + kvm_arch_userfault_enabled(kvm, old); + /* * The final quirk. Free the detached, old slot, but only its * memory, not any metadata. Metadata, including arch specific @@ -2039,6 +2047,12 @@ static int kvm_set_memory_region(struct kvm *kvm, if (id < KVM_USER_MEM_SLOTS && (mem->memory_size >> PAGE_SHIFT) > KVM_MEM_MAX_NR_PAGES) return -EINVAL; + if (mem->flags & KVM_MEM_USERFAULT && + ((mem->userfault_bitmap !=3D untagged_addr(mem->userfault_bitmap)) || + !access_ok(u64_to_user_ptr(mem->userfault_bitmap), + DIV_ROUND_UP(mem->memory_size >> PAGE_SHIFT, BITS_PER_LONG) + * sizeof(long)))) + return -EINVAL; =20 slots =3D __kvm_memslots(kvm, as_id); =20 @@ -2071,14 +2085,15 @@ static int kvm_set_memory_region(struct kvm *kvm, if ((kvm->nr_memslot_pages + npages) < kvm->nr_memslot_pages) return -EINVAL; } else { /* Modify an existing slot. */ - /* Private memslots are immutable, they can only be deleted. */ - if (mem->flags & KVM_MEM_GUEST_MEMFD) - return -EINVAL; if ((mem->userspace_addr !=3D old->userspace_addr) || (npages !=3D old->npages) || ((mem->flags ^ old->flags) & KVM_MEM_READONLY)) return -EINVAL; =20 + /* Moving a guest_memfd memslot isn't supported. */ + if (base_gfn !=3D old->base_gfn && mem->flags & KVM_MEM_GUEST_MEMFD) + return -EINVAL; + if (base_gfn !=3D old->base_gfn) change =3D KVM_MR_MOVE; else if (mem->flags !=3D old->flags) @@ -2102,11 +2117,13 @@ static int kvm_set_memory_region(struct kvm *kvm, new->npages =3D npages; new->flags =3D mem->flags; new->userspace_addr =3D mem->userspace_addr; - if (mem->flags & KVM_MEM_GUEST_MEMFD) { + if (mem->flags & KVM_MEM_GUEST_MEMFD && change =3D=3D KVM_MR_CREATE) { r =3D kvm_gmem_bind(kvm, new, mem->guest_memfd, mem->guest_memfd_offset); if (r) goto out; } + if (mem->flags & KVM_MEM_USERFAULT) + new->userfault_bitmap =3D u64_to_user_ptr(mem->userfault_bitmap); =20 r =3D kvm_set_memslot(kvm, old, new, change); if (r) @@ -4980,6 +4997,32 @@ static int kvm_vm_ioctl_reset_dirty_pages(struct kvm= *kvm) return cleared; } =20 +#ifdef CONFIG_KVM_GENERIC_PAGE_FAULT +bool kvm_do_userfault(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault) +{ + struct kvm_memory_slot *slot =3D fault->slot; + unsigned long __user *user_chunk; + unsigned long chunk; + gfn_t offset; + + if (!kvm_is_userfault_memslot(slot)) + return false; + + offset =3D fault->gfn - slot->base_gfn; + user_chunk =3D slot->userfault_bitmap + (offset / BITS_PER_LONG); + + if (__get_user(chunk, user_chunk)) + return true; + + if (!test_bit(offset % BITS_PER_LONG, &chunk)) + return false; + + kvm_prepare_memory_fault_exit(vcpu, fault); + vcpu->run->memory_fault.flags |=3D KVM_MEMORY_EXIT_FLAG_USERFAULT; + return true; +} +#endif + int __attribute__((weak)) kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) { --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 D0D9420E6F9 for ; Wed, 18 Jun 2025 04:24:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220677; cv=none; b=RT0125zb9DIEvgpo+NfHe8rgUeWgI2bpyIG2yzeupB/JdetG0cWZhLoZ9JNCV+CWeZPE/O3d5zVV3EnggTzuHlOq5KdYdeUzR+8HiSnRf5lg2gZGaTjtfL9VjW21b96Vk2z2njc1dNtJLHfy1Rszkfg0yT+k/Vmv8HrITEhiYJg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220677; c=relaxed/simple; bh=Fd4SdpBpGMWqTpDQtVvgHQNQARLYxNkES4VtDZAj2OE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=d0WpxL0+yWif5nrDflsQjIjlEEnrPFQngnnPcLjdI4vIrpLiCrQE9gPHS2LmrSlfu6M111VE0EN4iRFuzGLDGuTeHKx/LCMFfXmMqr/PG9fDAKA9CHnhZb9Wh2vUWtQEwl1eZ2H4K4aRTzh+dWcs5HD8gXZvw/ayNUSIRABu/wE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=KH1B+lap; arc=none smtp.client-ip=209.85.214.201 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="KH1B+lap" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-235f6b829cfso51739775ad.2 for ; Tue, 17 Jun 2025 21:24:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220675; x=1750825475; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=He9GMZwZGhbuABKsoN3wz9xUeb4JLf+qOIjtO6Uhl9c=; b=KH1B+laphzq9ggMTEQZDW66kmcpSWnAYBsc+aRZHqDzrFFdd5a2kfuMyA8Do5iKMKK TNM2qWwAsbo54UwgRLqPmu9xIm6uchA7dv8+Lifren1AYDWH26/xsEBFRfxGw1Rxrv0E RtugHExSRwAyTo5Rw3URXCtupYMjsnTcre+cWu3ud2Axr7N0TOxsA7URRl7vt4QM3ldj +5NTxYki7ofVN0hAqzgKWbzYtezZJHziPrYJ+1TiySFeURxabaBEE7o+XX5NW2vS9Yjw 8XjGR4lcCmA9ZcuRj+7D4fRxXBEnoPaaqVSGa4pn0EwgXRVDp66lbSu9X4sMFXNJpbas lx7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220675; x=1750825475; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=He9GMZwZGhbuABKsoN3wz9xUeb4JLf+qOIjtO6Uhl9c=; b=eMqyzFpLbwY3coZy7h+nLQJacnRp1YranJRSrurLVO7c0HBz7sQcZdGc6BPzuDrqtc RQAW3adsBz29LIs0KXpYCI13UAZ+Bz2Yx04F17OlczzB8K/tiLCCMx1g/KstQYGg+FmT aOPGAqb9gPqz6wxrxS0+8wxQJ+fVLbVT8gcCBhatP5TI1F5YtJi0Fgr9woXQGFXVOyRr /1J3T86/XZH2rGN0Bo0Rhgbo7TGjfoGCMmZuCeETZ6ypnuqeF+WarWcs4y7nGJGqhGbb oKdTLD99cum9xw7ItNTXo1NTitlKr3gK2jJnyKYduH8u1pS3HOvwU9tO2IKjVzKQOy0f NTSg== X-Forwarded-Encrypted: i=1; AJvYcCXh8EAvniXwpnZIEOdKRbQg5jsQM4sOaNhF5oVUaal6tuv47IMhPoA2BJPqWRKEmfguAWQJx8ZOwy4p9wM=@vger.kernel.org X-Gm-Message-State: AOJu0YzAERkHiiMBTgq3v4KfXeuD7PytcYzq9WtMN01S5MWLA7tK2Q2c +mBHuDM4VgLtK1A5kHsT/QIDJXLqKujLQMCRMVtZy8scMrX7NNUF3Y3+/UDEsJjPZGmtlL2KBQq n5JHelO4yZA0GbdX2W6H2Fw== X-Google-Smtp-Source: AGHT+IEz+sYmwmOj4IeHxcE6XX3uQvv4AyNEb1cpKl7A16mtz5cSX2RNnd2uZJbF+w+tZiQScGXmjNJtGrMaKECU X-Received: from pjtd15.prod.google.com ([2002:a17:90b:4f:b0:30a:31eb:ec8e]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:dacc:b0:234:c8f6:1b05 with SMTP id d9443c01a7336-2366b3fe725mr232646505ad.52.1750220674878; Tue, 17 Jun 2025 21:24:34 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:14 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-6-jthoughton@google.com> Subject: [PATCH v3 05/15] KVM: x86: Add support for KVM userfault exits From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Only a few changes are needed to support KVM userfault exits on x86: 1. Adjust kvm_mmu_hugepage_adjust() to force pages to be mapped at 4K while KVM_MEM_USERFAULT is enabled. 2. Return -EFAULT when kvm_do_userfault() when it reports that the page is userfault. (Upon failure to read from the bitmap, kvm_do_userfault() will return true without setting up a memory fault exit, so we'll return a bare -EFAULT). For hugepage recovery, the behavior when disabling KVM_MEM_USERFAULT should match the behavior when disabling KVM_MEM_LOG_DIRTY_PAGES; make changes to kvm_mmu_slot_apply_flags() to recover hugepages when KVM_MEM_USERFAULT is disabled. Signed-off-by: James Houghton Signed-off-by: Sean Christopherson --- arch/x86/kvm/mmu/mmu.c | 5 ++++- arch/x86/kvm/x86.c | 27 +++++++++++++++++---------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index a4439e9e07268..49eb6b9b268cb 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -3304,7 +3304,7 @@ void kvm_mmu_hugepage_adjust(struct kvm_vcpu *vcpu, s= truct kvm_page_fault *fault if (is_error_noslot_pfn(fault->pfn)) return; =20 - if (kvm_slot_dirty_track_enabled(slot)) + if (kvm_slot_dirty_track_enabled(slot) || kvm_is_userfault_memslot(slot)) return; =20 /* @@ -4522,6 +4522,9 @@ static int __kvm_mmu_faultin_pfn(struct kvm_vcpu *vcp= u, { unsigned int foll =3D fault->write ? FOLL_WRITE : 0; =20 + if (kvm_do_userfault(vcpu, fault)) + return -EFAULT; + if (fault->is_private) return kvm_mmu_faultin_pfn_private(vcpu, fault); =20 diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index b58a74c1722de..fa279ba38115c 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -13152,12 +13152,27 @@ static void kvm_mmu_slot_apply_flags(struct kvm *= kvm, u32 new_flags =3D new ? new->flags : 0; bool log_dirty_pages =3D new_flags & KVM_MEM_LOG_DIRTY_PAGES; =20 + /* + * Recover hugepages when userfault is toggled off, as KVM forces 4KiB + * mappings when userfault is enabled. See below for why CREATE, MOVE, + * and DELETE don't need special handling. Note, common KVM handles + * zapping SPTEs when userfault is toggled on. + */ + if (change =3D=3D KVM_MR_FLAGS_ONLY && (old_flags & KVM_MEM_USERFAULT) && + !(new_flags & KVM_MEM_USERFAULT)) + kvm_mmu_recover_huge_pages(kvm, new); + + /* + * Nothing more to do if dirty logging isn't being toggled. + */ + if (!((old_flags ^ new_flags) & KVM_MEM_LOG_DIRTY_PAGES)) + return; + /* * Update CPU dirty logging if dirty logging is being toggled. This * applies to all operations. */ - if ((old_flags ^ new_flags) & KVM_MEM_LOG_DIRTY_PAGES) - kvm_mmu_update_cpu_dirty_logging(kvm, log_dirty_pages); + kvm_mmu_update_cpu_dirty_logging(kvm, log_dirty_pages); =20 /* * Nothing more to do for RO slots (which can't be dirtied and can't be @@ -13177,14 +13192,6 @@ static void kvm_mmu_slot_apply_flags(struct kvm *k= vm, if ((change !=3D KVM_MR_FLAGS_ONLY) || (new_flags & KVM_MEM_READONLY)) return; =20 - /* - * READONLY and non-flags changes were filtered out above, and the only - * other flag is LOG_DIRTY_PAGES, i.e. something is wrong if dirty - * logging isn't being toggled on or off. - */ - if (WARN_ON_ONCE(!((old_flags ^ new_flags) & KVM_MEM_LOG_DIRTY_PAGES))) - return; - if (!log_dirty_pages) { /* * Recover huge page mappings in the slot now that dirty logging --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 0DA6921146B for ; Wed, 18 Jun 2025 04:24:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220678; cv=none; b=VSh0RX10OCb7fp9WinhXyHN1PC+/fG0ZJu1W/ED8IOSSxce5uPZk6tWnCjkrU78SC9NUxROuPppsGK6C+zJCnGxLFSfxhNxLAIQYceRmYmx0LTjblSVL3hQKVasSM4YWupq2+n9qKGfqR+1yAg4lqza+wT5AaND5l28B/OmYYQo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220678; c=relaxed/simple; bh=NPz0+9NZChr+FABsJMTAuN25yJ2sI7tDtR2Lkd4QSco=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=oqWfKQN4xRYjunRyntZZdYZMzC+qflJhvxBdtkLzSxX1ti/e/kOZmVKyxlkw6IDRhcJdm1+uurD+oxcZnTCGIIjfDOJXP/k+PcdU8p4VtwOeL8YcjZpD8mOajTuTy0x9BCa6Hyc17IUhoCY9J4DKgFj/0JKbVPW5dgfh9NfZd2s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=3HiNoPEr; arc=none smtp.client-ip=209.85.216.73 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="3HiNoPEr" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-3121cffd7e8so5248175a91.0 for ; Tue, 17 Jun 2025 21:24:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220676; x=1750825476; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Crtc37yj3I5HY0sOOY/Hc9qKBpXKt+15nfqytsnjM48=; b=3HiNoPErfo7kydQaNjYH+735LMmei2TZUHSQcMwl8H8YOCupVnC5Y3QGo66IOXwSra xO67bvOk7Nz/6AWdeORFdzlVKwYQtLQqFOuAh5fhFA4tZAjblAyhLD0CqDBqruCha7ia sqZDCCf/sqMF443ANY8anWsVnEU3S6FOcS2WU5U2VAbnKAPYpYI2YEGGttbkYO7oMHvw KQswzSS5LhJhrzjGl3cBXlBgNcce/6u1+FDdOH+9bs9KmCiA6rNZQYGQK41+ITk03o4m /C5v+NFcGQwhPApvZ892WmB4qqI7Gg4F6stzBEi5HSz3wF5+tYl5dasALWW/IDGU68UF LG2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220676; x=1750825476; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Crtc37yj3I5HY0sOOY/Hc9qKBpXKt+15nfqytsnjM48=; b=CKVAjbjt9kWwI4s1UJO7jUhAYHkG0oxf2fZWf7KVUfhQ9fLmlxvFfm8I9cbytV4Tuu W17FzoZo3MCoBYCgd2dvM37zZhUmRwbLYoZjaiaXhxBbyiEHb0lhi8Ux9rGiepsoqqC9 per9cSahfJsjidl9OPfNMZojXb/J/2zXPwEYN1uU/tuXI2suHrHtWUMqXbeWpS0wIX/E 0icvLL6hEBgoblQuiay6FsH8TlyKlvKxw/CfjdEmq8U4KiLR/WM7/et1v7Qo+NrQVcc7 Gpo7Am9270C/VRNq/kuMmU9IHB40+fWKC3b7SNzkJftX5lpOtPs9KNxhcJkHTHKi5Q9o Apsw== X-Forwarded-Encrypted: i=1; AJvYcCUyKxbdRTd4/hRd86ug8HmZ3FG8dz3MsdgzUjAjGRvf3RCchA8KQeyosHniHPIuceX03H0RJVncIoUWrfE=@vger.kernel.org X-Gm-Message-State: AOJu0YypcLZnL9tUetWR9S7PoRKUFIKp4FAyW3UDzvJPlRLworQHixmo kOVXCqHCi7qFuTq2YJP/hPLuHDLgpk+yqGZqhUXq9m0RgAUcEDp517xJcy/Bd1Q6maApfFvVIUB Nk2XJ2oGMtlRLexTOyXRY4A== X-Google-Smtp-Source: AGHT+IECQVYtJtqccD2ckXzkUCRtEGI61f7empdw5CPtw8UB73TqbA6HTmrTRxT/T52yNYKeR/onnUx3D5hsOmVD X-Received: from pjbsl11.prod.google.com ([2002:a17:90b:2e0b:b0:312:1dae:6bf0]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:5245:b0:311:ff02:3fcc with SMTP id 98e67ed59e1d1-313f1c03409mr27710648a91.14.1750220676391; Tue, 17 Jun 2025 21:24:36 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:15 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-7-jthoughton@google.com> Subject: [PATCH v3 06/15] KVM: arm64: Add support for KVM userfault exits From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To support KVM userfault exits with arm64: 1. Force mappings to be 4K while KVM_MEM_USERFAULT is enabled. 2. Return -EFAULT when kvm_do_userfault() reports that the page is userfault (or that reading the bitmap failed). kvm_arch_commit_memory_region() was written assuming that, for KVM_MR_FLAGS_ONLY changes, KVM_MEM_LOG_DIRTY_PAGES must be being toggled. This is no longer the case, so adjust the logic appropriately. Signed-off-by: James Houghton Signed-off-by: Sean Christopherson --- arch/arm64/kvm/mmu.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 0c209f2e1c7b2..d75a6685d6842 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -1548,7 +1548,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys= _addr_t fault_ipa, * logging_active is guaranteed to never be true for VM_PFNMAP * memslots. */ - if (logging_active) { + if (logging_active || is_protected_kvm_enabled() || + kvm_is_userfault_memslot(memslot)) { force_pte =3D true; vma_shift =3D PAGE_SHIFT; } else { @@ -1637,6 +1638,9 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys= _addr_t fault_ipa, mmu_seq =3D vcpu->kvm->mmu_invalidate_seq; mmap_read_unlock(current->mm); =20 + if (kvm_do_userfault(vcpu, &fault)) + return -EFAULT; + pfn =3D __kvm_faultin_pfn(memslot, fault.gfn, fault.write ? FOLL_WRITE : = 0, &writable, &page); if (pfn =3D=3D KVM_PFN_ERR_HWPOISON) { @@ -2134,15 +2138,19 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, const struct kvm_memory_slot *new, enum kvm_mr_change change) { - bool log_dirty_pages =3D new && new->flags & KVM_MEM_LOG_DIRTY_PAGES; + u32 old_flags =3D old ? old->flags : 0; + u32 new_flags =3D new ? new->flags : 0; + + /* Nothing to do if not toggling dirty logging. */ + if (!((old_flags ^ new_flags) & KVM_MEM_LOG_DIRTY_PAGES)) + return; =20 /* * At this point memslot has been committed and there is an * allocated dirty_bitmap[], dirty pages will be tracked while the * memory slot is write protected. */ - if (log_dirty_pages) { - + if (new_flags & KVM_MEM_LOG_DIRTY_PAGES) { if (change =3D=3D KVM_MR_DELETE) return; =20 --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 99A25217648 for ; Wed, 18 Jun 2025 04:24:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220680; cv=none; b=WR21wcw5UZ3hqRpUT4WjNnBbJIAm0oynNtbYlU5T2luGsIjDDlF6TOnuKQAKasW+XTbtZ0mZ7yDvE56p1u+9mqXK+r3SKxSmLUPXj3QkMn7Nz9rFDuM6xSBC5NtGleZVPB8oMySDpSbtKmIleqWfNZXRdJaXLPZRQqBN0v+qwAg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220680; c=relaxed/simple; bh=RjOGGjzo1gz+MJ4XHnzV65K+mX6uQwTz9v2uyBR8F74=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=DuHRKTmtYrUm9KdwGuOdDykIQL0W4+K391JrkNcGZKTsvacOq+gRLsCZ3xnQs1zNBpdAx9O67f16PEgAtdnpXtuVacY91SLdZxsNYnyaxxmB5MzsG0AazXv8oxnPRCbZbL4ajCt4ezTGkcK9bzsyf2cc2K/csMfUuq7WFNQttUM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=LmFG06QS; arc=none smtp.client-ip=209.85.216.73 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="LmFG06QS" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-3138c50d2a0so8960687a91.2 for ; Tue, 17 Jun 2025 21:24:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220678; x=1750825478; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=u7uDKQXpUwdrzKwoUkA90P4kaViu0b/lAOUYW7NM+2o=; b=LmFG06QSpvI9kslH54L9ZBzmL2vQPHE23udaQdw3yxlcbVTs7uMyhHrSalyOq5Y+1X zHZ+E7VCBB2GCaHQwbX46oVP683MBeDZsIv3ik1UxXPu6DiuND2gp6KEYUZXmPFC9ZqX dcF7XM8JHygb1RUSHPyvR10yOVg38uEgMyGrTumDiyNLc2IpmkAZEXk+BLZxRkWl87D7 EkmRiWyWS27tc8le+DSDJAvYk44dVkf3Umq5uzp2ZkQ/RwKYoB99PDRpA4i0b8te5HbP ejrvCSw+3R3G7EGkLDckWgsl+zFBQJuchIdVuKQmH15sBXzg4T0Je9XY3GUDnh4tt/Gv 2y3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220678; x=1750825478; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=u7uDKQXpUwdrzKwoUkA90P4kaViu0b/lAOUYW7NM+2o=; b=PJ9fgbjD3ZR2LVvYifDrTiUBxqya6Z2zz0uvT1xU+cdnDYFP96d5WAkqCCF2vMxkrk oJMP3k72SDk+iiY6jdjIJB05cgsXcOeZzfbv6L3qZrHoNOecahkpePw7lkxQi+6bAmYY ruF6q/wfMwn99Pkhgr1Uy8yoC0SvaBq5lrNwgbTXi5JGKBO6W4zEyjxlBeJxo5qaVVht S1wyRZZGLatNlPNeAAw2HFirThpK7888p5RLC83lDCVn+WPZocd20k5TD6r8vKzv/sLE 9QdhjJIOyHIRGwH6VM6qbiJwb9ZLdRhuaHbzuWFFxG8LnXEzWGZdoEBEuhrnJaVllM2P kSJA== X-Forwarded-Encrypted: i=1; AJvYcCVU9o3+AlLz2faGJWo+ElAVqW4lgnC6d1wYAK+tq+SF+moRx+h9HWIOiOMCF1QeBNPntIukd04BWbJLcdM=@vger.kernel.org X-Gm-Message-State: AOJu0YzKznimp3pbiqcLJQFi86nDlOU5yHyik5aPKDOeBqRv5nZiWR0e ywGc6vuoYUNd3ZjAIq9fGDoKYAQEAWHvmJa67EkC7WqNz2egt/TSE7D94ieJIV6FBR/odQqBdlh 8LZ7V5t1GdsOq1Um2Xneh4g== X-Google-Smtp-Source: AGHT+IEsvRhaA+pgvEn2VcIt6EZL6lLvB8OQlgHyuSOj5NMOQERsIQvH6ATMkLPJIOGQBvW8tdGSJDJWdEvdsdMB X-Received: from pjbsm7.prod.google.com ([2002:a17:90b:2e47:b0:312:f650:c7aa]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2d47:b0:312:db8f:9a09 with SMTP id 98e67ed59e1d1-313f1c380f7mr29459716a91.14.1750220677882; Tue, 17 Jun 2025 21:24:37 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:16 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-8-jthoughton@google.com> Subject: [PATCH v3 07/15] KVM: Enable and advertise support for KVM userfault exits From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that all architectures (arm64 and x86) that utilize "generic" page faults also support userfault exits, advertise support for KVM_CAP_USERFAULT and let userspace set KVM_MEM_USERFAULT in memslots. Signed-off-by: James Houghton Signed-off-by: Sean Christopherson --- include/uapi/linux/kvm.h | 1 + virt/kvm/kvm_main.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index e3b871506ec85..0ba265f99f033 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -937,6 +937,7 @@ struct kvm_enable_cap { #define KVM_CAP_ARM_EL2 240 #define KVM_CAP_ARM_EL2_E2H0 241 #define KVM_CAP_RISCV_MP_STATE_RESET 242 +#define KVM_CAP_USERFAULT 243 =20 struct kvm_irq_routing_irqchip { __u32 irqchip; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index bef6760cd1c0e..2962be09d5ebf 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1604,6 +1604,9 @@ static int check_memory_region_flags(struct kvm *kvm, !(mem->flags & KVM_MEM_GUEST_MEMFD)) valid_flags |=3D KVM_MEM_READONLY; =20 + if (IS_ENABLED(CONFIG_KVM_GENERIC_PAGE_FAULT)) + valid_flags |=3D KVM_MEM_USERFAULT; + if (mem->flags & ~valid_flags) return -EINVAL; =20 @@ -4881,6 +4884,9 @@ static int kvm_vm_ioctl_check_extension_generic(struc= t kvm *kvm, long arg) case KVM_CAP_CHECK_EXTENSION_VM: case KVM_CAP_ENABLE_CAP_VM: case KVM_CAP_HALT_POLL: +#ifdef CONFIG_KVM_GENERIC_PAGE_FAULT + case KVM_CAP_USERFAULT: +#endif return 1; #ifdef CONFIG_KVM_MMIO case KVM_CAP_COALESCED_MMIO: --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 EB309218821 for ; Wed, 18 Jun 2025 04:24:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220681; cv=none; b=JiZZDHF1LSOu+XEuWPn8FDE56bhY9j4/3+dxq9WmnZWxALVq6CLo1k0Q2/KhuB5K14MlRWYpGVCzl35gt1ge/BbgW4nM4ckkeCvm39phCeg6Qnwu0ukl/aqufNRXI1/lnM53ndOJ2ICpqT19cnwMEByghaQcg8pX5drXQ14wYU4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220681; c=relaxed/simple; bh=M4cA5QCIbC4IC69I7rkdIXP2+hXIfCYUAcCljeAUiHs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YSRGMQdMpAxL+1q+coaA/cjMjl1kop+TZ5XaRGO/AneJC9NvE7RmUIfft+Z3r2yljFxbXXtqxFnwLzDB1iEcNx9Fjvgb9ZZW395FlZktOrYW6qWKAPHpP8GbZRIq6+hFcg/yBZIdeAwAak4L63zz82Nv8isnX/sHiMHCvgNGxU0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=l5OD17Ho; arc=none smtp.client-ip=209.85.214.201 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="l5OD17Ho" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2369261224bso17374965ad.0 for ; Tue, 17 Jun 2025 21:24:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220679; x=1750825479; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=7EMNAB7VqggYskY7+oMW704PIZytljaHYvhJuoy4xGs=; b=l5OD17Horq3OM1avRrphBdfnroSlZGi9P2pMC+1CzyShVQ8woxzk40rE9G6tOo0Hcd G7voY+f9Iy8T2C4XHckV+Ipf6DhcHHerj0RBQjxxWKgjovOPKxMGCPdi4iYxgjnXdKsk 9qXFh/Iy+aQ9uMOCAEPPH/ZRX2DwbiJ/r356hzeQlOx3b+ka6AbezRc2JX5HBI7p3J5Y XclB9pYg4ztShPeYW6prdILfWrCywDr05QdAVyzPcbO0JT9IHSK6JHEbYjQtZuFm/ivb VgkPP/SCtHO6/oGFEiSN2uOh5LUBieCtXMmeaEYG6RhGhZOxSncMf+zM9ypLj/fklQX+ aN6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220679; x=1750825479; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=7EMNAB7VqggYskY7+oMW704PIZytljaHYvhJuoy4xGs=; b=BDI2T2TM36eUm7q19aQobcfVmSBpOF0hWE8i2rwjwc2H9TRrz45OzyukBOYdr2zuuN bybm6XZzhD5ariSlNURz327UzW1BUiWaDhiOLpPebuQkiHlB6rFG6Eo9e37nwv+nPcbT C3uwLbXhKxhLugpK5Zn6/YEPYEJ/na84Lxt/UMvPol14iCH78WiEet0ECd1rIOt5yIHW 4Wj6ibwTZuKrhlduvO/xwSzZTzLi5v5O/lVIi+aNJwZ/pJF4j05K+GYbindpJtk7wXMh EJLBEQzQIdC2n3B4/gFnsIyZZMbkgF3hxL7aSsoRqbYPX6LA2afVfxc/xf+lVS5OXKjn zCuQ== X-Forwarded-Encrypted: i=1; AJvYcCXqoKt20bkqK2TATCTofQ3S4pUqapkQgQzKI9nJD5W8dZjutAqxm7R7c5GTzubez2RVUxng8mkqt8v4zX0=@vger.kernel.org X-Gm-Message-State: AOJu0YzTelXQf9yi//7vlQAnH19QMJ1e2S9WRdne40A2dNkAbEsYS7QY 0N0mGpB3gBVs4DbhHit2jmvzU0dVYNvQvZ9Ha9MrlY0iAuIrPCaF6OhxVXgt4hLA7xjch9XrcxJ WZGoDfY1BdDYgYoioYISeTQ== X-Google-Smtp-Source: AGHT+IHf6vnwz6tnrJF7nGJhTQOliXFukjknoI4nKYkvX84klDeaakiCUnur6sPI4XGwPrQLqZt03lOgVrYxLq6x X-Received: from plbks6.prod.google.com ([2002:a17:903:846:b0:231:c831:9520]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d2c9:b0:224:23be:c569 with SMTP id d9443c01a7336-2366b32a5a5mr279237755ad.22.1750220679165; Tue, 17 Jun 2025 21:24:39 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:17 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-9-jthoughton@google.com> Subject: [PATCH v3 08/15] KVM: selftests: Fix vm_mem_region_set_flags docstring From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" `flags` is what region->region.flags gets set to. Signed-off-by: James Houghton --- tools/testing/selftests/kvm/lib/kvm_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index a055343a7bf75..ca1aa1699f8aa 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1200,7 +1200,7 @@ memslot2region(struct kvm_vm *vm, uint32_t memslot) * * Input Args: * vm - Virtual Machine - * flags - Starting guest physical address + * flags - Flags for the memslot * * Output Args: None * --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 8194521A452 for ; Wed, 18 Jun 2025 04:24:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220683; cv=none; b=U0RFZuL0QCnIvcPUK7anxv/sCLnTmusYMsxOVRnUl8q1l0TLy3xPUjNn6LjcDSCgoFvO3u77Zevp74jzn178LUR8DD3TJ3zk42wX1KjaKRkiDEFwd+xjlUzUIWuzzk6iIhWdEf0HRq1t0aiAX2aKNk+8U1JgoA0LVCk1TrME3BU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220683; c=relaxed/simple; bh=2bZIqpioQGHINFU/EiphRLQAzeRmXnkDiiTDnIIiQmI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=hOoidbKwEPnUM8YoVn42gO9aN+dxGEpX5vPhRijltdY0WrcA+m+msscJDb/sMhIoDjBe85KIVRUM4o/2on+v6Z++CGULogRStDOCLbdImPqiyscPq4/BdswbsiTwO+W6TI6MtOKQkJTtFJdZ/XV2tVaYJLTFSO1VHfanXFGzj+o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=1RqjUi/L; arc=none smtp.client-ip=209.85.214.201 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="1RqjUi/L" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-23692793178so15514065ad.0 for ; Tue, 17 Jun 2025 21:24:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220681; x=1750825481; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=mIb2ZAeP1IApX8KajcoQdMg+K+X03gdKKVOXgy4uxAM=; b=1RqjUi/Lqtf8B4bqGv8uCzLjMH/uxDca5PmvLJbmPWGSoNUIbvFxBXM/xCQmX/b7Ul N9qSh6HA1j67OsAvAXGEtxnGGMJIAN8EgFEXuZkyZ2dJ4ny0tu/h9W1Rpik9MuidSmI7 uMseHRLO6OYF4RBZy9lX0COPgPKnG9WewduNITNRCRMzxTwwc8MEkVMnZSqMJGuRkH3U C88tWETm53Td1bEipIsQI4jlhUDcElNK4Sw+y7hYPITpACzNsRWAC2Nk1oBBHmHyH2KJ NCP69EKiyF1YfcU0eH/fLh9/xz6BO8S4j9lrXU+pJUxxjeU4HrEcIwlC/Zlgjj0ZA0br uvlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220681; x=1750825481; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=mIb2ZAeP1IApX8KajcoQdMg+K+X03gdKKVOXgy4uxAM=; b=uVxSVQ1RVhUWxRU8zq1nKmg+dCh0o4clKdzZib5vXEr1LrcXiY+9l9SU8aggVqWtl3 h44GD3m9BYmqSUu7i9RuMpa2d9e2vabtH6CjkiZwOOsq6iqtPf6mLq4lpLoWktVLCylQ 70LAN1aw+8Ec2eov7F8XdBH5uxh5djtG7AoD211V43TS+FFWeWg3l25o47sJwFf7BS8e h8LpPGVsGwG67lHxdXa3zFxoW1qSCSMqgFrSd07lalRX2WEzb/CLLyGRug0rbhwJBtfQ IJeziuzCY+z8mMAe2Og2ve98CHlhY+nfoqsl7v2+6jxRgjlHJRZcUlbHwXprN6qwStLN ssPg== X-Forwarded-Encrypted: i=1; AJvYcCVFO7+xf50DPY1DoYrylhi75KO/JP3It9BsAYexcPSAsfsS9Zs0zj++nbD23ilQnm9Zg5MS5B422XCGbJg=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6VQpOvyabc77MX8GiX+SIhehJ+Xhc85fLTBJqqKGzx4saeChC SKiEnLotuMKqXiNflUIE5zxY24av1fSlZeZCCEoUT+rEs3MTEnXYuu3pfUY2DCMTgr2kYFLte/C Jf8U8VpYep4shFmkcGXN6lA== X-Google-Smtp-Source: AGHT+IHIvgUZR0zBF5d+sewo95QOsT/HjDVkEn+tDLrOgLskqZ9xDvbZRR23CwdW2Cit9o8BMVaShYmHas3nnjqN X-Received: from pjbmf13.prod.google.com ([2002:a17:90b:184d:b0:312:eaf7:aa0d]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:228b:b0:235:655:11aa with SMTP id d9443c01a7336-2366b17b16bmr234970365ad.39.1750220680638; Tue, 17 Jun 2025 21:24:40 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:18 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-10-jthoughton@google.com> Subject: [PATCH v3 09/15] KVM: selftests: Fix prefault_mem logic From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The previous logic didn't handle the case where memory was partitioned AND we were using a single userfaultfd. It would only prefault the first vCPU's memory and not the rest. Signed-off-by: James Houghton --- tools/testing/selftests/kvm/demand_paging_test.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testi= ng/selftests/kvm/demand_paging_test.c index 0202b78f8680a..315f5c9037b40 100644 --- a/tools/testing/selftests/kvm/demand_paging_test.c +++ b/tools/testing/selftests/kvm/demand_paging_test.c @@ -172,11 +172,13 @@ static void run_test(enum vm_guest_mode mode, void *a= rg) memset(guest_data_prototype, 0xAB, demand_paging_size); =20 if (p->uffd_mode =3D=3D UFFDIO_REGISTER_MODE_MINOR) { - num_uffds =3D p->single_uffd ? 1 : nr_vcpus; - for (i =3D 0; i < num_uffds; i++) { + for (i =3D 0; i < nr_vcpus; i++) { vcpu_args =3D &memstress_args.vcpu_args[i]; prefault_mem(addr_gpa2alias(vm, vcpu_args->gpa), vcpu_args->pages * memstress_args.guest_page_size); + if (!p->partition_vcpu_memory_access) + /* We prefaulted everything */ + break; } } =20 --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 BBF71219307 for ; Wed, 18 Jun 2025 04:24:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220684; cv=none; b=ZyZVrejoH1NrPiJ8ckfU9f/R6VuuzIu3myhkiEz7hGlCRkabkVvZVr3y3OSMyy9fWsMM2ozXN3JYSkFnWuuoJOHzLeItbTQ5TjwoOoiIojqaHCzv3oxNRxvwGzW28LBPUQenX9sJRroIEZD5eXP2SRDa4gLuFdNoceURUat16aM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220684; c=relaxed/simple; bh=Xd+l4yVTMF6sIq+heJRlqv5EUOVaKyXfY1hn736d6Rs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=NQOjuVKqGNda29u5UrGnZJzkx0dIUN+5nBYDRJns/+WapxbMaNIJAiTLqSPoQMfAcQuSF1Jgb3Ock3k68GQWCIoyd/GiSXljGwGJ10jmwKJICx1MrLaarwQ7iSfGwDyThiA8Hk+kri8D2FoLQ2WDCvovMO+k1luvmtNRxhsVZQA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=YYW6d+9e; arc=none smtp.client-ip=209.85.214.201 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="YYW6d+9e" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-235842baba4so53968015ad.3 for ; Tue, 17 Jun 2025 21:24:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220682; x=1750825482; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=TiynHwWK8Tuc2ZhwblhQo9IFn5bKLScHdC3X2XmCKdY=; b=YYW6d+9eImKQAgLAFa/YIPUW9l+Xnlyp9slQjm2pzdPCEQLi93rzOOvBqXGZUU9SgW Kx4TgKxRyrpWYXeBsu+SDbIrr5q9Dq+nLG9l7BQWOleypkPY5DGYpA7YTi69dI5hSaTI DLbsDfTLnc+smRLv2OLzFSiRMwNKk6DEPjA6X9N76dKa1fXG31J79/SYhXI74Xh7Ssd3 f4uOQdm9kJgaMu579duK7o3kAJyZco8dsuw7cw2HO8IPM+8g3J5ks8wHP8tRmSbUiMSo 8AkoiK1X7g/85jz8shIIVKZCWrBaqyilUMJcvS6UfaOOih3xtahjJGBoRT0Q1Fg1NrEU 5USA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220682; x=1750825482; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=TiynHwWK8Tuc2ZhwblhQo9IFn5bKLScHdC3X2XmCKdY=; b=q8x7EAOanGoK1YG7sFbn5WNht1ekQ01lgF+cXJSKVNqUkAbGXJAoSi/HvBLhwpJK0u PRGDM/8e2DnEDh6ZAefzjkeqAcXY5Nbag98ZuJD1AXxvMqJJXFdMzD87S3hWpha5CDkv C5AFz9TlmBQXiDa4zJeeYcAR9OTqH74nRUyBwwtPSqrVnzuSfAqHCooO6FqOWM8+JTlk N8+Y7HJCFqfXQwAytzFGMXrVndN5uCCqTsoNbdudbMv1lZ1a4xb2+ioV+ODKVs6ARhuV WKc4vPMgUHOK7o9Can05O2KsCQtJ733a2STg4JMMGmWW+UsN8yAvAQIy3QOJDFMtrl2M QM7A== X-Forwarded-Encrypted: i=1; AJvYcCXX2eBHrpm/tpKcZKwePmAs9gWVHge2jBVK2gtPKgSpqkN1OmzQh+oCOKyvVGJ8/LWE9xXHBY4ZE5u0LM0=@vger.kernel.org X-Gm-Message-State: AOJu0YzhKarA+YN0wpWUGQwPAluQf3Nb7J06eZPsjb6dwyhTe8YpN3cn LNj/gXM9ubY91dkqlpNeu4X0H/lHT0RDwgcgIfeSkmWzgRXkKXdu2FKpxSun+2+TA0wmlBAvTa3 CdORBrtUt0ig60n1lJ6lf0g== X-Google-Smtp-Source: AGHT+IGRuVATub0VagSwSO594ph7F/RA6BsWrOduHNPJT0NSOVEpTFRu1SVjCYkpWfQ84SvEpdSv99cmJKRK2o6P X-Received: from plbka7.prod.google.com ([2002:a17:903:3347:b0:22e:4bf7:1cb7]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:cf0e:b0:234:d7b2:2aa9 with SMTP id d9443c01a7336-2366b1221femr249131655ad.29.1750220682173; Tue, 17 Jun 2025 21:24:42 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:19 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-11-jthoughton@google.com> Subject: [PATCH v3 10/15] KVM: selftests: Add va_start/end into uffd_desc From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This will be used for the selftest to look up which userfaultfd we should be using when handling a KVM Userfault (in the event KVM Userfault and userfaultfd are being used together). Signed-off-by: James Houghton --- tools/testing/selftests/kvm/include/userfaultfd_util.h | 2 ++ tools/testing/selftests/kvm/lib/userfaultfd_util.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/tools/testing/selftests/kvm/include/userfaultfd_util.h b/tools= /testing/selftests/kvm/include/userfaultfd_util.h index 60f7f9d435dc2..b62fecdfe745c 100644 --- a/tools/testing/selftests/kvm/include/userfaultfd_util.h +++ b/tools/testing/selftests/kvm/include/userfaultfd_util.h @@ -30,6 +30,8 @@ struct uffd_desc { int *pipefds; pthread_t *readers; struct uffd_reader_args *reader_args; + void *va_start; + void *va_end; }; =20 struct uffd_desc *uffd_setup_demand_paging(int uffd_mode, useconds_t delay, diff --git a/tools/testing/selftests/kvm/lib/userfaultfd_util.c b/tools/tes= ting/selftests/kvm/lib/userfaultfd_util.c index 5bde176cedd59..31d38b3a9d127 100644 --- a/tools/testing/selftests/kvm/lib/userfaultfd_util.c +++ b/tools/testing/selftests/kvm/lib/userfaultfd_util.c @@ -152,6 +152,8 @@ struct uffd_desc *uffd_setup_demand_paging(int uffd_mod= e, useconds_t delay, expected_ioctls, "missing userfaultfd ioctls"); =20 uffd_desc->uffd =3D uffd; + uffd_desc->va_start =3D hva; + uffd_desc->va_end =3D (char *)hva + len; for (i =3D 0; i < uffd_desc->num_readers; ++i) { int pipes[2]; =20 --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 4C6B321C188 for ; Wed, 18 Jun 2025 04:24:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220686; cv=none; b=G/JYIFrLGrTXjcsU2qE0+LXAmUYKZOev5htBgR3BQRd9z9OA4h2SrifHwAl833t+nRHPod/n1VUhQ37iqPuP3ZCPM29jvNmHDeabLfRVXvm1GTTkMr8NTCumLUUTZF2+o5o46Esj52ylIVoi80NkCHBItSG5TsDaTs9459GW/FA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220686; c=relaxed/simple; bh=2Jqtawu84Q9SrYBX4lA8ZiNewBmhCKbdKZCBOzSNvpc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=iuhYPDXUlBF4NSpE2NP05ggGOxlsILXil9c7nTq0SjYlsK1xwVJ6oRLUdwQw4YB+4/P1lKqvoRAOgZCPuaBZFWyQdyssZjvZgKJjqhvLFZl+3fGul55tSvOjH5m1Fs0WHgUper9I4neHvyzsvoY2q5nj/Z6XA+4/fkTfV7KGkTI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=b6NgWyPC; arc=none smtp.client-ip=209.85.210.202 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="b6NgWyPC" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-747dd44048cso5315704b3a.3 for ; Tue, 17 Jun 2025 21:24:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220684; x=1750825484; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=WoxhG1S8O1qCut4arFiLH4UBmX2+J3LQcOUx3bB9Ok0=; b=b6NgWyPCtF+z62oZ+h9H2fsHxP49liOwfRPBp9J8DAPjEGZImx8FwC3bqXqk048Tts GSE3Sc5Rd/PX6M7bvXzyMG/RQMfKUnUaOsN8/ect7IY6xsWGMvFEqNy8oxACoEt8mpO2 cFTcRqE/0HsxyLz6vXut2uCNoWBZ6e5IV0kEp7CPNkuYvgxRoR0dW+AkPOtHEaT6Ofw7 vGkHzpoNZl42aEjFD0bEMMhWApNyda66jnM34up9p6+Zf8irOZu/L30oC1bhL+8LKuyJ 14607rDmPXu0VQ/liyiu7W6ySbH1Aa0LS6hb9D7ZcNXfJUlC0FHwP12ZgjyrZNNLLxdC Ydmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220684; x=1750825484; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=WoxhG1S8O1qCut4arFiLH4UBmX2+J3LQcOUx3bB9Ok0=; b=qkemTaDyunBAZQ1nRGZqrFkoUuTFM3kEpd0lppwdMbuBd5wj1AkJsKMwUBP3pTRhVI xT2wRudGzzOPqBH2eazvKRrhImM104rGNp3KW2ms/dULIi6/X2XIxVF4FdNd1RwGsovr bBTvvQBxWTI28UtAfiOfJRpYaaOFcWNBaLxX35s5b0KqylhlRMhmTDGxMqzRUo0ipVBO IS3EiCLPy5c/seX0NZDGtoV6NzHSS6PAmHSLI4tsR46fl55RarP8ci73y7FabIz+njML kk3e93GN2blS6Ux0l7G3O9KKeQR37XQ53iNzjHNEk4CscubOnRM3RTgzF83658ZsPuy8 Md/Q== X-Forwarded-Encrypted: i=1; AJvYcCX2V9JYHZG2rAvErMl/Jo4D4Hf/UWQP4VcgNCmqSvznunClx3IOR2y3qS8kLYjC3vkr9K6OnKqAKbrPR4Q=@vger.kernel.org X-Gm-Message-State: AOJu0YyRR3MuH1n8+7aKkVYJiufBPndXXG7o6rJAHTpLCEWl85Ss9pMY 5nGFHUISugf1MAThKzM5pa1b4ewR6bhLqJWGeswNTS6zm8i11LCED4SZxftZ0n0Ewsp88UjI9PP iM8t9ctn+Si2ttJ11JlknMg== X-Google-Smtp-Source: AGHT+IGRxlGskSElixeUhJSmb5ty4gtUfs1We31V1IESMwh3sYJDl1lv5tpJbIlFfs6HerHhqMbCgDwzxe3q1rwB X-Received: from pfbko19.prod.google.com ([2002:a05:6a00:4613:b0:746:18ec:d11a]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:2e02:b0:740:a52f:a126 with SMTP id d2e1a72fcca58-7489cf72a4fmr18059367b3a.9.1750220683719; Tue, 17 Jun 2025 21:24:43 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:20 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-12-jthoughton@google.com> Subject: [PATCH v3 11/15] KVM: selftests: Add KVM Userfault mode to demand_paging_test From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a way for the KVM_RUN loop to handle EFAULT exits when they are for KVM_MEMORY_EXIT_FLAG_USERFAULT. In this case, preemptively handle the UFFDIO_COPY or UFFDIO_CONTINUE if userfaultfd is also in use. This saves the trip through the userfaultfd poll/read/WAKE loop. When preemptively handling UFFDIO_COPY/CONTINUE, do so with MODE_DONTWAKE, as there will not be a thread to wake. If a thread *does* take the userfaultfd slow path, we will get a regular userfault, and we will call handle_uffd_page_request() which will do a full wake-up. In the EEXIST case, a wake-up will not occur. Make sure to call UFFDIO_WAKE explicitly in this case. When handling KVM userfaults, make sure to set the bitmap with memory_order_release. Although it wouldn't affect the functionality of the test (because memstress doesn't actually require any particular guest memory contents), it is what userspace normally needs to do. Add `-k` to set the test to use KVM Userfault. Add the vm_mem_region_set_flags_userfault() helper for setting `userfault_bitmap` and KVM_MEM_USERFAULT at the same time. Signed-off-by: James Houghton --- .../selftests/kvm/demand_paging_test.c | 139 +++++++++++++++++- .../testing/selftests/kvm/include/kvm_util.h | 5 + tools/testing/selftests/kvm/lib/kvm_util.c | 40 ++++- 3 files changed, 176 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testi= ng/selftests/kvm/demand_paging_test.c index 315f5c9037b40..183c707310933 100644 --- a/tools/testing/selftests/kvm/demand_paging_test.c +++ b/tools/testing/selftests/kvm/demand_paging_test.c @@ -12,7 +12,9 @@ #include #include #include +#include #include +#include =20 #include "kvm_util.h" #include "test_util.h" @@ -24,11 +26,21 @@ #ifdef __NR_userfaultfd =20 static int nr_vcpus =3D 1; +static int num_uffds; static uint64_t guest_percpu_mem_size =3D DEFAULT_PER_VCPU_MEM_SIZE; =20 static size_t demand_paging_size; +static size_t host_page_size; static char *guest_data_prototype; =20 +static struct { + bool enabled; + int uffd_mode; /* set if userfaultfd is also in use */ + struct uffd_desc **uffd_descs; +} kvm_userfault_data; + +static void resolve_kvm_userfault(u64 gpa, u64 size); + static void vcpu_worker(struct memstress_vcpu_args *vcpu_args) { struct kvm_vcpu *vcpu =3D vcpu_args->vcpu; @@ -41,8 +53,22 @@ static void vcpu_worker(struct memstress_vcpu_args *vcpu= _args) clock_gettime(CLOCK_MONOTONIC, &start); =20 /* Let the guest access its memory */ +restart: ret =3D _vcpu_run(vcpu); - TEST_ASSERT(ret =3D=3D 0, "vcpu_run failed: %d", ret); + if (ret < 0 && errno =3D=3D EFAULT && kvm_userfault_data.enabled) { + /* Check for userfault. */ + TEST_ASSERT(run->exit_reason =3D=3D KVM_EXIT_MEMORY_FAULT, + "Got invalid exit reason: %x", run->exit_reason); + TEST_ASSERT(run->memory_fault.flags =3D=3D + KVM_MEMORY_EXIT_FLAG_USERFAULT, + "Got invalid memory fault exit: %llx", + run->memory_fault.flags); + resolve_kvm_userfault(run->memory_fault.gpa, + run->memory_fault.size); + goto restart; + } else + TEST_ASSERT(ret =3D=3D 0, "vcpu_run failed: %d", ret); + if (get_ucall(vcpu, NULL) !=3D UCALL_SYNC) { TEST_ASSERT(false, "Invalid guest sync status: exit_reason=3D%s", @@ -54,11 +80,10 @@ static void vcpu_worker(struct memstress_vcpu_args *vcp= u_args) ts_diff.tv_sec, ts_diff.tv_nsec); } =20 -static int handle_uffd_page_request(int uffd_mode, int uffd, - struct uffd_msg *msg) +static int resolve_uffd_page_request(int uffd_mode, int uffd, uint64_t add= r, + bool wake) { pid_t tid =3D syscall(__NR_gettid); - uint64_t addr =3D msg->arg.pagefault.address; struct timespec start; struct timespec ts_diff; int r; @@ -71,7 +96,7 @@ static int handle_uffd_page_request(int uffd_mode, int uf= fd, copy.src =3D (uint64_t)guest_data_prototype; copy.dst =3D addr; copy.len =3D demand_paging_size; - copy.mode =3D 0; + copy.mode =3D wake ? 0 : UFFDIO_COPY_MODE_DONTWAKE; =20 r =3D ioctl(uffd, UFFDIO_COPY, ©); /* @@ -96,6 +121,7 @@ static int handle_uffd_page_request(int uffd_mode, int u= ffd, =20 cont.range.start =3D addr; cont.range.len =3D demand_paging_size; + cont.mode =3D wake ? 0 : UFFDIO_CONTINUE_MODE_DONTWAKE; =20 r =3D ioctl(uffd, UFFDIO_CONTINUE, &cont); /* @@ -119,6 +145,20 @@ static int handle_uffd_page_request(int uffd_mode, int= uffd, TEST_FAIL("Invalid uffd mode %d", uffd_mode); } =20 + if (r < 0 && wake) { + /* + * No wake-up occurs when UFFDIO_COPY/CONTINUE fails, but we + * have a thread waiting. Wake it up. + */ + struct uffdio_range range =3D {0}; + + range.start =3D addr; + range.len =3D demand_paging_size; + + TEST_ASSERT(ioctl(uffd, UFFDIO_WAKE, &range) =3D=3D 0, + "UFFDIO_WAKE failed: 0x%lx", addr); + } + ts_diff =3D timespec_elapsed(start); =20 PER_PAGE_DEBUG("UFFD page-in %d \t%ld ns\n", tid, @@ -129,6 +169,58 @@ static int handle_uffd_page_request(int uffd_mode, int= uffd, return 0; } =20 +static int handle_uffd_page_request(int uffd_mode, int uffd, + struct uffd_msg *msg) +{ + uint64_t addr =3D msg->arg.pagefault.address; + + return resolve_uffd_page_request(uffd_mode, uffd, addr, true); +} + +static void resolve_kvm_userfault(u64 gpa, u64 size) +{ + struct kvm_vm *vm =3D memstress_args.vm; + struct userspace_mem_region *region; + unsigned long *bitmap_chunk; + u64 page, gpa_offset; + + region =3D (struct userspace_mem_region *) userspace_mem_region_find( + vm, gpa, (gpa + size - 1)); + + if (kvm_userfault_data.uffd_mode) { + /* + * Resolve userfaults early, without needing to read them + * off the userfaultfd. + */ + uint64_t hva =3D (uint64_t)addr_gpa2hva(vm, gpa); + struct uffd_desc **descs =3D kvm_userfault_data.uffd_descs; + int i, fd; + + for (i =3D 0; i < num_uffds; ++i) + if (hva >=3D (uint64_t)descs[i]->va_start && + hva < (uint64_t)descs[i]->va_end) + break; + + TEST_ASSERT(i < num_uffds, + "Did not find userfaultfd for hva: %lx", hva); + + fd =3D kvm_userfault_data.uffd_descs[i]->uffd; + resolve_uffd_page_request(kvm_userfault_data.uffd_mode, fd, + hva, false); + } else { + uint64_t hva =3D (uint64_t)addr_gpa2hva(vm, gpa); + + memcpy((char *)hva, guest_data_prototype, demand_paging_size); + } + + gpa_offset =3D gpa - region->region.guest_phys_addr; + page =3D gpa_offset / host_page_size; + bitmap_chunk =3D (unsigned long *)region->region.userfault_bitmap + + page / BITS_PER_LONG; + atomic_fetch_and_explicit((_Atomic unsigned long *)bitmap_chunk, + ~(1ul << (page % BITS_PER_LONG)), memory_order_release); +} + struct test_params { int uffd_mode; bool single_uffd; @@ -136,6 +228,7 @@ struct test_params { int readers_per_uffd; enum vm_mem_backing_src_type src_type; bool partition_vcpu_memory_access; + bool kvm_userfault; }; =20 static void prefault_mem(void *alias, uint64_t len) @@ -149,6 +242,25 @@ static void prefault_mem(void *alias, uint64_t len) } } =20 +static void enable_userfault(struct kvm_vm *vm, int slots) +{ + for (int i =3D 0; i < slots; ++i) { + int slot =3D MEMSTRESS_MEM_SLOT_INDEX + i; + struct userspace_mem_region *region; + unsigned long *userfault_bitmap; + int flags =3D KVM_MEM_USERFAULT; + + region =3D memslot2region(vm, slot); + userfault_bitmap =3D bitmap_zalloc(region->mmap_size / + host_page_size); + /* everything is userfault initially */ + memset(userfault_bitmap, -1, region->mmap_size / host_page_size / CHAR_B= IT); + printf("Setting bitmap: %p\n", userfault_bitmap); + vm_mem_region_set_flags_userfault(vm, slot, flags, + userfault_bitmap); + } +} + static void run_test(enum vm_guest_mode mode, void *arg) { struct memstress_vcpu_args *vcpu_args; @@ -159,12 +271,13 @@ static void run_test(enum vm_guest_mode mode, void *a= rg) struct timespec ts_diff; double vcpu_paging_rate; struct kvm_vm *vm; - int i, num_uffds =3D 0; + int i; =20 vm =3D memstress_create_vm(mode, nr_vcpus, guest_percpu_mem_size, 1, p->src_type, p->partition_vcpu_memory_access); =20 demand_paging_size =3D get_backing_src_pagesz(p->src_type); + host_page_size =3D getpagesize(); =20 guest_data_prototype =3D malloc(demand_paging_size); TEST_ASSERT(guest_data_prototype, @@ -208,6 +321,14 @@ static void run_test(enum vm_guest_mode mode, void *ar= g) } } =20 + if (p->kvm_userfault) { + TEST_REQUIRE(kvm_has_cap(KVM_CAP_USERFAULT)); + kvm_userfault_data.enabled =3D true; + kvm_userfault_data.uffd_mode =3D p->uffd_mode; + kvm_userfault_data.uffd_descs =3D uffd_descs; + enable_userfault(vm, 1); + } + pr_info("Finished creating vCPUs and starting uffd threads\n"); =20 clock_gettime(CLOCK_MONOTONIC, &start); @@ -265,6 +386,7 @@ static void help(char *name) printf(" -v: specify the number of vCPUs to run.\n"); printf(" -o: Overlap guest memory accesses instead of partitioning\n" " them into a separate region of memory for each vCPU.\n"); + printf(" -k: Use KVM Userfault\n"); puts(""); exit(0); } @@ -283,7 +405,7 @@ int main(int argc, char *argv[]) =20 guest_modes_append_default(); =20 - while ((opt =3D getopt(argc, argv, "ahom:u:d:b:s:v:c:r:")) !=3D -1) { + while ((opt =3D getopt(argc, argv, "ahokm:u:d:b:s:v:c:r:")) !=3D -1) { switch (opt) { case 'm': guest_modes_cmdline(optarg); @@ -326,6 +448,9 @@ int main(int argc, char *argv[]) "Invalid number of readers per uffd %d: must be >=3D1", p.readers_per_uffd); break; + case 'k': + p.kvm_userfault =3D true; + break; case 'h': default: help(argv[0]); diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index bee65ca087217..5642d075900f0 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -630,6 +630,8 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, uint64_t guest_paddr, uint32_t slot, uint64_t npages, uint32_t flags, int guest_memfd_fd, uint64_t guest_memfd_offset); +struct userspace_mem_region * +userspace_mem_region_find(struct kvm_vm *vm, uint64_t start, uint64_t end); =20 #ifndef vm_arch_has_protected_memory static inline bool vm_arch_has_protected_memory(struct kvm_vm *vm) @@ -639,6 +641,9 @@ static inline bool vm_arch_has_protected_memory(struct = kvm_vm *vm) #endif =20 void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t fl= ags); +void vm_mem_region_set_flags_userfault(struct kvm_vm *vm, uint32_t slot, + uint32_t flags, + unsigned long *userfault_bitmap); void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa= ); void vm_mem_region_delete(struct kvm_vm *vm, uint32_t slot); struct kvm_vcpu *__vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id); diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index ca1aa1699f8aa..3c215df1d2d84 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -694,7 +694,7 @@ void kvm_parse_vcpu_pinning(const char *pcpus_string, u= int32_t vcpu_to_pcpu[], * of the regions is returned. Null is returned only when no overlapping * region exists. */ -static struct userspace_mem_region * +struct userspace_mem_region * userspace_mem_region_find(struct kvm_vm *vm, uint64_t start, uint64_t end) { struct rb_node *node; @@ -1225,6 +1225,44 @@ void vm_mem_region_set_flags(struct kvm_vm *vm, uint= 32_t slot, uint32_t flags) ret, errno, slot, flags); } =20 +/* + * VM Memory Region Flags Set with a userfault bitmap + * + * Input Args: + * vm - Virtual Machine + * flags - Flags for the memslot + * userfault_bitmap - The bitmap to use for KVM_MEM_USERFAULT + * + * Output Args: None + * + * Return: None + * + * Sets the flags of the memory region specified by the value of slot, + * to the values given by flags. This helper adds a way to provide a + * userfault_bitmap. + */ +void vm_mem_region_set_flags_userfault(struct kvm_vm *vm, uint32_t slot, + uint32_t flags, + unsigned long *userfault_bitmap) +{ + int ret; + struct userspace_mem_region *region; + + region =3D memslot2region(vm, slot); + + TEST_ASSERT(!userfault_bitmap ^ (flags & KVM_MEM_USERFAULT), + "KVM_MEM_USERFAULT must be specified with a bitmap"); + + region->region.flags =3D flags; + region->region.userfault_bitmap =3D (__u64)userfault_bitmap; + + ret =3D __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION2, ®ion->region); + + TEST_ASSERT(ret =3D=3D 0, "KVM_SET_USER_MEMORY_REGION2 IOCTL failed,\n" + " rc: %i errno: %i slot: %u flags: 0x%x", + ret, errno, slot, flags); +} + /* * VM Memory Region Move * --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 C941F21CC6C for ; Wed, 18 Jun 2025 04:24:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220688; cv=none; b=c1ge6NEprXx94kQoTMIGh0zXpRzBctPNNADqm9Dl3YKpQCL0VqHvxOdzAcHxNxpFuiEsX70xlwkFU/xEVIepuWqMGOEKbjJa/UX0reP9vXd/wN5w0D5Fwc/us22JhT9D34uHC9rcx4fvTy6hH1Z0KY9yDeo9cgDlJVC3ogUz1ho= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220688; c=relaxed/simple; bh=jSiCen/C1Tdc2UB541LJK2epQTbdnnCbieLg8I8XSIE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dPoMwMrfxUcAwHL6NYM5D17XReDUfYE8qshOiv4Plnm6UPk41HSjYQ3QA3doFtNDDgxVrGY10LhG1FTpXTHTcJyMmPkurgKASMMWJRUDr37VcYsnriqSiE7429OWr5dnXNZJj0ttrmelz4L9hT80onZioiXxeqN0b3u8354m1r0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Wzund+6I; arc=none smtp.client-ip=209.85.215.202 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Wzund+6I" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b2fb347b3e6so6389145a12.1 for ; Tue, 17 Jun 2025 21:24:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220685; x=1750825485; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=lJmtzreapar7RYm6csfZXNlZpVROzgpN0suNPttjN9U=; b=Wzund+6Icwa5O3/0juL0BZb2/v/gcv/vvLwv+IGtYkiBSz3VkaqxW91RgcihHfLgKP hMogqClv5btqfQiCSNhaC3siOaNNFbaMRlZ4z7NStt5WHlQDdMgW3DhAjjpJQBXuImEI zo2gmp8JwJY24+5oxAzWNMEwLAhtQB18by9XZeKq3YDNQJjJWNl5nnZcOmdYaTdfG39s Uo5vO0r+HvPJYQAewKf1hjSETfHBeC4Z1TLEyEXaoq3Hxe2r0Tn4qZTYPemi8zfYWrNT k0FtyB7fRys1xt2gAxiKDF3ciYUQwr7XEbNdFigzuMO3UnL04G2SzoyD9F1pOehoLucD 64Lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220685; x=1750825485; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=lJmtzreapar7RYm6csfZXNlZpVROzgpN0suNPttjN9U=; b=StrlhrPe97HwYYIs4hztFZ/SO58J5HwcZ5+la3nn7neWp6xBZTkdcMDzbqR75CsjIJ EEqTmh7Ej4j2uptpexDpyDRT5PlValg2VVmcs2rmwF0yt9o5Me9ksS0CBYvFlNOfzLWi o6pWyntBvkX3TIQVEie/6NY+V1Msx3eToskp/3S1UdGGaXfzUhoGbb+v0x70/+I0PshO 0FgWMgfxcADsgJQFAe0OXHuYk/BchvSvjm8gdJgrvuSbScjzqxjgPRhj0ykZly9E6lCp 3nHEtWUQV0Rlxilau39BdNVdVbf0LeSwx4lNQdmbhkuhmiDhznaBmUtpexD0qsB44sQu BQvw== X-Forwarded-Encrypted: i=1; AJvYcCWeyWfkvUPSDqRqtAT82QXSgWc0VrxfkM2LvqX99sIUPi8OPYYr2pGskKt6FAr5ZImP1IDsoTWcdOJVJm8=@vger.kernel.org X-Gm-Message-State: AOJu0YxWGp0CWod+jJ3avSRl3XoO9Jk9KTO6YG3xl+twzbi9gG4L37J7 ifms36xyh9lxcjQKeqj976IPPUSa3Wj6DgCeDUSOlbHY3hzXrznJNVbGpBNKfAp+h2eG0eM5lAT 7qJsr/Eqky1MDR7NCuPiv5Q== X-Google-Smtp-Source: AGHT+IEYBcC2cDsFrgiMsyVhS97ys7BmjM02OsUOLrECd3uh2HcwoI2YZYxPTZFJmgzjhVgSJXNOQSUyK0OIbxzF X-Received: from pfus9.prod.google.com ([2002:a05:6a00:8c9:b0:747:a4c0:983d]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:a115:b0:218:c01:ddce with SMTP id adf61e73a8af0-21fbd5d90aemr27193918637.40.1750220685258; Tue, 17 Jun 2025 21:24:45 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:21 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-13-jthoughton@google.com> Subject: [PATCH v3 12/15] KVM: selftests: Inform set_memory_region_test of KVM_MEM_USERFAULT From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The KVM_MEM_USERFAULT flag is supported iff KVM_CAP_USERFAULT is available. Signed-off-by: James Houghton --- tools/testing/selftests/kvm/set_memory_region_test.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/t= esting/selftests/kvm/set_memory_region_test.c index ce3ac0fd6dfb4..ba3fe8a53b33e 100644 --- a/tools/testing/selftests/kvm/set_memory_region_test.c +++ b/tools/testing/selftests/kvm/set_memory_region_test.c @@ -364,6 +364,9 @@ static void test_invalid_memory_region_flags(void) if (kvm_check_cap(KVM_CAP_MEMORY_ATTRIBUTES) & KVM_MEMORY_ATTRIBUTE_PRIVA= TE) supported_flags |=3D KVM_MEM_GUEST_MEMFD; =20 + if (kvm_check_cap(KVM_CAP_USERFAULT)) + supported_flags |=3D KVM_MEM_USERFAULT; + for (i =3D 0; i < 32; i++) { if ((supported_flags & BIT(i)) && !(v2_only_flags & BIT(i))) continue; --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 5F19D21D3F1 for ; Wed, 18 Jun 2025 04:24:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220689; cv=none; b=fQZ2ubzHJJZs9SWNPU6/nxgC3yShb7CPepT5o6G6ettb7juORXST03ceSPTedmpMfwbELr9hktI7EqNbkYELKbcF70pQQO5L4q6ZwUob8MRs4n5Q87TgqkaTDHS8IaDEraqgRjr9bOIdlh+pRIlJ//0rAOhKWwPy6Dexin12qW4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220689; c=relaxed/simple; bh=pBsXSmQz4NiPuEOYLkwfwEN5cJ0gqQwNFVp5scXJ8tE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=QuTgMnJBQMwixbpzcOGlBg82KWhXQlDRVktHKO5WCwrMHvvAQrdViaK83Njfi3gbPihF7auZ1mW0mspYulMe1uACAEZ07OPhA18RkkkO+0UezHS8SpoX7BtkESM7CxqocVP7jFv3xHcFvAwqtO89z7SVZR99Zn+9dvc31MB8swk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=NqWonq7V; arc=none smtp.client-ip=209.85.215.201 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="NqWonq7V" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b2f4c436301so300638a12.0 for ; Tue, 17 Jun 2025 21:24:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220687; x=1750825487; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=IPfdrb3qNj0vF7Vvj49qyj4bUirkHon/mzHMR4ThfgQ=; b=NqWonq7VmobhJY6B8Pahfi9r8ORcLnWhWSkGVdhdHb/NzeRnhzTL9TZAj3LBIEnGDO PyoIU5ZLbGzQyCoOeSUJqleOL5xMKr0/iKwJzqB+3lKorvTJFk2owbIQS7nPTn2ahsuu EENef+MVjqufiUzhAdhebe9p2S77nVA3ghYOsuEOqdum6GAcgRj1BVEKhQi9nL1Bu7Qv VEyxd9L8mBfhU4CGRAQietErjL+cws3rDceIVY2a6GOZ2tL+InTKSXzw4VHVo0wRSt2L YJ1JDMs0Z/PS+y1hgLNOVMRvK2YLJ5qbxqdAHVNW99FoQGZDxej+h644q5c/x+qTkzon B5EQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220687; x=1750825487; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=IPfdrb3qNj0vF7Vvj49qyj4bUirkHon/mzHMR4ThfgQ=; b=XhO1EiFToT1xAhXPlmuHjU3iI9doo6bXedWig6Xk34JkSQhtwIAXc2pqP6wTq2rzdz fzSvR3WkXtbqDQxxLjHfXnBwrdxcXdWiHCMSwT+HvwvObXxWunF/rkweHHJ7OwRuugt0 OR9/KI80d8yEH3UE+FbP2OAsxmBnQg5VHvt3PKo4QLnpgVSzS16jZQcPzW6//GxkAWn2 hzwixJP9sJK+ae8pfoI52LdH1/D96lNXJ+H6waLpEYlySAUgrPwddqseQsRd617ckP4g l2fACwrgEpA3LCM0Fb6lki1yktq+OkR9C+KVH+fA6ZCTHEiwmfXVnQf2ax2wOSD+xXiF ++Jg== X-Forwarded-Encrypted: i=1; AJvYcCUniBxmtLAA9ekzfm5uHjNWIunnxoVC8atTzv6YbX6iwCWbfFdcanlz3BJeQtA1hac4/TpQ/CDQgXikOIA=@vger.kernel.org X-Gm-Message-State: AOJu0YxhdcHkZ4wyQmkqQcVcEFX2UMGZvtvxhL7O5w2tnHYydHHwIi1w VAKYycFmZyJTuoB8UGNPy8JhCqjdtR2kpkxbpJP8yBTwT/5FDRUoCmYjB9Xq3kEJRon7kKX7WaI g4hEKkNh8K8WiDGyKiCCe/Q== X-Google-Smtp-Source: AGHT+IEwWie/mYOzWzkPEMzzYrHW7iM/BMlWT3ZNJE+z50G+eg48u4nBoLAfK8Q5b1sDwPdBgQjlTM5R7I81KayS X-Received: from pfbgt12.prod.google.com ([2002:a05:6a00:4e0c:b0:746:2524:8aab]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:7492:b0:215:d1dd:df4c with SMTP id adf61e73a8af0-22003686bacmr2081008637.6.1750220686708; Tue, 17 Jun 2025 21:24:46 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:22 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-14-jthoughton@google.com> Subject: [PATCH v3 13/15] KVM: selftests: Add KVM_MEM_USERFAULT + guest_memfd toggle tests From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Make sure KVM_MEM_USERFAULT can be toggled on and off for KVM_MEM_GUEST_MEMFD memslots. Signed-off-by: James Houghton --- .../selftests/kvm/set_memory_region_test.c | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/t= esting/selftests/kvm/set_memory_region_test.c index ba3fe8a53b33e..3f77abb257601 100644 --- a/tools/testing/selftests/kvm/set_memory_region_test.c +++ b/tools/testing/selftests/kvm/set_memory_region_test.c @@ -606,6 +606,35 @@ static void test_mmio_during_vectoring(void) =20 kvm_vm_free(vm); } + +static void test_private_memory_region_userfault(void) +{ + struct kvm_vm *vm; + int memfd; + + pr_info("Testing toggling KVM_MEM_USERFAULT on KVM_MEM_GUEST_MEMFD memory= regions\n"); + + vm =3D vm_create_barebones_type(KVM_X86_SW_PROTECTED_VM); + + test_invalid_guest_memfd(vm, vm->kvm_fd, 0, "KVM fd should fail"); + test_invalid_guest_memfd(vm, vm->fd, 0, "VM's fd should fail"); + + memfd =3D vm_create_guest_memfd(vm, MEM_REGION_SIZE, 0); + + vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_GUEST_MEMFD, + MEM_REGION_GPA, MEM_REGION_SIZE, 0, memfd, 0); + + vm_set_user_memory_region2(vm, MEM_REGION_SLOT, + KVM_MEM_GUEST_MEMFD | KVM_MEM_USERFAULT, + MEM_REGION_GPA, MEM_REGION_SIZE, 0, memfd, 0); + + vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_GUEST_MEMFD, + MEM_REGION_GPA, MEM_REGION_SIZE, 0, memfd, 0); + + close(memfd); + + kvm_vm_free(vm); +} #endif =20 int main(int argc, char *argv[]) @@ -633,6 +662,7 @@ int main(int argc, char *argv[]) (kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_VM))) { test_add_private_memory_region(); test_add_overlapping_private_memory_regions(); + test_private_memory_region_userfault(); } else { pr_info("Skipping tests for KVM_MEM_GUEST_MEMFD memory regions\n"); } --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 D499D21E094 for ; Wed, 18 Jun 2025 04:24:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220690; cv=none; b=dcxhqB3ty8XkMBzOjiTG3h3Xy5GVuh+uVQsgNkwXNCYGIp8nXSs7/Rx+DLwKXacG0HGsIqemAaRk6si0DJlm94z9w3Gd/yazYizZURlFc6iHCWuHI/01GQlNo/6pgNsYmBVZ869er4fGLIltcNybNl8eOSt/qLZ8iWRA1+5sk4c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220690; c=relaxed/simple; bh=0cy61o7VXZiqX2efmaNB3wv8cOwqSs6G7BooJP5WYek=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ntyUN/Dfg91JRmI+WmwWXqIkcDPqAj0MesjncixSlKeZKgNFJGfJt7CizLrbPDd1l0EWJkRf9L1ITR2foo0+rGCY+ONDvi2fv9e2v7QdcQxQ7edTYkrqKtNHUM06gowC9mDqi8hOeimeuuHLzDGpuHidvP1ejPTnsVHXCODIzhs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=wXVWoh01; arc=none smtp.client-ip=209.85.210.201 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="wXVWoh01" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-747dd44048cso5315729b3a.3 for ; Tue, 17 Jun 2025 21:24:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220688; x=1750825488; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=urfbfbke44pGtnk/FCqGVDeVvBhaC6syv0bCNmnixkg=; b=wXVWoh01om4NO2cV4iNiTb7pXfv2E/LFLcdXfVPTVn8OXmPLyoJlINQaiDvX/7UbRQ NpYTYiQ3fF+QGYDsMN7EsbH9KpBQMmYabYG+wnNr0BCDkK3Yd41SC/vUndBiaob3hCp8 mLEYaxO9/U+eJ4sQMYftzvZMDat3f1gCHJh3O3NnXrc7sD9J6nPt8/0FnEMmvug542Ff NgVblA3MXuXSLpUNLsEZ7HJTRk6JsE6ZifpkS+KuydtPtcvZLN0Jfax/f2/sRSe+ge3x bY7G2tIyJlg12NK1cdwFzrAe9JfTL+bnIsQWqW/oOieBoN7x3QU0dN+iu9U3M1msUjA+ U7pA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220688; x=1750825488; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=urfbfbke44pGtnk/FCqGVDeVvBhaC6syv0bCNmnixkg=; b=LBHCBlxOTFT1+8PLjsAAdVlF0Fp8Yt61qjSzZNcglj/EYb+qWXs36cbLuepO/Ov2pB YxqoF/FfP0Hm4SnAFLyrpNnciG8tF1Ds+8gDqtRJbT61gGrc+xWCAEWCcYeEKX4hjtMQ ThVYrDHksrzXwRM+Vr7Cn5ZzuzaHAWhlwF032OCRBb3FKMd7LgI/VUiKIqv775P1AfMg uEPFqAqV7DtEwlbyJn7PO5dQP+++ITYmzEpLvNi+7dmYYQJAWaxCaGULttcTHpDqwK5v MT/qRn+v+ZYh94DCzk/RFd3xONYvgHQpoqb/1w4qQwMdXs1hzScxWPevD0muGithCNLK qZbg== X-Forwarded-Encrypted: i=1; AJvYcCV8rX0/o6KlIR/CKw1pUXX1Tmn+8jgD4yYilv8CIJ4hfpp4p1r2WYITZ09YxHUFYgNz2OpqrTcRpDEP2To=@vger.kernel.org X-Gm-Message-State: AOJu0YwIhw0FlNM8EBv7h1D/skf1Uc35A3ms/CYgFOBzq6KQD7AkBixF PYdXa10YCdEsXQTgGeyKdKG7H98ZJN3dLski/KExtUf0Vi+DJKaOChimg+UXHhvRm+531NGWBQj gVpTOmFcMsbQmoLUpvOAa5g== X-Google-Smtp-Source: AGHT+IFPdIrbDlRQ72BheICD/uy5q1y4Z/C5VNYBV8bJ51Pda+epcBJA7XWiJKZlOD5QXWSznMTbbr9aSRYhmJ8a X-Received: from pfbde14.prod.google.com ([2002:a05:6a00:468e:b0:748:dd5c:e882]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:21c1:b0:748:323f:ba21 with SMTP id d2e1a72fcca58-7489cf5c8c2mr21855970b3a.1.1750220688256; Tue, 17 Jun 2025 21:24:48 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:23 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-15-jthoughton@google.com> Subject: [PATCH v3 14/15] KVM: Documentation: Fix section number for KVM_CAP_ARM_WRITABLE_IMP_ID_REGS From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, "Xin Li (Intel)" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Xin Li (Intel)" The previous section is 7.41, thus this should be 7.42. Signed-off-by: Xin Li (Intel) Signed-off-by: James Houghton --- Documentation/virt/kvm/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 1bd2d42e6424c..ff0aa9eb91efe 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -8528,7 +8528,7 @@ ENOSYS for the others. When enabled, KVM will exit to userspace with KVM_EXIT_SYSTEM_EVENT of type KVM_SYSTEM_EVENT_SUSPEND to process the guest suspend request. =20 -7.37 KVM_CAP_ARM_WRITABLE_IMP_ID_REGS +7.42 KVM_CAP_ARM_WRITABLE_IMP_ID_REGS ------------------------------------- =20 :Architectures: arm64 --=20 2.50.0.rc2.692.g299adb8693-goog From nobody Thu Oct 9 11:09:21 2025 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 3793B220689 for ; Wed, 18 Jun 2025 04:24:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220691; cv=none; b=rFjemDSmQAB10HenE/z2mogGnEDe0RgW3E3tklga/undzoAM0dd7QaZpj3PQ4Tq1Cv+yULZdD0sdSzN9OQVMuMDirWhS93HIjMVlCoadnfUvKouGj76p/j/PW/6Zu2iq2TXzClhQOnI0ORlawqZvf6xk5ypCQMRMYRkkXkJYLnU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750220691; c=relaxed/simple; bh=TlPwQV38TsKUYD4upWrrqkkEe7fCtClTkHmYIdQHZto=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=JHQz76GrD3PgKrN9tc9sHWJPFdcn58EejRzUxdr6aRUqoM+t4LK6C+jQuKw7ifrOwYTesxuFAvnVPYozlCqcA+jT/yaCVXhV/kyZBYE36xBREXHPOa+wAbtR05g3W4jujhimic04whWd67ZclrNNwfJcIpjBYMTa6ZlTXui9dqI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jthoughton.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=sqlFzraH; arc=none smtp.client-ip=209.85.215.202 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=flex--jthoughton.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="sqlFzraH" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b1ffc678adfso4015769a12.0 for ; Tue, 17 Jun 2025 21:24:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1750220690; x=1750825490; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=P6MpWO9eGHCybkhP95T8R+1KfjKYk4MOXDyWFRHvmIc=; b=sqlFzraHghTHRkzSRh5LYZqz0Li96xF/7qXzaeRb6Hsgv5Jp0FgjmB66wj3unmdJQS JydoGEG6palK4LvzFRmdY7Jlru8hU3CVV2OSKH+2PEwfslG/VtLyUf6wOhnVqZU21Wuh Jdf1V4QZYh041kkYjQ8YWaBueksQ1V07nsXfa28RlR9XllZz/augWVUb+lyVkdvyLqxQ VG4ltejQa3Jm7Qy4M7VIxlWtoyQjgZVG7ASR1+QbMtLpz7QzgaR6GgHf9ZP8IAZT5kwQ OymuRDSXy4I32QSUpCrot2nXSEllVdLCm18cqtQjVOTvQrNw9tuN+c95DB9DSwpux7g0 LD0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750220690; x=1750825490; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=P6MpWO9eGHCybkhP95T8R+1KfjKYk4MOXDyWFRHvmIc=; b=n4hBXK/XZYAn3qRR74z7kgspEfnUJd7wCzblsmVZYSd9Qj9G5/xW0rakRmdV7JElyU gD5ff70m6dA26cGV8feQxyEsxhtKQFPtfGXe3c2/cj99d3cdd0GSVm0EKjWzFMIuVhwn HENxKE05aVWrkaNvQfBX9Z1EKW+pHJEaAqPsv1nUOhCOWI8U1m94a32ZCehqPoT+3Zp0 qzvK6h/tT2/P/rJFomDExtxCQl77ZqPSWnXcxOpQBODf8YYBedtJ14mSQI6VKFWoCRLU JEBIjTcAGyFSwPTWepjKs20/AsncnyCd/G/6jnErLtFogGYrb97qRP1V34+wXygKseVf VM8A== X-Forwarded-Encrypted: i=1; AJvYcCVc7D4maTEG3PyR12Y42zv+TMcpkZnN8i3rEFsIb4odo6K1eLQnrFiDZ7Vab5volK7GmOQxXj08GddrNCA=@vger.kernel.org X-Gm-Message-State: AOJu0YwPgo5GVEmyqwEFW5F5B495yT2gnlmvwmzzej1VbGxE/nCL0Ila k9r/zueVJTisMq9AYZo2MbOmfYMnZZ24/o2xzAQJ1xfw4NIrOaGJQ8/WKnjNpAFjmAShSQvwdyQ cxThn+9TBpcFbjeTINNpKZQ== X-Google-Smtp-Source: AGHT+IFBmqhQDFkst9hOrle0gOrugvU+bLMa/osue2o1jv722NhjgUmFbYBlQLzwI5ul7WF7bNf9FKyZ7x+dJLfM X-Received: from pgbfq12.prod.google.com ([2002:a05:6a02:298c:b0:b2f:dfa3:cb81]) (user=jthoughton job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:512:b0:218:5954:1293 with SMTP id adf61e73a8af0-21fbd668df0mr28784142637.34.1750220689787; Tue, 17 Jun 2025 21:24:49 -0700 (PDT) Date: Wed, 18 Jun 2025 04:24:24 +0000 In-Reply-To: <20250618042424.330664-1-jthoughton@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250618042424.330664-1-jthoughton@google.com> X-Mailer: git-send-email 2.50.0.rc2.696.g1fc2a0284f-goog Message-ID: <20250618042424.330664-16-jthoughton@google.com> Subject: [PATCH v3 15/15] KVM: Documentation: Add KVM_CAP_USERFAULT and KVM_MEM_USERFAULT details From: James Houghton To: Paolo Bonzini , Sean Christopherson , Oliver Upton Cc: Jonathan Corbet , Marc Zyngier , Yan Zhao , James Houghton , Nikita Kalyazin , Anish Moorthy , Peter Gonda , Peter Xu , David Matlack , wei.w.wang@intel.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, Bagas Sanjaya Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Include the note about memory ordering when clearing bits in userfault_bitmap, as it may not be obvious for users. Signed-off-by: James Houghton Reviewed-by: Bagas Sanjaya --- Documentation/virt/kvm/api.rst | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index ff0aa9eb91efe..25668206a5d80 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6308,7 +6308,8 @@ bounds checks apply (use common sense). __u64 guest_memfd_offset; __u32 guest_memfd; __u32 pad1; - __u64 pad2[14]; + __u64 userfault_bitmap; + __u64 pad2[13]; }; =20 A KVM_MEM_GUEST_MEMFD region _must_ have a valid guest_memfd (private memo= ry) and @@ -6324,6 +6325,25 @@ state. At VM creation time, all memory is shared, i= .e. the PRIVATE attribute is '0' for all gfns. Userspace can control whether memory is shared/priva= te by toggling KVM_MEMORY_ATTRIBUTE_PRIVATE via KVM_SET_MEMORY_ATTRIBUTES as nee= ded. =20 +When the KVM_MEM_USERFAULT flag is set, userfault_bitmap points to the sta= rting +address for the bitmap that controls if vCPU memory faults should immediat= ely +exit to userspace. If an invalid pointer is provided, at fault time, KVM_R= UN +will return -EFAULT. KVM_MEM_USERFAULT is only supported when +KVM_CAP_USERFAULT is supported. + +userfault_bitmap should point to an array of longs where each bit in the a= rray +linearly corresponds to a single gfn. Bit 0 in userfault_bitmap correspond= s to +guest_phys_addr, bit 1 corresponds to guest_phys_addr + PAGE_SIZE, etc. If= the +bit for a page is set, any vCPU access to that page will exit to userspace= with +KVM_MEMORY_EXIT_FLAG_USERFAULT. + +Setting bits in userfault_bitmap has no effect on pages that have already = been +mapped by KVM until KVM_MEM_USERFAULT is disabled and re-enabled again. + +Clearing bits in userfault_bitmap should usually be done with a store-rele= ase +if changes to guest memory are being made available to the guest via +userfault_bitmap. + S390: ^^^^^ =20 @@ -8557,6 +8577,17 @@ given VM. When this capability is enabled, KVM resets the VCPU when setting MP_STATE_INIT_RECEIVED through IOCTL. The original MP_STATE is preserved. =20 +7.44 KVM_CAP_USERFAULT +---------------------- + +:Architectures: x86, arm64 +:Returns: Informational only, -EINVAL on direct KVM_ENABLE_CAP. + +The presence of this capability indicates that KVM_SET_USER_MEMORY_REGION2= will +accept KVM_MEM_USERFAULT as a valid memslot flag. + +See KVM_SET_USER_MEMORY_REGION2 for more details. + 8. Other capabilities. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 --=20 2.50.0.rc2.692.g299adb8693-goog