2019-08-12 15:09:05 +08:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Min He <min.he@intel.com>
|
|
|
|
Date: Tue, 30 Jul 2019 02:05:10 +0000
|
|
|
|
Subject: [PATCH] drm/i915/gvt: fix the racing condition when vgpu destroy
|
|
|
|
|
|
|
|
When the acrn-dm is killed, there could be possibility that the
|
|
|
|
vGPU is destroyed but there's still workloads running in worker_thread,
|
|
|
|
which leads to a kernel panic. This is because pick_next_workload didn't
|
|
|
|
check if the vGPU is being destroyed.
|
|
|
|
This patch fixed the issue mentioned above, by adding a check when
|
|
|
|
picking next workload.
|
|
|
|
Also, there's a new MPT interface vgpu_release() can help to release
|
|
|
|
unfinished workloads, so we use this interface to replace previous
|
|
|
|
vgpu_deactivate().
|
|
|
|
|
|
|
|
Change-Id: I3aa870ae9d18ac72c225ddf2cea53f12253d3e71
|
|
|
|
Tracked-On: projectacrn/acrn-hypervisor#3530
|
|
|
|
Signed-off-by: Min He <min.he@intel.com>
|
|
|
|
Reviewed-by: Zhao Yakui <yakui.zhao@intel.com>
|
|
|
|
---
|
|
|
|
drivers/gpu/drm/i915/gvt/acrngt.c | 2 +-
|
|
|
|
drivers/gpu/drm/i915/gvt/scheduler.c | 5 +++++
|
|
|
|
2 files changed, 6 insertions(+), 1 deletion(-)
|
|
|
|
|
|
|
|
diff --git a/drivers/gpu/drm/i915/gvt/acrngt.c b/drivers/gpu/drm/i915/gvt/acrngt.c
|
2020-05-05 09:02:46 +08:00
|
|
|
index ff48b15ae..0215fc23b 100644
|
2019-08-12 15:09:05 +08:00
|
|
|
--- a/drivers/gpu/drm/i915/gvt/acrngt.c
|
|
|
|
+++ b/drivers/gpu/drm/i915/gvt/acrngt.c
|
|
|
|
@@ -152,7 +152,7 @@ void acrngt_instance_destroy(struct intel_vgpu *vgpu)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- intel_gvt_ops->vgpu_deactivate(vgpu);
|
|
|
|
+ intel_gvt_ops->vgpu_release(vgpu);
|
|
|
|
intel_gvt_ops->vgpu_destroy(vgpu);
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
|
2020-05-05 09:02:46 +08:00
|
|
|
index c6233fb61..b5aa2cbb2 100644
|
2019-08-12 15:09:05 +08:00
|
|
|
--- a/drivers/gpu/drm/i915/gvt/scheduler.c
|
|
|
|
+++ b/drivers/gpu/drm/i915/gvt/scheduler.c
|
|
|
|
@@ -785,6 +785,11 @@ static struct intel_vgpu_workload *pick_next_workload(
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ if (!scheduler->current_vgpu[ring_id]->active) {
|
|
|
|
+ gvt_dbg_sched("ring id %d stop - vgpu not active\n", ring_id);
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
if (scheduler->need_reschedule[ring_id]) {
|
|
|
|
gvt_dbg_sched("ring id %d stop - will reschedule\n", ring_id);
|
|
|
|
goto out;
|
|
|
|
--
|
|
|
|
https://clearlinux.org
|
|
|
|
|