Skip to content

Commit 7598e87

Browse files
Changbin Duzhenyw
authored andcommitted
drm/i915/gvt: Missed to cancel dma map for ggtt entries
We have canceled dma map for ppgtt entries. Also we need to do it for ggtt entries when them are invalidated. This can fix task hung issue as: [13517.791767] INFO: task gvt_service_thr:1081 blocked for more than 120 seconds. [13517.792584] Not tainted 4.14.15+ #3 [13517.793417] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [13517.794267] gvt_service_thr D 0 1081 2 0x80000000 [13517.795132] Call Trace: [13517.795996] ? __schedule+0x493/0x77b [13517.796859] schedule+0x79/0x82 [13517.797740] schedule_preempt_disabled+0x5/0x6 [13517.798614] __mutex_lock.isra.0+0x2b5/0x445 [13517.799504] ? __switch_to_asm+0x24/0x60 [13517.800381] ? intel_gvt_cleanup+0x10/0x10 [13517.801261] ? intel_gvt_schedule+0x19/0x2b9 [13517.802107] intel_gvt_schedule+0x19/0x2b9 [13517.802954] ? intel_gvt_cleanup+0x10/0x10 [13517.803824] gvt_service_thread+0xe3/0x10d [13517.804704] ? wait_woken+0x68/0x68 [13517.805588] kthread+0x118/0x120 [13517.806478] ? kthread_create_on_node+0x3a/0x3a [13517.807381] ? call_usermodehelper_exec_async+0x113/0x11a [13517.808307] ret_from_fork+0x35/0x40 v3: split out ggtt reset case. v2: also unmap ggtt during reset. Signed-off-by: Changbin Du <changbin.du@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
1 parent 5da795b commit 7598e87

File tree

1 file changed

+28
-2
lines changed
  • drivers/gpu/drm/i915/gvt

1 file changed

+28
-2
lines changed

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

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,16 @@ static void ggtt_set_guest_entry(struct intel_vgpu_mm *mm,
530530
false, 0, mm->vgpu);
531531
}
532532

533+
static void ggtt_get_host_entry(struct intel_vgpu_mm *mm,
534+
struct intel_gvt_gtt_entry *entry, unsigned long index)
535+
{
536+
struct intel_gvt_gtt_pte_ops *pte_ops = mm->vgpu->gvt->gtt.pte_ops;
537+
538+
GEM_BUG_ON(mm->type != INTEL_GVT_MM_GGTT);
539+
540+
pte_ops->get_entry(NULL, entry, index, false, 0, mm->vgpu);
541+
}
542+
533543
static void ggtt_set_host_entry(struct intel_vgpu_mm *mm,
534544
struct intel_gvt_gtt_entry *entry, unsigned long index)
535545
{
@@ -1818,6 +1828,18 @@ int intel_vgpu_emulate_ggtt_mmio_read(struct intel_vgpu *vgpu, unsigned int off,
18181828
return ret;
18191829
}
18201830

1831+
static void ggtt_invalidate_pte(struct intel_vgpu *vgpu,
1832+
struct intel_gvt_gtt_entry *entry)
1833+
{
1834+
struct intel_gvt_gtt_pte_ops *pte_ops = vgpu->gvt->gtt.pte_ops;
1835+
unsigned long pfn;
1836+
1837+
pfn = pte_ops->get_pfn(entry);
1838+
if (pfn != vgpu->gvt->gtt.scratch_mfn)
1839+
intel_gvt_hypervisor_dma_unmap_guest_page(vgpu,
1840+
pfn << PAGE_SHIFT);
1841+
}
1842+
18211843
static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
18221844
void *p_data, unsigned int bytes)
18231845
{
@@ -1844,10 +1866,10 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
18441866

18451867
memcpy((void *)&e.val64 + (off & (info->gtt_entry_size - 1)), p_data,
18461868
bytes);
1847-
m = e;
18481869

18491870
if (ops->test_present(&e)) {
18501871
gfn = ops->get_pfn(&e);
1872+
m = e;
18511873

18521874
/* one PTE update may be issued in multiple writes and the
18531875
* first write may not construct a valid gfn
@@ -1868,8 +1890,12 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
18681890
ops->set_pfn(&m, gvt->gtt.scratch_mfn);
18691891
} else
18701892
ops->set_pfn(&m, dma_addr >> PAGE_SHIFT);
1871-
} else
1893+
} else {
1894+
ggtt_get_host_entry(ggtt_mm, &m, g_gtt_index);
1895+
ggtt_invalidate_pte(vgpu, &m);
18721896
ops->set_pfn(&m, gvt->gtt.scratch_mfn);
1897+
ops->clear_present(&m);
1898+
}
18731899

18741900
out:
18751901
ggtt_set_host_entry(ggtt_mm, &m, g_gtt_index);

0 commit comments

Comments
 (0)