Commit c3c9acb8 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-fixes-2023-09-14' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

Short summary of fixes pull:

 * radeon: Uninterruptible fence waiting
 * tests: Fix use-after-free bug
 * vkms: Revert hrtimer fix
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20230914122649.GA28252@linux-uq9g
parents c6fbd2b0 139a2785
...@@ -123,7 +123,7 @@ int radeon_sa_bo_new(struct radeon_sa_manager *sa_manager, ...@@ -123,7 +123,7 @@ int radeon_sa_bo_new(struct radeon_sa_manager *sa_manager,
unsigned int size, unsigned int align) unsigned int size, unsigned int align)
{ {
struct drm_suballoc *sa = drm_suballoc_new(&sa_manager->base, size, struct drm_suballoc *sa = drm_suballoc_new(&sa_manager->base, size,
GFP_KERNEL, true, align); GFP_KERNEL, false, align);
if (IS_ERR(sa)) { if (IS_ERR(sa)) {
*sa_bo = NULL; *sa_bo = NULL;
......
...@@ -408,15 +408,10 @@ void vkms_set_composer(struct vkms_output *out, bool enabled) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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 { ...@@ -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;
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
#ifndef DRM_KUNIT_HELPERS_H_ #ifndef DRM_KUNIT_HELPERS_H_
#define DRM_KUNIT_HELPERS_H_ #define DRM_KUNIT_HELPERS_H_
#include <linux/device.h>
#include <kunit/test.h> #include <kunit/test.h>
struct drm_device; struct drm_device;
...@@ -51,7 +53,7 @@ __drm_kunit_helper_alloc_drm_device(struct kunit *test, ...@@ -51,7 +53,7 @@ __drm_kunit_helper_alloc_drm_device(struct kunit *test,
{ {
struct drm_driver *driver; struct drm_driver *driver;
driver = kunit_kzalloc(test, sizeof(*driver), GFP_KERNEL); driver = devm_kzalloc(dev, sizeof(*driver), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, driver); KUNIT_ASSERT_NOT_NULL(test, driver);
driver->driver_features = features; driver->driver_features = features;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment