[PATCH v1 2/6] KVM: arm64: Pass kvm_s2_fault_desc to fault_supports_stage2_huge_mapping()

Wei-Lin Chang weilin.chang at arm.com
Fri Sep 25 10:46:13 PDT 2026


On Tue, Sep 22, 2026 at 02:08:17PM +0100, Vincent Donnefort wrote:
> Pass the fault descriptor to fault_supports_stage2_huge_mapping() instead
> of passing memslot and hva separately so it can access other s2fd
> members such as vcpu.
> 
> No functional change intended.
> 
> Signed-off-by: Vincent Donnefort <vdonnefort at google.com>

Nit: Maybe also mention the transparent_hugepage_adjust() change in the
commit message?

Either way:

Reviewed-by: Wei-Lin Chang <weilin.chang at arm.com>

> ---
>  arch/arm64/kvm/mmu.c | 39 +++++++++++++++++++--------------------
>  1 file changed, 19 insertions(+), 20 deletions(-)
> 
> diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
> index 9ba86450fe4a..9dfaf4f277b5 100644
> --- a/arch/arm64/kvm/mmu.c
> +++ b/arch/arm64/kvm/mmu.c
> @@ -1353,12 +1353,21 @@ static void kvm_send_hwpoison_signal(unsigned long address, short lsb)
>  	send_sig_mceerr(BUS_MCEERR_AR, (void __user *)address, lsb, current);
>  }
>  
> -static bool fault_supports_stage2_huge_mapping(struct kvm_memory_slot *memslot,
> -					       unsigned long hva,
> +struct kvm_s2_fault_desc {
> +	struct kvm_vcpu		*vcpu;
> +	phys_addr_t		fault_ipa;
> +	struct kvm_s2_trans	*nested;
> +	struct kvm_memory_slot	*memslot;
> +	unsigned long		hva;
> +};
> +
> +static bool fault_supports_stage2_huge_mapping(const struct kvm_s2_fault_desc *s2fd,
>  					       unsigned long map_size)
>  {
> -	gpa_t gpa_start;
> +	struct kvm_memory_slot *memslot = s2fd->memslot;
> +	unsigned long hva = s2fd->hva;
>  	hva_t uaddr_start, uaddr_end;
> +	gpa_t gpa_start;
>  	size_t size;
>  
>  	/* The memslot and the VMA are guaranteed to be aligned to PAGE_SIZE */
> @@ -1427,9 +1436,9 @@ static bool fault_supports_stage2_huge_mapping(struct kvm_memory_slot *memslot,
>   * Returns the size of the mapping.
>   */
>  static long
> -transparent_hugepage_adjust(struct kvm *kvm, struct kvm_memory_slot *memslot,
> -			    unsigned long hva, kvm_pfn_t *pfnp, gfn_t *gfnp)
> +transparent_hugepage_adjust(const struct kvm_s2_fault_desc *s2fd, kvm_pfn_t *pfnp, gfn_t *gfnp)
>  {
> +	struct kvm *kvm = s2fd->vcpu->kvm;
>  	kvm_pfn_t pfn = *pfnp;
>  	gfn_t gfn = *gfnp;
>  
> @@ -1438,8 +1447,8 @@ transparent_hugepage_adjust(struct kvm *kvm, struct kvm_memory_slot *memslot,
>  	 * sure that the HVA and IPA are sufficiently aligned and that the
>  	 * block map is contained within the memslot.
>  	 */
> -	if (fault_supports_stage2_huge_mapping(memslot, hva, PMD_SIZE)) {
> -		int sz = get_user_mapping_size(kvm, hva);
> +	if (fault_supports_stage2_huge_mapping(s2fd, PMD_SIZE)) {
> +		int sz = get_user_mapping_size(kvm, s2fd->hva);
>  
>  		if (sz < 0)
>  			return sz;
> @@ -1597,14 +1606,6 @@ static enum kvm_pgtable_prot adjust_nested_exec_perms(struct kvm *kvm,
>  	return prot;
>  }
>  
> -struct kvm_s2_fault_desc {
> -	struct kvm_vcpu		*vcpu;
> -	phys_addr_t		fault_ipa;
> -	struct kvm_s2_trans	*nested;
> -	struct kvm_memory_slot	*memslot;
> -	unsigned long		hva;
> -};
> -
>  static int gmem_abort(const struct kvm_s2_fault_desc *s2fd)
>  {
>  	bool write_fault, exec_fault;
> @@ -1791,7 +1792,7 @@ static short kvm_s2_resolve_vma_size(const struct kvm_s2_fault_desc *s2fd,
>  	switch (vma_shift) {
>  #ifndef __PAGETABLE_PMD_FOLDED
>  	case PUD_SHIFT:
> -		if (fault_supports_stage2_huge_mapping(s2fd->memslot, s2fd->hva, PUD_SIZE))
> +		if (fault_supports_stage2_huge_mapping(s2fd, PUD_SIZE))
>  			break;
>  		fallthrough;
>  #endif
> @@ -1799,7 +1800,7 @@ static short kvm_s2_resolve_vma_size(const struct kvm_s2_fault_desc *s2fd,
>  		vma_shift = PMD_SHIFT;
>  		fallthrough;
>  	case PMD_SHIFT:
> -		if (fault_supports_stage2_huge_mapping(s2fd->memslot, s2fd->hva, PMD_SIZE))
> +		if (fault_supports_stage2_huge_mapping(s2fd, PMD_SIZE))
>  			break;
>  		fallthrough;
>  	case CONT_PTE_SHIFT:
> @@ -2049,9 +2050,7 @@ static int kvm_s2_fault_map(const struct kvm_s2_fault_desc *s2fd,
>  		if (perm_fault_granule > PAGE_SIZE) {
>  			mapping_size = perm_fault_granule;
>  		} else {
> -			mapping_size = transparent_hugepage_adjust(kvm, s2fd->memslot,
> -								   s2fd->hva, &pfn,
> -								   &gfn);
> +			mapping_size = transparent_hugepage_adjust(s2fd, &pfn, &gfn);
>  			if (mapping_size < 0) {
>  				ret = mapping_size;
>  				goto out_unlock;
> -- 
> 2.55.0.1082.g2b9226bbc0-goog
> 
> 



More information about the linux-arm-kernel mailing list