[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