drm/i915: Avoid circular locking from intel_fbdev_fini()
lockdep spots that the fb_info->lock takes the dev->struct_mutex during init (due to the device probing) and so we can not hold dev->struct_mutex when unregistering the framebuffer. Simply reverse the order of initialisation during cleanup and so do the intel_fbdev_fini() before the intel_modeset_cleanup. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
2c6be94411
commit
7b4f3990a2
|
@ -2106,6 +2106,7 @@ int i915_driver_unload(struct drm_device *dev)
|
|||
acpi_video_unregister();
|
||||
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
||||
intel_fbdev_fini(dev);
|
||||
intel_modeset_cleanup(dev);
|
||||
|
||||
/*
|
||||
|
|
|
@ -6130,8 +6130,6 @@ void intel_modeset_cleanup(struct drm_device *dev)
|
|||
drm_kms_helper_poll_fini(dev);
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
|
||||
intel_fbdev_fini(dev);
|
||||
|
||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||
/* Skip inactive CRTCs */
|
||||
if (!crtc->fb)
|
||||
|
|
|
@ -206,8 +206,8 @@ static struct drm_fb_helper_funcs intel_fb_helper_funcs = {
|
|||
.fb_probe = intel_fb_find_or_create_single,
|
||||
};
|
||||
|
||||
static int intel_fbdev_destroy(struct drm_device *dev,
|
||||
struct intel_fbdev *ifbdev)
|
||||
static void intel_fbdev_destroy(struct drm_device *dev,
|
||||
struct intel_fbdev *ifbdev)
|
||||
{
|
||||
struct fb_info *info;
|
||||
struct intel_framebuffer *ifb = &ifbdev->ifb;
|
||||
|
@ -225,9 +225,7 @@ static int intel_fbdev_destroy(struct drm_device *dev,
|
|||
|
||||
drm_framebuffer_cleanup(&ifb->base);
|
||||
if (ifb->obj)
|
||||
drm_gem_object_unreference(ifb->obj);
|
||||
|
||||
return 0;
|
||||
drm_gem_object_unreference_unlocked(ifb->obj);
|
||||
}
|
||||
|
||||
int intel_fbdev_init(struct drm_device *dev)
|
||||
|
|
Loading…
Reference in a new issue