[PATCH 09/17] KVM: arm64: Move VMA-related information to kvm_s2_fault_vma_info

Wei-Lin Chang weilin.chang at arm.com
Fri May 29 17:27:11 PDT 2026


Hi,

On Sat, Mar 21, 2026 at 09:50:40AM +0000, Marc Zyngier wrote:
> On Wed, 18 Mar 2026 16:14:19 +0000,
> Fuad Tabba <tabba at google.com> wrote:
> > 
> > Hi Joey,
> > 
> > First, thanks for the reviews and the comments on my series. You're
> > right about my changes wrongly editing "page". I wanted it to be as
> > mechanical as possible to make it easy to review, but it ended up
> > being too mechanical.
> > 
> > <snip>
> > 
> > > > -     /* Mark the fault->page dirty only if the fault is handled successfully */
> > > > -     if (fault->writable && !ret)
> > > > -             mark_page_dirty_in_slot(kvm, s2fd->memslot, get_canonical_gfn(s2fd, fault));
> > > > +     /* Mark the page dirty only if the fault is handled successfully */
> > > > +     if (fault->writable && !ret) {
> > > > +             phys_addr_t ipa = gfn_to_gpa(get_canonical_gfn(s2fd, s2vi));
> > > > +             ipa &= ~(mapping_size - 1);
> > > > +             mark_page_dirty_in_slot(kvm, s2fd->memslot, gpa_to_gfn(ipa));
> > >
> > > I don't understand this change, why do we need to mask stuff now?
> > 
> > Let me see if _I_ understand it (Marc, please correct me if I'm wrong).
> > 
> > Before this patch, fault->gfn and fault->vma_pagesize were mutable,
> > and transparent_hugepage_adjust() modified both directly. In addition
> > to this being confusing (which gfn is this: the host /canonical or the
> > nested one?), it made it more difficult to separate the logic.
> > 
> > So, to mark a dirty page, it did this:
> > -             mark_page_dirty_in_slot(kvm, s2fd->memslot,
> > get_canonical_gfn(s2fd, fault));
> > 
> > which relied on the old struct fault to calculate the canonical gfn
> > using the (magically) THP adjusted fault->vma_pagesize.
> > 
> > Now that fault (or s2vi, its successor in this case) isn't mutable, we
> > need to get the canonical gfn using the host mapping size.
> 
> It's exactly that, and it is slightly clearer if you look at how
> mapping_size is updated:
> 
> 	mapping_size = transparent_hugepage_adjust(kvm, s2fd->memslot,
> 						   s2fd->hva, &fault->pfn,
> 						   &gfn);
> 
> The faulting IPA is represented by 'gfn', and gets correctly updated
> by the helper. But that doesn't adjust the 'canonical' IPA, which is
> used for any memslot related update.
> 
> So if we need to call into mark_page_dirty_in_slot(), we really need
> to pick the base of the region we are actually marking dirty, hence
> the masking of the bottom bits.
> 
> Does this make sense? This is one of the area where the constification
> results in slightly more complicated code, as we can't update things
> in place anymore.

Sorry for being late, I think I am missing something:
If dirty logging is enabled, then the mapping size would be capped at
PAGE_SIZE, and THP adjust wouldn't happen. Why do we still need to align
the canonical IPA down?

Thanks,
Wei-Lin Chang

> 
> Thanks,
> 
> 	M.
> 
> -- 
> Jazz isn't dead. It just smells funny.



More information about the linux-arm-kernel mailing list