Re: [PATCH 06/14] KVM: arm64: Return next table from map callbacks

Oliver Upton
2022-09-09T09:38:46Z

Hi David,

On Wed, Sep 07, 2022 at 02:32:29PM -0700, David Matlack wrote:
> On Tue, Aug 30, 2022 at 07:41:24PM +0000, Oliver Upton wrote:
> > The map walkers install new page tables during their traversal. Return
> > the newly-installed table PTE from the map callbacks to point the walker
> > at the new table w/o rereading the ptep.
> >
> > Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
> > ---
> > arch/arm64/kvm/hyp/pgtable.c | 9 +++++----
> > 1 file changed, 5 insertions(+), 4 deletions(-)
> >
> > diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c
> > index 331f6e3b2c20..f911509e6512 100644
> > --- a/arch/arm64/kvm/hyp/pgtable.c
> > +++ b/arch/arm64/kvm/hyp/pgtable.c
> > @@ -202,13 +202,12 @@ static inline int __kvm_pgtable_visit(struct kvm_pgtable_walk_data *data,
> > if (!table && (flags & KVM_PGTABLE_WALK_LEAF)) {
> > ret = kvm_pgtable_visitor_cb(data, addr, level, ptep, &pte,
> > KVM_PGTABLE_WALK_LEAF);
> > - pte = *ptep;
> > - table = kvm_pte_table(pte, level);
> > }
> >
> > if (ret)
> > goto out;
>
> Rather than passing a pointer to the local variable pte and requiring
> all downstream code to update it (and deal with dereferencing to read
> the old pte), wouldn't it be simpler to just re-read the PTE here?

Yeah, you're right. I had some odd rationalization about this, but
there's no need to force a walker to descend into the new table level as
it is wasted work if another thread unlinks it.

[...]

> >
> > + table = kvm_pte_table(pte, level);
> > if (!table) {
>
> nit: Technically there's no reason to set @table again. e.g. This could
> just be:
>
> if (!kvm_pte_table(pte, level)) {

Sure, I'll squish these lines together.

--
Thanks,
Oliver