From: Greg Kroah-Hartman Date: Mon, 28 Jun 2021 13:09:05 +0000 (+0200) Subject: 5.10-stable patches X-Git-Tag: v5.12.14~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=39067c630be73a1c537299fd28eb5a6016969101;p=thirdparty%2Fkernel%2Fstable-queue.git 5.10-stable patches added patches: revert-drm-add-a-locked-version-of-drm_is_current_master.patch --- diff --git a/queue-5.10/revert-drm-add-a-locked-version-of-drm_is_current_master.patch b/queue-5.10/revert-drm-add-a-locked-version-of-drm_is_current_master.patch new file mode 100644 index 00000000000..6f1b73d1e42 --- /dev/null +++ b/queue-5.10/revert-drm-add-a-locked-version-of-drm_is_current_master.patch @@ -0,0 +1,166 @@ +From f54b3ca7ea1e5e02f481cf4ca54568e57bd66086 Mon Sep 17 00:00:00 2001 +From: Daniel Vetter +Date: Tue, 22 Jun 2021 09:54:09 +0200 +Subject: Revert "drm: add a locked version of drm_is_current_master" + +From: Daniel Vetter + +commit f54b3ca7ea1e5e02f481cf4ca54568e57bd66086 upstream. + +This reverts commit 1815d9c86e3090477fbde066ff314a7e9721ee0f. + +Unfortunately this inverts the locking hierarchy, so back to the +drawing board. Full lockdep splat below: + +====================================================== +WARNING: possible circular locking dependency detected +5.13.0-rc7-CI-CI_DRM_10254+ #1 Not tainted +------------------------------------------------------ +kms_frontbuffer/1087 is trying to acquire lock: +ffff88810dcd01a8 (&dev->master_mutex){+.+.}-{3:3}, at: drm_is_current_master+0x1b/0x40 +but task is already holding lock: +ffff88810dcd0488 (&dev->mode_config.mutex){+.+.}-{3:3}, at: drm_mode_getconnector+0x1c6/0x4a0 +which lock already depends on the new lock. +the existing dependency chain (in reverse order) is: +-> #2 (&dev->mode_config.mutex){+.+.}-{3:3}: + __mutex_lock+0xab/0x970 + drm_client_modeset_probe+0x22e/0xca0 + __drm_fb_helper_initial_config_and_unlock+0x42/0x540 + intel_fbdev_initial_config+0xf/0x20 [i915] + async_run_entry_fn+0x28/0x130 + process_one_work+0x26d/0x5c0 + worker_thread+0x37/0x380 + kthread+0x144/0x170 + ret_from_fork+0x1f/0x30 +-> #1 (&client->modeset_mutex){+.+.}-{3:3}: + __mutex_lock+0xab/0x970 + drm_client_modeset_commit_locked+0x1c/0x180 + drm_client_modeset_commit+0x1c/0x40 + __drm_fb_helper_restore_fbdev_mode_unlocked+0x88/0xb0 + drm_fb_helper_set_par+0x34/0x40 + intel_fbdev_set_par+0x11/0x40 [i915] + fbcon_init+0x270/0x4f0 + visual_init+0xc6/0x130 + do_bind_con_driver+0x1e5/0x2d0 + do_take_over_console+0x10e/0x180 + do_fbcon_takeover+0x53/0xb0 + register_framebuffer+0x22d/0x310 + __drm_fb_helper_initial_config_and_unlock+0x36c/0x540 + intel_fbdev_initial_config+0xf/0x20 [i915] + async_run_entry_fn+0x28/0x130 + process_one_work+0x26d/0x5c0 + worker_thread+0x37/0x380 + kthread+0x144/0x170 + ret_from_fork+0x1f/0x30 +-> #0 (&dev->master_mutex){+.+.}-{3:3}: + __lock_acquire+0x151e/0x2590 + lock_acquire+0xd1/0x3d0 + __mutex_lock+0xab/0x970 + drm_is_current_master+0x1b/0x40 + drm_mode_getconnector+0x37e/0x4a0 + drm_ioctl_kernel+0xa8/0xf0 + drm_ioctl+0x1e8/0x390 + __x64_sys_ioctl+0x6a/0xa0 + do_syscall_64+0x39/0xb0 + entry_SYSCALL_64_after_hwframe+0x44/0xae +other info that might help us debug this: +Chain exists of: &dev->master_mutex --> &client->modeset_mutex --> &dev->mode_config.mutex + Possible unsafe locking scenario: + CPU0 CPU1 + ---- ---- + lock(&dev->mode_config.mutex); + lock(&client->modeset_mutex); + lock(&dev->mode_config.mutex); + lock(&dev->master_mutex); +--- + drivers/gpu/drm/drm_auth.c | 51 ++++++++++++++++----------------------------- + 1 file changed, 19 insertions(+), 32 deletions(-) + +--- a/drivers/gpu/drm/drm_auth.c ++++ b/drivers/gpu/drm/drm_auth.c +@@ -61,35 +61,6 @@ + * trusted clients. + */ + +-static bool drm_is_current_master_locked(struct drm_file *fpriv) +-{ +- lockdep_assert_held_once(&fpriv->master->dev->master_mutex); +- +- return fpriv->is_master && drm_lease_owner(fpriv->master) == fpriv->minor->dev->master; +-} +- +-/** +- * drm_is_current_master - checks whether @priv is the current master +- * @fpriv: DRM file private +- * +- * Checks whether @fpriv is current master on its device. This decides whether a +- * client is allowed to run DRM_MASTER IOCTLs. +- * +- * Most of the modern IOCTL which require DRM_MASTER are for kernel modesetting +- * - the current master is assumed to own the non-shareable display hardware. +- */ +-bool drm_is_current_master(struct drm_file *fpriv) +-{ +- bool ret; +- +- mutex_lock(&fpriv->master->dev->master_mutex); +- ret = drm_is_current_master_locked(fpriv); +- mutex_unlock(&fpriv->master->dev->master_mutex); +- +- return ret; +-} +-EXPORT_SYMBOL(drm_is_current_master); +- + int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv) + { + struct drm_auth *auth = data; +@@ -252,7 +223,7 @@ int drm_setmaster_ioctl(struct drm_devic + if (ret) + goto out_unlock; + +- if (drm_is_current_master_locked(file_priv)) ++ if (drm_is_current_master(file_priv)) + goto out_unlock; + + if (dev->master) { +@@ -301,7 +272,7 @@ int drm_dropmaster_ioctl(struct drm_devi + if (ret) + goto out_unlock; + +- if (!drm_is_current_master_locked(file_priv)) { ++ if (!drm_is_current_master(file_priv)) { + ret = -EINVAL; + goto out_unlock; + } +@@ -350,7 +321,7 @@ void drm_master_release(struct drm_file + if (file_priv->magic) + idr_remove(&file_priv->master->magic_map, file_priv->magic); + +- if (!drm_is_current_master_locked(file_priv)) ++ if (!drm_is_current_master(file_priv)) + goto out; + + drm_legacy_lock_master_cleanup(dev, master); +@@ -372,6 +343,22 @@ out: + } + + /** ++ * drm_is_current_master - checks whether @priv is the current master ++ * @fpriv: DRM file private ++ * ++ * Checks whether @fpriv is current master on its device. This decides whether a ++ * client is allowed to run DRM_MASTER IOCTLs. ++ * ++ * Most of the modern IOCTL which require DRM_MASTER are for kernel modesetting ++ * - the current master is assumed to own the non-shareable display hardware. ++ */ ++bool drm_is_current_master(struct drm_file *fpriv) ++{ ++ return fpriv->is_master && drm_lease_owner(fpriv->master) == fpriv->minor->dev->master; ++} ++EXPORT_SYMBOL(drm_is_current_master); ++ ++/** + * drm_master_get - reference a master pointer + * @master: &struct drm_master + * diff --git a/queue-5.10/series b/queue-5.10/series index 867e8ec7a9c..0b328bce239 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -93,3 +93,4 @@ mm-futex-fix-shared-futex-pgoff-on-shmem-huge-page.patch kvm-svm-call-sev-guest-decommission-if-asid-binding-fails.patch swiotlb-manipulate-orig_addr-when-tlb_addr-has-offset.patch netfs-fix-test-for-whether-we-can-skip-read-when-writing-beyond-eof.patch +revert-drm-add-a-locked-version-of-drm_is_current_master.patch