On Wed, Apr 27, 2022 at 7:16 PM Sean Christopherson <seanjc@xxxxxxxxxx> wrote: > @@ -159,10 +249,23 @@ int kvm_gfn_to_pfn_cache_refresh(struct kvm *kvm, struct gfn_to_pfn_cache *gpc, > The following code of refresh_in_progress is somewhat like mutex. + mutex_lock(&gpc->refresh_in_progress); // before write_lock_irq(&gpc->lock); Is it fit for the intention? Thanks Lai > write_lock_irq(&gpc->lock); > > + /* > + * If another task is refreshing the cache, wait for it to complete. > + * There is no guarantee that concurrent refreshes will see the same > + * gpa, memslots generation, etc..., so they must be fully serialized. > + */ > + while (gpc->refresh_in_progress) { > + write_unlock_irq(&gpc->lock); > + > + cond_resched(); > + > + write_lock_irq(&gpc->lock); > + } > + gpc->refresh_in_progress = true; > + > old_pfn = gpc->pfn; > old_khva = gpc->khva - offset_in_page(gpc->khva); > old_uhva = gpc->uhva; > - old_valid = gpc->valid; >