[PATCH] drm/i915/gvt: correct cleanup sequence in intel_gvt_clean_device
Hang Yuan
hang.yuan at linux.intel.com
Wed Jul 18 08:15:18 UTC 2018
On 07/16/2018 01:10 PM, Zhenyu Wang wrote:
>
> On 2018.07.12 19:12:06 +0800, intel-gvt-dev-bounces at lists.freedesktop.org wrote:
>> From: Hang Yuan <hang.yuan at linux.intel.com>
>>
>> Free vgpu resource first and then gvt resource to fix oops like below
>> during unbinding Intel gfx device.
>>
>
> Is this new regression or apply for upstream driver as well? We need a Fixes
> tag on this anyway, and cc stable?
Henry: It is not a regression. It's a bug reported from RH and
reproduced on upstream driver as well. I will send an update with stable
cc'ed.
>
>> BUG: unable to handle kernel NULL pointer dereference at 00000000000000a8
>> PGD 80000003c9d2c067 P4D 80000003c9d2c067 PUD 3c817c067 P MD 0
>> Oops: 0002 [#1] SMP PTI
>> RIP: 0010:down_write+0x1b/0x40
>> Call Trace:
>> debugfs_remove_recursive+0x46/0x1a0
>> intel_gvt_debugfs_remove_vgpu+0x15/0x30 [i915]
>> intel_gvt_destroy_vgpu+0x2d/0xf0 [i915]
>> intel_vgpu_remove+0x2c/0x30 [kvmgt]
>> mdev_device_remove_ops+0x23/0x50 [mdev]
>> mdev_device_remove+0xdb/0x190 [mdev]
>> mdev_device_remove+0x190/0x190 [mdev]
>> device_for_each_child+0x47/0x90
>> mdev_unregister_device+0xd5/0x120 [mdev]
>> intel_gvt_clean_device+0x91/0x120 [i915]
>> i915_driver_unload+0x9d/0x120 [i915]
>> i915_pci_remove+0x15/0x20 [i915]
>> pci_device_remove+0x3b/0xc0
>> device_release_driver_internal+0x157/0x230
>> unbind_store+0xfc/0x150
>> kernfs_fop_write+0x10f/0x180
>> __vfs_write+0x36/0x180
>> ? common_file_perm+0x41/0x130
>> ? _cond_resched+0x16/0x40
>> vfs_write+0xb3/0x1a0
>> ksys_write+0x52/0xc0
>> do_syscall_64+0x55/0x100
>> entry_SYSCALL_64_after_hwframe+0x44/0xa9
>>
>> BUG: unable to handle kernel NULL pointer dereference at 0 000000000000038
>> PGD 8000000405bce067 P4D 8000000405bce067 PUD 405bcd067 PM D 0
>> Oops: 0000 [#1] SMP PTI
>> RIP: 0010:hrtimer_active+0x5/0x40
>> Call Trace:
>> hrtimer_try_to_cancel+0x25/0x120
>> ? tbs_sched_clean_vgpu+0x1f/0x50 [i915]
>> hrtimer_cancel+0x15/0x20
>> intel_gvt_destroy_vgpu+0x4c/0xf0 [i915]
>> intel_vgpu_remove+0x2c/0x30 [kvmgt]
>> mdev_device_remove_ops+0x23/0x50 [mdev]
>> mdev_device_remove+0xdb/0x190 [mdev]
>> ? mdev_device_remove+0x190/0x190 [mdev]
>> device_for_each_child+0x47/0x90
>> mdev_unregister_device+0xd5/0x120 [mdev]
>> intel_gvt_clean_device+0x89/0x120 [i915]
>> i915_driver_unload+0x9d/0x120 [i915]
>> i915_pci_remove+0x15/0x20 [i915]
>> pci_device_remove+0x3b/0xc0
>> device_release_driver_internal+0x157/0x230
>> unbind_store+0xfc/0x150
>> kernfs_fop_write+0x10f/0x180
>> __vfs_write+0x36/0x180
>> ? common_file_perm+0x41/0x130
>> ? _cond_resched+0x16/0x40
>> vfs_write+0xb3/0x1a0
>> ksys_write+0x52/0xc0
>> do_syscall_64+0x55/0x100
>> entry_SYSCALL_64_after_hwframe+0x44/0xa9
>>
>> Signed-off-by: Hang Yuan <hang.yuan at linux.intel.com>
>> ---
>> drivers/gpu/drm/i915/gvt/gvt.c | 14 ++++++--------
>> 1 file changed, 6 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/gvt/gvt.c b/drivers/gpu/drm/i915/gvt/gvt.c
>> index 4e65266..b96c6c7 100644
>> --- a/drivers/gpu/drm/i915/gvt/gvt.c
>> +++ b/drivers/gpu/drm/i915/gvt/gvt.c
>> @@ -315,6 +315,11 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)
>> if (WARN_ON(!gvt))
>> return;
>>
>> + intel_gvt_destroy_idle_vgpu(gvt->idle_vgpu);
>> + intel_gvt_hypervisor_host_exit(&dev_priv->drm.pdev->dev, gvt);
>> + intel_gvt_cleanup_vgpu_type_groups(gvt);
>> + intel_gvt_clean_vgpu_types(gvt);
>> +
>> intel_gvt_debugfs_clean(gvt);
>> clean_service_thread(gvt);
>> intel_gvt_clean_cmd_parser(gvt);
>> @@ -322,17 +327,10 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv)
>> intel_gvt_clean_workload_scheduler(gvt);
>> intel_gvt_clean_gtt(gvt);
>> intel_gvt_clean_irq(gvt);
>> - intel_gvt_clean_mmio_info(gvt);
>> intel_gvt_free_firmware(gvt);
>> -
>> - intel_gvt_hypervisor_host_exit(&dev_priv->drm.pdev->dev, gvt);
>> - intel_gvt_cleanup_vgpu_type_groups(gvt);
>> - intel_gvt_clean_vgpu_types(gvt);
>> -
>> + intel_gvt_clean_mmio_info(gvt);
>> idr_destroy(&gvt->vgpu_idr);
>>
>> - intel_gvt_destroy_idle_vgpu(gvt->idle_vgpu);
>> -
>> kfree(dev_priv->gvt);
>> dev_priv->gvt = NULL;
>> }
>> --
>> 2.7.4
>>
>> _______________________________________________
>> intel-gvt-dev mailing list
>> intel-gvt-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
>
More information about the intel-gvt-dev
mailing list