Commit 0427f06a authored by Du, Changbin's avatar Du, Changbin Committed by Zhenyu Wang

drm/i915/gvt: fix crash in vgpu_reset_execlist

We initiate vgpu->workload_q_head via for_each_engine
macro which may skip unavailable engines. So we should
follow this rule anywhere. The function
intel_vgpu_reset_execlist is not aware of this. Kernel
crash when touch a uninitiated vgpu->workload_q_head[x].
Let's fix it by using for_each_engine_masked and skip
unavailable engine ID. Meanwhile rename ring_bitmap to
general name engine_mask.

v2: remove unnecessary engine activation check (zhenyu)
Signed-off-by: default avatarDu, Changbin <changbin.du@intel.com>
Signed-off-by: default avatarZhenyu Wang <zhenyuw@linux.intel.com>
parent 4f3f1aed
...@@ -838,23 +838,21 @@ int intel_vgpu_init_execlist(struct intel_vgpu *vgpu) ...@@ -838,23 +838,21 @@ int intel_vgpu_init_execlist(struct intel_vgpu *vgpu)
} }
void intel_vgpu_reset_execlist(struct intel_vgpu *vgpu, void intel_vgpu_reset_execlist(struct intel_vgpu *vgpu,
unsigned long ring_bitmap) unsigned long engine_mask)
{ {
int bit; struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
struct list_head *pos, *n; struct intel_engine_cs *engine;
struct intel_vgpu_workload *workload = NULL; struct intel_vgpu_workload *pos, *n;
unsigned int tmp;
for_each_set_bit(bit, &ring_bitmap, sizeof(ring_bitmap) * 8) { for_each_engine_masked(engine, dev_priv, engine_mask, tmp) {
if (bit >= I915_NUM_ENGINES)
break;
/* free the unsubmited workload in the queue */ /* free the unsubmited workload in the queue */
list_for_each_safe(pos, n, &vgpu->workload_q_head[bit]) { list_for_each_entry_safe(pos, n,
workload = container_of(pos, &vgpu->workload_q_head[engine->id], list) {
struct intel_vgpu_workload, list); list_del_init(&pos->list);
list_del_init(&workload->list); free_workload(pos);
free_workload(workload);
} }
init_vgpu_execlist(vgpu, bit); init_vgpu_execlist(vgpu, engine->id);
} }
} }
...@@ -183,6 +183,6 @@ int intel_vgpu_init_execlist(struct intel_vgpu *vgpu); ...@@ -183,6 +183,6 @@ int intel_vgpu_init_execlist(struct intel_vgpu *vgpu);
int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id); int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id);
void intel_vgpu_reset_execlist(struct intel_vgpu *vgpu, void intel_vgpu_reset_execlist(struct intel_vgpu *vgpu,
unsigned long ring_bitmap); unsigned long engine_mask);
#endif /*_GVT_EXECLIST_H_*/ #endif /*_GVT_EXECLIST_H_*/
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