Re: [PATCH v5 15/19] KVM: Provide common implementation for generic dirty log functions

From: Peter Xu
Date: Thu Feb 06 2020 - 16:41:16 EST


On Thu, Feb 06, 2020 at 01:21:20PM -0800, Sean Christopherson wrote:
> On Thu, Feb 06, 2020 at 03:02:00PM -0500, Peter Xu wrote:
> > On Tue, Jan 21, 2020 at 02:31:53PM -0800, Sean Christopherson wrote:
> >
> > [...]
> >
> > > -int kvm_vm_ioctl_clear_dirty_log(struct kvm *kvm, struct kvm_clear_dirty_log *log)
> > > +void kvm_arch_dirty_log_tlb_flush(struct kvm *kvm,
> > > + struct kvm_memory_slot *memslot)
> >
> > If it's to flush TLB for a memslot, shall we remove the "dirty_log" in
> > the name of the function, because it has nothing to do with dirty
> > logging any more? And...
>
> I kept the "dirty_log" to allow arch code to implement logic specific to a
> TLB flush during dirty logging, e.g. x86's lockdep assert on slots_lock.
> And similar to the issue with MIPS below, to deter usage of the hook for
> anything else, i.e. to nudge people to using kvm_flush_remote_tlbs()
> directly.

The x86's lockdep assert is not that important afaict, since the two
callers of the new tlb_flush() hook will be with slots_lock for sure.

>
> > > {
> > > - struct kvm_memslots *slots;
> > > - struct kvm_memory_slot *memslot;
> > > - bool flush = false;
> > > - int r;
> > > -
> > > - mutex_lock(&kvm->slots_lock);
> > > -
> > > - r = kvm_clear_dirty_log_protect(kvm, log, &flush);
> > > -
> > > - if (flush) {
> > > - slots = kvm_memslots(kvm);
> > > - memslot = id_to_memslot(slots, log->slot);
> > > -
> > > - /* Let implementation handle TLB/GVA invalidation */
> > > - kvm_mips_callbacks->flush_shadow_memslot(kvm, memslot);
> > > - }
> > > -
> > > - mutex_unlock(&kvm->slots_lock);
> > > - return r;
> > > + /* Let implementation handle TLB/GVA invalidation */
> > > + kvm_mips_callbacks->flush_shadow_memslot(kvm, memslot);
> >
> > ... This may not directly related to the current patch, but I'm
> > confused on why MIPS cannot use kvm_flush_remote_tlbs() to flush TLBs.
> > I know nothing about MIPS code, but IIUC here flush_shadow_memslot()
> > is a heavier operation that will also invalidate the shadow pages.
> > Seems to be an overkill here when we only changed write permission of
> > the PTEs? I tried to check the first occurance (2a31b9db15353) but I
> > didn't find out any clue of it so far.
> >
> > But that matters to this patch because if MIPS can use
> > kvm_flush_remote_tlbs(), then we probably don't need this
> > arch-specific hook any more and we can directly call
> > kvm_flush_remote_tlbs() after sync dirty log when flush==true.
>
> Ya, the asid_flush_mask in kvm_vz_flush_shadow_all() is the only thing
> that prevents calling kvm_flush_remote_tlbs() directly, but I have no
> clue as to the important of that code.

As said above I think the x86 lockdep is really not necessary, then
considering MIPS could be the only one that will use the new hook
introduced in this patch... Shall we figure that out first?

Thanks,

--
Peter Xu