Commit f43aa31f authored by fred gao's avatar fred gao Committed by Zhenyu Wang

drm/i915/gvt: Fix the vblank timer close issue after shutdown VMs in reverse

Once the Windows guest is shutdown, the display pipe will be disabled
and intel_gvt_check_vblank_emulation will be called to check if the
vblank timer is turned off. Given the scenario of creating VM1 ,VM2,
destoying VM2 in current code, VM1 has pipe enabled and continues to
check VM2, the flag have_enabled_pipe is always false since all the VM2
pipes are disabled, so the vblank timer will be canceled and TDR happens
in Windows VM1 guest due to the vsync timeout.

In this patch the vblank timer will be never canceled once one pipe is
enabled.

v2:
- remove have_enabled_pipe flag and check pipe enabled directly. (Zhenyu)

Cc: Wang Hongbo <hongbo.wang@intel.com>
Signed-off-by: default avatarfred gao <fred.gao@intel.com>
Signed-off-by: default avatarZhenyu Wang <zhenyuw@linux.intel.com>
parent 0cf5ec41
...@@ -323,27 +323,27 @@ void intel_gvt_check_vblank_emulation(struct intel_gvt *gvt) ...@@ -323,27 +323,27 @@ void intel_gvt_check_vblank_emulation(struct intel_gvt *gvt)
{ {
struct intel_gvt_irq *irq = &gvt->irq; struct intel_gvt_irq *irq = &gvt->irq;
struct intel_vgpu *vgpu; struct intel_vgpu *vgpu;
bool have_enabled_pipe = false;
int pipe, id; int pipe, id;
if (WARN_ON(!mutex_is_locked(&gvt->lock))) if (WARN_ON(!mutex_is_locked(&gvt->lock)))
return; return;
hrtimer_cancel(&irq->vblank_timer.timer);
for_each_active_vgpu(gvt, vgpu, id) { for_each_active_vgpu(gvt, vgpu, id) {
for (pipe = 0; pipe < I915_MAX_PIPES; pipe++) { for (pipe = 0; pipe < I915_MAX_PIPES; pipe++) {
have_enabled_pipe = if (pipe_is_enabled(vgpu, pipe))
pipe_is_enabled(vgpu, pipe); goto out;
if (have_enabled_pipe)
break;
} }
} }
if (have_enabled_pipe) /* all the pipes are disabled */
hrtimer_cancel(&irq->vblank_timer.timer);
return;
out:
hrtimer_start(&irq->vblank_timer.timer, hrtimer_start(&irq->vblank_timer.timer,
ktime_add_ns(ktime_get(), irq->vblank_timer.period), ktime_add_ns(ktime_get(), irq->vblank_timer.period),
HRTIMER_MODE_ABS); HRTIMER_MODE_ABS);
} }
static void emulate_vblank_on_pipe(struct intel_vgpu *vgpu, int pipe) static void emulate_vblank_on_pipe(struct intel_vgpu *vgpu, int pipe)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment