Skip to content
This repository was archived by the owner on Oct 3, 2024. It is now read-only.

Commit 3788839

Browse files
committed
Merge remote-tracking branch 'origin/gvt-fixes' into gvt-staging
2 parents 39ce45e + 601fd0f commit 3788839

File tree

8 files changed

+80
-48
lines changed

8 files changed

+80
-48
lines changed

drivers/gpu/drm/i915/gvt/debugfs.c

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,22 @@ DEFINE_SIMPLE_ATTRIBUTE(vgpu_scan_nonprivbb_fops,
151151
vgpu_scan_nonprivbb_get, vgpu_scan_nonprivbb_set,
152152
"0x%llx\n");
153153

154+
static int vgpu_status_get(void *data, u64 *val)
155+
{
156+
struct intel_vgpu *vgpu = (struct intel_vgpu *)data;
157+
158+
*val = 0;
159+
160+
if (test_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status))
161+
*val |= (1 << INTEL_VGPU_STATUS_ATTACHED);
162+
if (test_bit(INTEL_VGPU_STATUS_ACTIVE, vgpu->status))
163+
*val |= (1 << INTEL_VGPU_STATUS_ACTIVE);
164+
165+
return 0;
166+
}
167+
168+
DEFINE_SIMPLE_ATTRIBUTE(vgpu_status_fops, vgpu_status_get, NULL, "0x%llx\n");
169+
154170
/**
155171
* intel_gvt_debugfs_add_vgpu - register debugfs entries for a vGPU
156172
* @vgpu: a vGPU
@@ -162,11 +178,12 @@ void intel_gvt_debugfs_add_vgpu(struct intel_vgpu *vgpu)
162178
snprintf(name, 16, "vgpu%d", vgpu->id);
163179
vgpu->debugfs = debugfs_create_dir(name, vgpu->gvt->debugfs_root);
164180

165-
debugfs_create_bool("active", 0444, vgpu->debugfs, &vgpu->active);
166181
debugfs_create_file("mmio_diff", 0444, vgpu->debugfs, vgpu,
167182
&vgpu_mmio_diff_fops);
168183
debugfs_create_file("scan_nonprivbb", 0644, vgpu->debugfs, vgpu,
169184
&vgpu_scan_nonprivbb_fops);
185+
debugfs_create_file("status", 0644, vgpu->debugfs, vgpu,
186+
&vgpu_status_fops);
170187
}
171188

172189
/**
@@ -175,8 +192,13 @@ void intel_gvt_debugfs_add_vgpu(struct intel_vgpu *vgpu)
175192
*/
176193
void intel_gvt_debugfs_remove_vgpu(struct intel_vgpu *vgpu)
177194
{
178-
debugfs_remove_recursive(vgpu->debugfs);
179-
vgpu->debugfs = NULL;
195+
struct intel_gvt *gvt = vgpu->gvt;
196+
struct drm_minor *minor = gvt->gt->i915->drm.primary;
197+
198+
if (minor->debugfs_root && gvt->debugfs_root) {
199+
debugfs_remove_recursive(vgpu->debugfs);
200+
vgpu->debugfs = NULL;
201+
}
180202
}
181203

182204
/**
@@ -199,6 +221,10 @@ void intel_gvt_debugfs_init(struct intel_gvt *gvt)
199221
*/
200222
void intel_gvt_debugfs_clean(struct intel_gvt *gvt)
201223
{
202-
debugfs_remove_recursive(gvt->debugfs_root);
203-
gvt->debugfs_root = NULL;
224+
struct drm_minor *minor = gvt->gt->i915->drm.primary;
225+
226+
if (minor->debugfs_root) {
227+
debugfs_remove_recursive(gvt->debugfs_root);
228+
gvt->debugfs_root = NULL;
229+
}
204230
}

drivers/gpu/drm/i915/gvt/dmabuf.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ static void dmabuf_gem_object_free(struct kref *kref)
136136
struct list_head *pos;
137137
struct intel_vgpu_dmabuf_obj *dmabuf_obj;
138138

139-
if (vgpu && vgpu->active && !list_empty(&vgpu->dmabuf_obj_list_head)) {
139+
if (vgpu && test_bit(INTEL_VGPU_STATUS_ACTIVE, vgpu->status) &&
140+
!list_empty(&vgpu->dmabuf_obj_list_head)) {
140141
list_for_each(pos, &vgpu->dmabuf_obj_list_head) {
141142
dmabuf_obj = list_entry(pos, struct intel_vgpu_dmabuf_obj, list);
142143
if (dmabuf_obj == obj) {

drivers/gpu/drm/i915/gvt/gtt.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ static bool intel_gvt_is_valid_gfn(struct intel_vgpu *vgpu, unsigned long gfn)
5555
int idx;
5656
bool ret;
5757

58-
if (!vgpu->attached)
58+
if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status))
5959
return false;
6060

6161
idx = srcu_read_lock(&kvm->srcu);
@@ -1178,7 +1178,7 @@ static int is_2MB_gtt_possible(struct intel_vgpu *vgpu,
11781178
if (!HAS_PAGE_SIZES(vgpu->gvt->gt->i915, I915_GTT_PAGE_SIZE_2M))
11791179
return 0;
11801180

1181-
if (!vgpu->attached)
1181+
if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status))
11821182
return -EINVAL;
11831183
pfn = gfn_to_pfn(vgpu->vfio_device.kvm, ops->get_pfn(entry));
11841184
if (is_error_noslot_pfn(pfn))
@@ -1209,10 +1209,8 @@ static int split_2MB_gtt_entry(struct intel_vgpu *vgpu,
12091209
for_each_shadow_entry(sub_spt, &sub_se, sub_index) {
12101210
ret = intel_gvt_dma_map_guest_page(vgpu, start_gfn + sub_index,
12111211
PAGE_SIZE, &dma_addr);
1212-
if (ret) {
1213-
ppgtt_invalidate_spt(spt);
1214-
return ret;
1215-
}
1212+
if (ret)
1213+
goto err;
12161214
sub_se.val64 = se->val64;
12171215

12181216
/* Copy the PAT field from PDE. */
@@ -1231,6 +1229,17 @@ static int split_2MB_gtt_entry(struct intel_vgpu *vgpu,
12311229
ops->set_pfn(se, sub_spt->shadow_page.mfn);
12321230
ppgtt_set_shadow_entry(spt, se, index);
12331231
return 0;
1232+
err:
1233+
/* Cancel the existing addess mappings of DMA addr. */
1234+
for_each_present_shadow_entry(sub_spt, &sub_se, sub_index) {
1235+
gvt_vdbg_mm("invalidate 4K entry\n");
1236+
ppgtt_invalidate_pte(sub_spt, &sub_se);
1237+
}
1238+
/* Release the new allocated spt. */
1239+
trace_spt_change(sub_spt->vgpu->id, "release", sub_spt,
1240+
sub_spt->guest_page.gfn, sub_spt->shadow_page.type);
1241+
ppgtt_free_spt(sub_spt);
1242+
return ret;
12341243
}
12351244

12361245
static int split_64KB_gtt_entry(struct intel_vgpu *vgpu,

drivers/gpu/drm/i915/gvt/gvt.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -172,13 +172,18 @@ struct intel_vgpu_submission {
172172

173173
#define KVMGT_DEBUGFS_FILENAME "kvmgt_nr_cache_entries"
174174

175+
enum {
176+
INTEL_VGPU_STATUS_ATTACHED = 0,
177+
INTEL_VGPU_STATUS_ACTIVE,
178+
INTEL_VGPU_STATUS_NR_BITS,
179+
};
180+
175181
struct intel_vgpu {
176182
struct vfio_device vfio_device;
177183
struct intel_gvt *gvt;
178184
struct mutex vgpu_lock;
179185
int id;
180-
bool active;
181-
bool attached;
186+
DECLARE_BITMAP(status, INTEL_VGPU_STATUS_NR_BITS);
182187
bool pv_notified;
183188
bool failsafe;
184189
unsigned int resetting_eng;
@@ -467,7 +472,7 @@ void intel_vgpu_write_fence(struct intel_vgpu *vgpu,
467472

468473
#define for_each_active_vgpu(gvt, vgpu, id) \
469474
idr_for_each_entry((&(gvt)->vgpu_idr), (vgpu), (id)) \
470-
for_each_if(vgpu->active)
475+
for_each_if(test_bit(INTEL_VGPU_STATUS_ACTIVE, vgpu->status))
471476

472477
static inline void intel_vgpu_write_pci_bar(struct intel_vgpu *vgpu,
473478
u32 offset, u32 val, bool low)
@@ -725,7 +730,7 @@ static inline bool intel_gvt_mmio_is_cmd_write_patch(
725730
static inline int intel_gvt_read_gpa(struct intel_vgpu *vgpu, unsigned long gpa,
726731
void *buf, unsigned long len)
727732
{
728-
if (!vgpu->attached)
733+
if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status))
729734
return -ESRCH;
730735
return vfio_dma_rw(&vgpu->vfio_device, gpa, buf, len, false);
731736
}
@@ -743,7 +748,7 @@ static inline int intel_gvt_read_gpa(struct intel_vgpu *vgpu, unsigned long gpa,
743748
static inline int intel_gvt_write_gpa(struct intel_vgpu *vgpu,
744749
unsigned long gpa, void *buf, unsigned long len)
745750
{
746-
if (!vgpu->attached)
751+
if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status))
747752
return -ESRCH;
748753
return vfio_dma_rw(&vgpu->vfio_device, gpa, buf, len, true);
749754
}

drivers/gpu/drm/i915/gvt/interrupt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ static int inject_virtual_interrupt(struct intel_vgpu *vgpu)
433433
* enabled by guest. so if msi_trigger is null, success is still
434434
* returned and don't inject interrupt into guest.
435435
*/
436-
if (!vgpu->attached)
436+
if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status))
437437
return -ESRCH;
438438
if (vgpu->msi_trigger && eventfd_signal(vgpu->msi_trigger, 1) != 1)
439439
return -EFAULT;

drivers/gpu/drm/i915/gvt/kvmgt.c

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ static bool __kvmgt_vgpu_exist(struct intel_vgpu *vgpu)
638638

639639
mutex_lock(&vgpu->gvt->lock);
640640
for_each_active_vgpu(vgpu->gvt, itr, id) {
641-
if (!itr->attached)
641+
if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, itr->status))
642642
continue;
643643

644644
if (vgpu->vfio_device.kvm == itr->vfio_device.kvm) {
@@ -655,9 +655,6 @@ static int intel_vgpu_open_device(struct vfio_device *vfio_dev)
655655
{
656656
struct intel_vgpu *vgpu = vfio_dev_to_vgpu(vfio_dev);
657657

658-
if (vgpu->attached)
659-
return -EEXIST;
660-
661658
if (!vgpu->vfio_device.kvm ||
662659
vgpu->vfio_device.kvm->mm != current->mm) {
663660
gvt_vgpu_err("KVM is required to use Intel vGPU\n");
@@ -667,14 +664,14 @@ static int intel_vgpu_open_device(struct vfio_device *vfio_dev)
667664
if (__kvmgt_vgpu_exist(vgpu))
668665
return -EEXIST;
669666

670-
vgpu->attached = true;
671-
672667
vgpu->track_node.track_write = kvmgt_page_track_write;
673668
vgpu->track_node.track_flush_slot = kvmgt_page_track_flush_slot;
674669
kvm_get_kvm(vgpu->vfio_device.kvm);
675670
kvm_page_track_register_notifier(vgpu->vfio_device.kvm,
676671
&vgpu->track_node);
677672

673+
set_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status);
674+
678675
debugfs_create_ulong(KVMGT_DEBUGFS_FILENAME, 0444, vgpu->debugfs,
679676
&vgpu->nr_cache_entries);
680677

@@ -698,11 +695,10 @@ static void intel_vgpu_close_device(struct vfio_device *vfio_dev)
698695
{
699696
struct intel_vgpu *vgpu = vfio_dev_to_vgpu(vfio_dev);
700697

701-
if (!vgpu->attached)
702-
return;
703-
704698
intel_gvt_release_vgpu(vgpu);
705699

700+
clear_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status);
701+
706702
debugfs_remove(debugfs_lookup(KVMGT_DEBUGFS_FILENAME, vgpu->debugfs));
707703

708704
kvm_page_track_unregister_notifier(vgpu->vfio_device.kvm,
@@ -718,8 +714,6 @@ static void intel_vgpu_close_device(struct vfio_device *vfio_dev)
718714
vgpu->dma_addr_cache = RB_ROOT;
719715

720716
intel_vgpu_release_msi_eventfd_ctx(vgpu);
721-
722-
vgpu->attached = false;
723717
}
724718

725719
static u64 intel_vgpu_get_bar_addr(struct intel_vgpu *vgpu, int bar)
@@ -1512,9 +1506,6 @@ static void intel_vgpu_remove(struct mdev_device *mdev)
15121506
{
15131507
struct intel_vgpu *vgpu = dev_get_drvdata(&mdev->dev);
15141508

1515-
if (WARN_ON_ONCE(vgpu->attached))
1516-
return;
1517-
15181509
vfio_unregister_group_dev(&vgpu->vfio_device);
15191510
vfio_put_device(&vgpu->vfio_device);
15201511
}
@@ -1559,7 +1550,7 @@ int intel_gvt_page_track_add(struct intel_vgpu *info, u64 gfn)
15591550
struct kvm_memory_slot *slot;
15601551
int idx;
15611552

1562-
if (!info->attached)
1553+
if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, info->status))
15631554
return -ESRCH;
15641555

15651556
idx = srcu_read_lock(&kvm->srcu);
@@ -1589,8 +1580,8 @@ int intel_gvt_page_track_remove(struct intel_vgpu *info, u64 gfn)
15891580
struct kvm_memory_slot *slot;
15901581
int idx;
15911582

1592-
if (!info->attached)
1593-
return 0;
1583+
if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, info->status))
1584+
return -ESRCH;
15941585

15951586
idx = srcu_read_lock(&kvm->srcu);
15961587
slot = gfn_to_memslot(kvm, gfn);
@@ -1668,7 +1659,7 @@ int intel_gvt_dma_map_guest_page(struct intel_vgpu *vgpu, unsigned long gfn,
16681659
struct gvt_dma *entry;
16691660
int ret;
16701661

1671-
if (!vgpu->attached)
1662+
if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status))
16721663
return -EINVAL;
16731664

16741665
mutex_lock(&vgpu->cache_lock);
@@ -1714,8 +1705,8 @@ int intel_gvt_dma_pin_guest_page(struct intel_vgpu *vgpu, dma_addr_t dma_addr)
17141705
struct gvt_dma *entry;
17151706
int ret = 0;
17161707

1717-
if (!vgpu->attached)
1718-
return -ENODEV;
1708+
if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status))
1709+
return -EINVAL;
17191710

17201711
mutex_lock(&vgpu->cache_lock);
17211712
entry = __gvt_cache_find_dma_addr(vgpu, dma_addr);
@@ -1742,7 +1733,7 @@ void intel_gvt_dma_unmap_guest_page(struct intel_vgpu *vgpu,
17421733
{
17431734
struct gvt_dma *entry;
17441735

1745-
if (!vgpu->attached)
1736+
if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status))
17461737
return;
17471738

17481739
mutex_lock(&vgpu->cache_lock);
@@ -1778,7 +1769,7 @@ static void intel_gvt_test_and_emulate_vblank(struct intel_gvt *gvt)
17781769
idr_for_each_entry((&(gvt)->vgpu_idr), (vgpu), (id)) {
17791770
if (test_and_clear_bit(INTEL_GVT_REQUEST_EMULATE_VBLANK + id,
17801771
(void *)&gvt->service_request)) {
1781-
if (vgpu->active)
1772+
if (test_bit(INTEL_VGPU_STATUS_ACTIVE, vgpu->status))
17821773
intel_vgpu_emulate_vblank(vgpu);
17831774
}
17841775
}

drivers/gpu/drm/i915/gvt/scheduler.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,7 @@ intel_vgpu_shadow_mm_pin(struct intel_vgpu_workload *workload)
695695

696696
if (workload->shadow_mm->type != INTEL_GVT_MM_PPGTT ||
697697
!workload->shadow_mm->ppgtt_mm.shadowed) {
698+
intel_vgpu_unpin_mm(workload->shadow_mm);
698699
gvt_vgpu_err("workload shadow ppgtt isn't ready\n");
699700
return -EINVAL;
700701
}
@@ -865,7 +866,8 @@ pick_next_workload(struct intel_gvt *gvt, struct intel_engine_cs *engine)
865866
goto out;
866867
}
867868

868-
if (!scheduler->current_vgpu->active ||
869+
if (!test_bit(INTEL_VGPU_STATUS_ACTIVE,
870+
scheduler->current_vgpu->status) ||
869871
list_empty(workload_q_head(scheduler->current_vgpu, engine)))
870872
goto out;
871873

drivers/gpu/drm/i915/gvt/vgpu.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,7 @@ void intel_gvt_clean_vgpu_types(struct intel_gvt *gvt)
166166
*/
167167
void intel_gvt_activate_vgpu(struct intel_vgpu *vgpu)
168168
{
169-
mutex_lock(&vgpu->vgpu_lock);
170-
vgpu->active = true;
171-
mutex_unlock(&vgpu->vgpu_lock);
169+
set_bit(INTEL_VGPU_STATUS_ACTIVE, vgpu->status);
172170
}
173171

174172
/**
@@ -183,7 +181,7 @@ void intel_gvt_deactivate_vgpu(struct intel_vgpu *vgpu)
183181
{
184182
mutex_lock(&vgpu->vgpu_lock);
185183

186-
vgpu->active = false;
184+
clear_bit(INTEL_VGPU_STATUS_ACTIVE, vgpu->status);
187185

188186
if (atomic_read(&vgpu->submission.running_workload_num)) {
189187
mutex_unlock(&vgpu->vgpu_lock);
@@ -228,7 +226,8 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu)
228226
struct intel_gvt *gvt = vgpu->gvt;
229227
struct drm_i915_private *i915 = gvt->gt->i915;
230228

231-
drm_WARN(&i915->drm, vgpu->active, "vGPU is still active!\n");
229+
drm_WARN(&i915->drm, test_bit(INTEL_VGPU_STATUS_ACTIVE, vgpu->status),
230+
"vGPU is still active!\n");
232231

233232
/*
234233
* remove idr first so later clean can judge if need to stop
@@ -285,8 +284,7 @@ struct intel_vgpu *intel_gvt_create_idle_vgpu(struct intel_gvt *gvt)
285284
if (ret)
286285
goto out_free_vgpu;
287286

288-
vgpu->active = false;
289-
287+
clear_bit(INTEL_VGPU_STATUS_ACTIVE, vgpu->status);
290288
return vgpu;
291289

292290
out_free_vgpu:

0 commit comments

Comments
 (0)