drm/i915/gvt: remove kvmgt_guest_{init,exit}
authorChristoph Hellwig <hch@lst.de>
Mon, 11 Apr 2022 14:13:56 +0000 (16:13 +0200)
committerZhi Wang <zhi.a.wang@intel.com>
Thu, 21 Apr 2022 11:36:56 +0000 (07:36 -0400)
Merge these into their only callers.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Zhi Wang <zhi.a.wang@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20220411141403.86980-28-hch@lst.de
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Zhi Wang <zhi.a.wang@intel.com>
drivers/gpu/drm/i915/gvt/kvmgt.c

index 5db74b6..38629ab 100644 (file)
@@ -100,6 +100,13 @@ struct gvt_dma {
        struct kref ref;
 };
 
+static void kvmgt_page_track_write(struct kvm_vcpu *vcpu, 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 ssize_t available_instances_show(struct mdev_type *mtype,
                                        struct mdev_type_attribute *attr,
                                        char *buf)
@@ -213,9 +220,7 @@ void intel_gvt_cleanup_vgpu_type_groups(struct intel_gvt *gvt)
        }
 }
 
-static int kvmgt_guest_init(struct mdev_device *mdev);
 static void intel_vgpu_release_work(struct work_struct *work);
-static bool kvmgt_guest_exit(struct intel_vgpu *info);
 
 static void gvt_unpin_guest_page(struct intel_vgpu *vgpu, unsigned long gfn,
                unsigned long size)
@@ -803,6 +808,27 @@ static int intel_vgpu_group_notifier(struct notifier_block *nb,
        return NOTIFY_OK;
 }
 
+static bool __kvmgt_vgpu_exist(struct intel_vgpu *vgpu)
+{
+       struct intel_vgpu *itr;
+       int id;
+       bool ret = false;
+
+       mutex_lock(&vgpu->gvt->lock);
+       for_each_active_vgpu(vgpu->gvt, itr, id) {
+               if (!itr->attached)
+                       continue;
+
+               if (vgpu->kvm == itr->kvm) {
+                       ret = true;
+                       goto out;
+               }
+       }
+out:
+       mutex_unlock(&vgpu->gvt->lock);
+       return ret;
+}
+
 static int intel_vgpu_open_device(struct mdev_device *mdev)
 {
        struct intel_vgpu *vgpu = mdev_get_drvdata(mdev);
@@ -847,14 +873,37 @@ static int intel_vgpu_open_device(struct mdev_device *mdev)
                goto undo_group;
        }
 
-       ret = kvmgt_guest_init(mdev);
-       if (ret)
+       ret = -EEXIST;
+       if (vgpu->attached)
+               goto undo_group;
+
+       ret = -ESRCH;
+       if (!vgpu->kvm || vgpu->kvm->mm != current->mm) {
+               gvt_vgpu_err("KVM is required to use Intel vGPU\n");
+               goto undo_group;
+       }
+
+       ret = -EEXIST;
+       if (__kvmgt_vgpu_exist(vgpu))
                goto undo_group;
 
+       vgpu->attached = true;
+       kvm_get_kvm(vgpu->kvm);
+
+       kvmgt_protect_table_init(vgpu);
+       gvt_cache_init(vgpu);
+
+       vgpu->track_node.track_write = kvmgt_page_track_write;
+       vgpu->track_node.track_flush_slot = kvmgt_page_track_flush_slot;
+       kvm_page_track_register_notifier(vgpu->kvm, &vgpu->track_node);
+
+       debugfs_create_ulong(KVMGT_DEBUGFS_FILENAME, 0444, vgpu->debugfs,
+                            &vgpu->nr_cache_entries);
+
        intel_gvt_activate_vgpu(vgpu);
 
        atomic_set(&vgpu->released, 0);
-       return ret;
+       return 0;
 
 undo_group:
        vfio_group_put_external_user(vgpu->vfio_group);
@@ -908,7 +957,12 @@ static void __intel_vgpu_release(struct intel_vgpu *vgpu)
        /* dereference module reference taken at open */
        module_put(THIS_MODULE);
 
-       kvmgt_guest_exit(vgpu);
+       debugfs_remove(debugfs_lookup(KVMGT_DEBUGFS_FILENAME, vgpu->debugfs));
+
+       kvm_page_track_unregister_notifier(vgpu->kvm, &vgpu->track_node);
+       kvm_put_kvm(vgpu->kvm);
+       kvmgt_protect_table_destroy(vgpu);
+       gvt_cache_destroy(vgpu);
 
        intel_vgpu_release_msi_eventfd_ctx(vgpu);
        vfio_group_put_external_user(vgpu->vfio_group);
@@ -1763,69 +1817,6 @@ static void kvmgt_page_track_flush_slot(struct kvm *kvm,
        write_unlock(&kvm->mmu_lock);
 }
 
-static bool __kvmgt_vgpu_exist(struct intel_vgpu *vgpu, struct kvm *kvm)
-{
-       struct intel_vgpu *itr;
-       int id;
-       bool ret = false;
-
-       mutex_lock(&vgpu->gvt->lock);
-       for_each_active_vgpu(vgpu->gvt, itr, id) {
-               if (!itr->attached)
-                       continue;
-
-               if (kvm && kvm == itr->kvm) {
-                       ret = true;
-                       goto out;
-               }
-       }
-out:
-       mutex_unlock(&vgpu->gvt->lock);
-       return ret;
-}
-
-static int kvmgt_guest_init(struct mdev_device *mdev)
-{
-       struct intel_vgpu *vgpu = mdev_get_drvdata(mdev);
-       struct kvm *kvm = vgpu->kvm;
-
-       if (vgpu->attached)
-               return -EEXIST;
-
-       if (!kvm || kvm->mm != current->mm) {
-               gvt_vgpu_err("KVM is required to use Intel vGPU\n");
-               return -ESRCH;
-       }
-
-       if (__kvmgt_vgpu_exist(vgpu, kvm))
-               return -EEXIST;
-
-       vgpu->attached = true;
-       kvm_get_kvm(vgpu->kvm);
-
-       kvmgt_protect_table_init(vgpu);
-       gvt_cache_init(vgpu);
-
-       vgpu->track_node.track_write = kvmgt_page_track_write;
-       vgpu->track_node.track_flush_slot = kvmgt_page_track_flush_slot;
-       kvm_page_track_register_notifier(kvm, &vgpu->track_node);
-
-       debugfs_create_ulong(KVMGT_DEBUGFS_FILENAME, 0444, vgpu->debugfs,
-                            &vgpu->nr_cache_entries);
-       return 0;
-}
-
-static bool kvmgt_guest_exit(struct intel_vgpu *info)
-{
-       debugfs_remove(debugfs_lookup(KVMGT_DEBUGFS_FILENAME, info->debugfs));
-
-       kvm_page_track_unregister_notifier(info->kvm, &info->track_node);
-       kvm_put_kvm(info->kvm);
-       kvmgt_protect_table_destroy(info);
-       gvt_cache_destroy(info);
-       return true;
-}
-
 void intel_vgpu_detach_regions(struct intel_vgpu *vgpu)
 {
        int i;