drm/i915/gvt: stop scheduling workload when vgpu is inactive
authorWeinan Li <weinan.z.li@intel.com>
Wed, 27 Feb 2019 07:36:58 +0000 (15:36 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Fri, 1 Mar 2019 07:51:39 +0000 (15:51 +0800)
commit9f4984773240cf004cbffb99316af3269bbb5e26
treefe0054eecff03f7f174377f0a7ed808e382ed23e
parent1e8b15a1988ed3c7429402017d589422628cdf47
drm/i915/gvt: stop scheduling workload when vgpu is inactive

There is one corner case that workload_thread may pick and dispatch one
workload of vgpu after it's already deactivated. Below is the scenario:

1. deactive_vgpu got the vgpu_lock, it found pending workload was
submitted, then it released the vgpu_lock and wait for vgpu idle.
2. before deactive_vgpu got the vgpu_lock back, workload_thread might pick
one new valid workload, then it was blocked by the vgpu_lock.
3. deactive_vgpu got the vgpu_lock again, finished the last processes of
deactivating, then release the vgpu_lock.
4. workload_thread got the vgpu_lock, then it will try to dispatch the
fetched workload. It's not expected one workload of deactivated vgpu is
dispatched.

The solution is to add condition check of the vgpu's active flag and stop
to schedule when it's inactive.

Reviewed-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Signed-off-by: Weinan Li <weinan.z.li@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
drivers/gpu/drm/i915/gvt/scheduler.c