Message ID | 20230311002258.852397-18-seanjc@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/i915/gvt: KVM: KVMGT fixes and page-track cleanups | expand |
Tested-by: Yan Zhao <yan.y.zhao@intel.com> On Fri, Mar 10, 2023 at 04:22:48PM -0800, Sean Christopherson wrote: > From: Yan Zhao <yan.y.zhao@intel.com> > > Switch from the poorly named and flawed ->track_flush_slot() to the newly > introduced ->track_remove_region(). From KVMGT's perspective, the two > hooks are functionally equivalent, the only difference being that > ->track_remove_region() is called only when KVM is 100% certain the > memory region will be removed, i.e. is invoked slightly later in KVM's > memslot modification flow. > > Cc: Zhenyu Wang <zhenyuw@linux.intel.com> > Suggested-by: Sean Christopherson <seanjc@google.com> > Signed-off-by: Yan Zhao <yan.y.zhao@intel.com> > [sean: handle name change, massage changelog, rebase] > Signed-off-by: Sean Christopherson <seanjc@google.com> > --- > drivers/gpu/drm/i915/gvt/kvmgt.c | 21 +++++++++------------ > 1 file changed, 9 insertions(+), 12 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c > index 577712ea4893..9f188b6c3edf 100644 > --- a/drivers/gpu/drm/i915/gvt/kvmgt.c > +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c > @@ -108,9 +108,8 @@ struct gvt_dma { > > static void kvmgt_page_track_write(gpa_t gpa, const u8 *val, int len, > struct kvm_page_track_notifier_node *node); > -static void kvmgt_page_track_flush_slot(struct kvm *kvm, > - struct kvm_memory_slot *slot, > - struct kvm_page_track_notifier_node *node); > +static void kvmgt_page_track_remove_region(gfn_t gfn, unsigned long nr_pages, > + struct kvm_page_track_notifier_node *node); > > static ssize_t intel_vgpu_show_description(struct mdev_type *mtype, char *buf) > { > @@ -680,7 +679,7 @@ static int intel_vgpu_open_device(struct vfio_device *vfio_dev) > return -EEXIST; > > vgpu->track_node.track_write = kvmgt_page_track_write; > - vgpu->track_node.track_flush_slot = kvmgt_page_track_flush_slot; > + vgpu->track_node.track_remove_region = kvmgt_page_track_remove_region; > kvm_get_kvm(vgpu->vfio_device.kvm); > kvm_page_track_register_notifier(vgpu->vfio_device.kvm, > &vgpu->track_node); > @@ -1631,22 +1630,20 @@ static void kvmgt_page_track_write(gpa_t gpa, const u8 *val, int len, > mutex_unlock(&info->vgpu_lock); > } > > -static void kvmgt_page_track_flush_slot(struct kvm *kvm, > - struct kvm_memory_slot *slot, > - struct kvm_page_track_notifier_node *node) > +static void kvmgt_page_track_remove_region(gfn_t gfn, unsigned long nr_pages, > + struct kvm_page_track_notifier_node *node) > { > unsigned long i; > - gfn_t gfn; > struct intel_vgpu *info = > container_of(node, struct intel_vgpu, track_node); > > mutex_lock(&info->vgpu_lock); > > - for (i = 0; i < slot->npages; i++) { > - gfn = slot->base_gfn + i; > - if (kvmgt_gfn_is_write_protected(info, gfn)) > - kvmgt_protect_table_del(info, gfn); > + for (i = 0; i < nr_pages; i++) { > + if (kvmgt_gfn_is_write_protected(info, gfn + i)) > + kvmgt_protect_table_del(info, gfn + i); > } > + > mutex_unlock(&info->vgpu_lock); > } > > -- > 2.40.0.rc1.284.g88254d51c5-goog >
diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c index 577712ea4893..9f188b6c3edf 100644 --- a/drivers/gpu/drm/i915/gvt/kvmgt.c +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c @@ -108,9 +108,8 @@ struct gvt_dma { static void kvmgt_page_track_write(gpa_t gpa, const u8 *val, int len, struct kvm_page_track_notifier_node *node); -static void kvmgt_page_track_flush_slot(struct kvm *kvm, - struct kvm_memory_slot *slot, - struct kvm_page_track_notifier_node *node); +static void kvmgt_page_track_remove_region(gfn_t gfn, unsigned long nr_pages, + struct kvm_page_track_notifier_node *node); static ssize_t intel_vgpu_show_description(struct mdev_type *mtype, char *buf) { @@ -680,7 +679,7 @@ static int intel_vgpu_open_device(struct vfio_device *vfio_dev) return -EEXIST; vgpu->track_node.track_write = kvmgt_page_track_write; - vgpu->track_node.track_flush_slot = kvmgt_page_track_flush_slot; + vgpu->track_node.track_remove_region = kvmgt_page_track_remove_region; kvm_get_kvm(vgpu->vfio_device.kvm); kvm_page_track_register_notifier(vgpu->vfio_device.kvm, &vgpu->track_node); @@ -1631,22 +1630,20 @@ static void kvmgt_page_track_write(gpa_t gpa, const u8 *val, int len, mutex_unlock(&info->vgpu_lock); } -static void kvmgt_page_track_flush_slot(struct kvm *kvm, - struct kvm_memory_slot *slot, - struct kvm_page_track_notifier_node *node) +static void kvmgt_page_track_remove_region(gfn_t gfn, unsigned long nr_pages, + struct kvm_page_track_notifier_node *node) { unsigned long i; - gfn_t gfn; struct intel_vgpu *info = container_of(node, struct intel_vgpu, track_node); mutex_lock(&info->vgpu_lock); - for (i = 0; i < slot->npages; i++) { - gfn = slot->base_gfn + i; - if (kvmgt_gfn_is_write_protected(info, gfn)) - kvmgt_protect_table_del(info, gfn); + for (i = 0; i < nr_pages; i++) { + if (kvmgt_gfn_is_write_protected(info, gfn + i)) + kvmgt_protect_table_del(info, gfn + i); } + mutex_unlock(&info->vgpu_lock); }