Skip to content

Commit 1e557c1

Browse files
yanzhao56bonzini
authored andcommitted
drm/i915/gvt: remove interface intel_gvt_is_valid_gfn
Currently intel_gvt_is_valid_gfn() is called in two places: (1) shadowing guest GGTT entry (2) shadowing guest PPGTT leaf entry, which was introduced in commit cc753fb ("drm/i915/gvt: validate gfn before set shadow page entry"). However, now it's not necessary to call this interface any more, because a. GGTT partial write issue has been fixed by commit bc0686f ("drm/i915/gvt: support inconsecutive partial gtt entry write") commit 510fe10 ("drm/i915/gvt: fix a bug of partially write ggtt enties") b. PPGTT resides in normal guest RAM and we only treat 8-byte writes as valid page table writes. Any invalid GPA found is regarded as an error, either due to guest misbehavior/attack or bug in host shadow code. So,rather than do GFN pre-checking and replace invalid GFNs with scratch GFN and continue silently, just remove the pre-checking and abort PPGTT shadowing on error detected. c. GFN validity check is still performed in intel_gvt_dma_map_guest_page() --> gvt_pin_guest_page(). It's more desirable to call VFIO interface to do both validity check and mapping. Calling intel_gvt_is_valid_gfn() to do GFN validity check from KVM side while later mapping the GFN through VFIO interface is unnecessarily fragile and confusing for unaware readers. Signed-off-by: Yan Zhao <yan.y.zhao@intel.com> [sean: remove now-unused local variables] Acked-by: Zhi Wang <zhi.a.wang@intel.com> Tested-by: Yongwei Ma <yongwei.ma@intel.com> Link: https://lore.kernel.org/r/20230729013535.1070024-3-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1 parent f046923 commit 1e557c1

1 file changed

Lines changed: 1 addition & 35 deletions

File tree

  • drivers/gpu/drm/i915/gvt

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

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,6 @@
4949
static bool enable_out_of_sync = false;
5050
static int preallocated_oos_pages = 8192;
5151

52-
static bool intel_gvt_is_valid_gfn(struct intel_vgpu *vgpu, unsigned long gfn)
53-
{
54-
struct kvm *kvm = vgpu->vfio_device.kvm;
55-
int idx;
56-
bool ret;
57-
58-
if (!test_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status))
59-
return false;
60-
61-
idx = srcu_read_lock(&kvm->srcu);
62-
ret = kvm_is_visible_gfn(kvm, gfn);
63-
srcu_read_unlock(&kvm->srcu, idx);
64-
65-
return ret;
66-
}
67-
6852
/*
6953
* validate a gm address and related range size,
7054
* translate it to host gm address
@@ -1333,11 +1317,9 @@ static int ppgtt_populate_shadow_entry(struct intel_vgpu *vgpu,
13331317
static int ppgtt_populate_spt(struct intel_vgpu_ppgtt_spt *spt)
13341318
{
13351319
struct intel_vgpu *vgpu = spt->vgpu;
1336-
struct intel_gvt *gvt = vgpu->gvt;
1337-
const struct intel_gvt_gtt_pte_ops *ops = gvt->gtt.pte_ops;
13381320
struct intel_vgpu_ppgtt_spt *s;
13391321
struct intel_gvt_gtt_entry se, ge;
1340-
unsigned long gfn, i;
1322+
unsigned long i;
13411323
int ret;
13421324

13431325
trace_spt_change(spt->vgpu->id, "born", spt,
@@ -1354,13 +1336,6 @@ static int ppgtt_populate_spt(struct intel_vgpu_ppgtt_spt *spt)
13541336
ppgtt_generate_shadow_entry(&se, s, &ge);
13551337
ppgtt_set_shadow_entry(spt, &se, i);
13561338
} else {
1357-
gfn = ops->get_pfn(&ge);
1358-
if (!intel_gvt_is_valid_gfn(vgpu, gfn)) {
1359-
ops->set_pfn(&se, gvt->gtt.scratch_mfn);
1360-
ppgtt_set_shadow_entry(spt, &se, i);
1361-
continue;
1362-
}
1363-
13641339
ret = ppgtt_populate_shadow_entry(vgpu, spt, i, &ge);
13651340
if (ret)
13661341
goto fail;
@@ -2335,14 +2310,6 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
23352310
m.val64 = e.val64;
23362311
m.type = e.type;
23372312

2338-
/* one PTE update may be issued in multiple writes and the
2339-
* first write may not construct a valid gfn
2340-
*/
2341-
if (!intel_gvt_is_valid_gfn(vgpu, gfn)) {
2342-
ops->set_pfn(&m, gvt->gtt.scratch_mfn);
2343-
goto out;
2344-
}
2345-
23462313
ret = intel_gvt_dma_map_guest_page(vgpu, gfn, PAGE_SIZE,
23472314
&dma_addr);
23482315
if (ret) {
@@ -2359,7 +2326,6 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
23592326
ops->clear_present(&m);
23602327
}
23612328

2362-
out:
23632329
ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
23642330

23652331
ggtt_get_host_entry(ggtt_mm, &e, g_gtt_index);

0 commit comments

Comments
 (0)