Skip to content

Commit

Permalink
Revert "drm/vkms: Fix race-condition between the hrtimer and the atom…
Browse files Browse the repository at this point in the history
…ic commit"

This reverts commit a0e6a01.

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%[email protected]/T/#t
Acked-by: Daniel Vetter <[email protected]>
Signed-off-by: Maíra Canal <[email protected]>
Signed-off-by: Maíra Canal <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
  • Loading branch information
mairacanal committed Sep 14, 2023
1 parent c900529 commit 7908632
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 15 deletions.
9 changes: 2 additions & 7 deletions drivers/gpu/drm/vkms/vkms_composer.c
Original file line number Diff line number Diff line change
Expand Up @@ -408,15 +408,10 @@ void vkms_set_composer(struct vkms_output *out, bool enabled)
if (enabled)
drm_crtc_vblank_get(&out->crtc);

mutex_lock(&out->enabled_lock);
spin_lock_irq(&out->lock);
old_enabled = out->composer_enabled;
out->composer_enabled = enabled;

/* 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);
spin_unlock_irq(&out->lock);

if (old_enabled)
drm_crtc_vblank_put(&out->crtc);
Expand Down
9 changes: 4 additions & 5 deletions drivers/gpu/drm/vkms/vkms_crtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)
struct drm_crtc *crtc = &output->crtc;
struct vkms_crtc_state *state;
u64 ret_overrun;
bool ret, fence_cookie, composer_enabled;
bool ret, fence_cookie;

fence_cookie = dma_fence_begin_signalling();

Expand All @@ -25,15 +25,15 @@ static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)
if (ret_overrun != 1)
pr_warn("%s: vblank timer overrun\n", __func__);

spin_lock(&output->lock);
ret = drm_crtc_handle_vblank(crtc);
if (!ret)
DRM_ERROR("vkms failure on handling vblank");

state = output->composer_state;
composer_enabled = output->composer_enabled;
mutex_unlock(&output->enabled_lock);
spin_unlock(&output->lock);

if (state && composer_enabled) {
if (state && output->composer_enabled) {
u64 frame = drm_crtc_accurate_vblank_count(crtc);

/* update frame_start only if a queued vkms_composer_worker()
Expand Down Expand Up @@ -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->composer_lock);
mutex_init(&vkms_out->enabled_lock);

vkms_out->composer_workq = alloc_ordered_workqueue("vkms_composer", 0);
if (!vkms_out->composer_workq)
Expand Down
4 changes: 1 addition & 3 deletions drivers/gpu/drm/vkms/vkms_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,8 @@ struct vkms_output {
struct workqueue_struct *composer_workq;
/* protects concurrent access to composer */
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;
struct vkms_crtc_state *composer_state;

Expand Down

0 comments on commit 7908632

Please sign in to comment.