mirror of
https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
synced 2025-09-17 18:16:22 +10:00
Revert "drm/vkms: Fix race-condition between the hrtimer and the atomic commit"
This reverts commit a0e6a017ab
.
Unlocking a mutex in the context of a hrtimer callback is violating mutex
locking rules, as mutex_unlock() from interrupt context is not permitted.
Link: https://lore.kernel.org/dri-devel/ZQLAc%2FFwkv%2FGiVoK@phenom.ffwll.local/T/#t
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Maíra Canal <mcanal@igalia.com>
Signed-off-by: Maíra Canal <mairacanal@riseup.net>
Link: https://patchwork.freedesktop.org/patch/msgid/20230914102024.1789154-1-mcanal@igalia.com
This commit is contained in:
parent
c900529f3d
commit
7908632f29
@ -408,15 +408,10 @@ void vkms_set_composer(struct vkms_output *out, bool enabled)
|
|||||||
if (enabled)
|
if (enabled)
|
||||||
drm_crtc_vblank_get(&out->crtc);
|
drm_crtc_vblank_get(&out->crtc);
|
||||||
|
|
||||||
mutex_lock(&out->enabled_lock);
|
spin_lock_irq(&out->lock);
|
||||||
old_enabled = out->composer_enabled;
|
old_enabled = out->composer_enabled;
|
||||||
out->composer_enabled = enabled;
|
out->composer_enabled = enabled;
|
||||||
|
spin_unlock_irq(&out->lock);
|
||||||
/* the composition wasn't enabled, so unlock the lock to make sure the lock
|
|
||||||
* will be balanced even if we have a failed commit
|
|
||||||
*/
|
|
||||||
if (!out->composer_enabled)
|
|
||||||
mutex_unlock(&out->enabled_lock);
|
|
||||||
|
|
||||||
if (old_enabled)
|
if (old_enabled)
|
||||||
drm_crtc_vblank_put(&out->crtc);
|
drm_crtc_vblank_put(&out->crtc);
|
||||||
|
@ -16,7 +16,7 @@ static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)
|
|||||||
struct drm_crtc *crtc = &output->crtc;
|
struct drm_crtc *crtc = &output->crtc;
|
||||||
struct vkms_crtc_state *state;
|
struct vkms_crtc_state *state;
|
||||||
u64 ret_overrun;
|
u64 ret_overrun;
|
||||||
bool ret, fence_cookie, composer_enabled;
|
bool ret, fence_cookie;
|
||||||
|
|
||||||
fence_cookie = dma_fence_begin_signalling();
|
fence_cookie = dma_fence_begin_signalling();
|
||||||
|
|
||||||
@ -25,15 +25,15 @@ static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)
|
|||||||
if (ret_overrun != 1)
|
if (ret_overrun != 1)
|
||||||
pr_warn("%s: vblank timer overrun\n", __func__);
|
pr_warn("%s: vblank timer overrun\n", __func__);
|
||||||
|
|
||||||
|
spin_lock(&output->lock);
|
||||||
ret = drm_crtc_handle_vblank(crtc);
|
ret = drm_crtc_handle_vblank(crtc);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
DRM_ERROR("vkms failure on handling vblank");
|
DRM_ERROR("vkms failure on handling vblank");
|
||||||
|
|
||||||
state = output->composer_state;
|
state = output->composer_state;
|
||||||
composer_enabled = output->composer_enabled;
|
spin_unlock(&output->lock);
|
||||||
mutex_unlock(&output->enabled_lock);
|
|
||||||
|
|
||||||
if (state && composer_enabled) {
|
if (state && output->composer_enabled) {
|
||||||
u64 frame = drm_crtc_accurate_vblank_count(crtc);
|
u64 frame = drm_crtc_accurate_vblank_count(crtc);
|
||||||
|
|
||||||
/* update frame_start only if a queued vkms_composer_worker()
|
/* update frame_start only if a queued vkms_composer_worker()
|
||||||
@ -295,7 +295,6 @@ int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
|
|||||||
|
|
||||||
spin_lock_init(&vkms_out->lock);
|
spin_lock_init(&vkms_out->lock);
|
||||||
spin_lock_init(&vkms_out->composer_lock);
|
spin_lock_init(&vkms_out->composer_lock);
|
||||||
mutex_init(&vkms_out->enabled_lock);
|
|
||||||
|
|
||||||
vkms_out->composer_workq = alloc_ordered_workqueue("vkms_composer", 0);
|
vkms_out->composer_workq = alloc_ordered_workqueue("vkms_composer", 0);
|
||||||
if (!vkms_out->composer_workq)
|
if (!vkms_out->composer_workq)
|
||||||
|
@ -108,10 +108,8 @@ struct vkms_output {
|
|||||||
struct workqueue_struct *composer_workq;
|
struct workqueue_struct *composer_workq;
|
||||||
/* protects concurrent access to composer */
|
/* protects concurrent access to composer */
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
/* guarantees that if the composer is enabled, a job will be queued */
|
|
||||||
struct mutex enabled_lock;
|
|
||||||
|
|
||||||
/* protected by @enabled_lock */
|
/* protected by @lock */
|
||||||
bool composer_enabled;
|
bool composer_enabled;
|
||||||
struct vkms_crtc_state *composer_state;
|
struct vkms_crtc_state *composer_state;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user