On Mon, Apr 18, 2022 at 7:55 PM Ricardo Koller <ricarkol@xxxxxxxxxx> wrote: > > On Fri, Apr 15, 2022 at 09:58:48PM +0000, Oliver Upton wrote: > > Use RCU to safely traverse the page tables in parallel; the tables > > themselves will only be freed from an RCU synchronized context. Don't > > even bother with adding support to hyp, and instead just assume > > exclusive access of the page tables. > > > > Signed-off-by: Oliver Upton <oupton@xxxxxxxxxx> > > --- > > arch/arm64/kvm/hyp/pgtable.c | 23 ++++++++++++++++++++++- > > 1 file changed, 22 insertions(+), 1 deletion(-) > > > > diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c > > index 5b64fbca8a93..d4699f698d6e 100644 > > --- a/arch/arm64/kvm/hyp/pgtable.c > > +++ b/arch/arm64/kvm/hyp/pgtable.c > > @@ -132,9 +132,28 @@ static kvm_pte_t kvm_phys_to_pte(u64 pa) > > return pte; > > } > > > > + > > +#if defined(__KVM_NVHE_HYPERVISOR__) > > +static inline void kvm_pgtable_walk_begin(void) > > +{} > > + > > +static inline void kvm_pgtable_walk_end(void) > > +{} > > + > > +#define kvm_dereference_ptep rcu_dereference_raw > > +#else > > +#define kvm_pgtable_walk_begin rcu_read_lock > > + > > +#define kvm_pgtable_walk_end rcu_read_unlock > > + > > +#define kvm_dereference_ptep rcu_dereference > > +#endif > > + > > static kvm_pte_t *kvm_pte_follow(kvm_pte_t pte, struct kvm_pgtable_mm_ops *mm_ops) > > { > > - return mm_ops->phys_to_virt(kvm_pte_to_phys(pte)); > > + kvm_pte_t __rcu *ptep = mm_ops->phys_to_virt(kvm_pte_to_phys(pte)); > > + > > + return kvm_dereference_ptep(ptep); > > } > > > > static void kvm_clear_pte(kvm_pte_t *ptep) > > @@ -288,7 +307,9 @@ int kvm_pgtable_walk(struct kvm_pgtable *pgt, u64 addr, u64 size, > > .walker = walker, > > }; > > > > + kvm_pgtable_walk_begin(); > > return _kvm_pgtable_walk(&walk_data); > > + kvm_pgtable_walk_end(); > > This might be fixed later in the series, but at this point the > rcu_read_unlock is never called. Well that's embarrassing!