Просмотр исходного кода

drm/armada: use xchg() to atomically update dplane->old_fb

Rather than using a spinlock, use xchg() to atomically update
dplane->old_fb.  This allows us to eliminate dplane->lock.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Russell King 10 лет назад
Родитель
Сommit
66377efa3f
1 измененных файлов с 2 добавлено и 10 удалено
  1. 2 10
      drivers/gpu/drm/armada/armada_overlay.c

+ 2 - 10
drivers/gpu/drm/armada/armada_overlay.c

@@ -31,7 +31,6 @@ struct armada_ovl_plane_properties {
 
 
 struct armada_ovl_plane {
 struct armada_ovl_plane {
 	struct drm_plane base;
 	struct drm_plane base;
-	spinlock_t lock;
 	struct drm_framebuffer *old_fb;
 	struct drm_framebuffer *old_fb;
 	uint32_t src_hw;
 	uint32_t src_hw;
 	uint32_t dst_hw;
 	uint32_t dst_hw;
@@ -76,10 +75,7 @@ static void armada_ovl_retire_fb(struct armada_ovl_plane *dplane,
 {
 {
 	struct drm_framebuffer *old_fb;
 	struct drm_framebuffer *old_fb;
 
 
-	spin_lock(&dplane->lock);
-	old_fb = dplane->old_fb;
-	dplane->old_fb = fb;
-	spin_unlock(&dplane->lock);
+	old_fb = xchg(&dplane->old_fb, fb);
 
 
 	if (old_fb)
 	if (old_fb)
 		armada_drm_queue_unref_work(dplane->base.dev, old_fb);
 		armada_drm_queue_unref_work(dplane->base.dev, old_fb);
@@ -289,10 +285,7 @@ static int armada_ovl_plane_disable(struct drm_plane *plane)
 	if (plane->fb)
 	if (plane->fb)
 		drm_framebuffer_unreference(plane->fb);
 		drm_framebuffer_unreference(plane->fb);
 
 
-	spin_lock_irq(&dplane->lock);
-	fb = dplane->old_fb;
-	dplane->old_fb = NULL;
-	spin_unlock_irq(&dplane->lock);
+	fb = xchg(&dplane->old_fb, NULL);
 	if (fb)
 	if (fb)
 		drm_framebuffer_unreference(fb);
 		drm_framebuffer_unreference(fb);
 
 
@@ -464,7 +457,6 @@ int armada_overlay_plane_create(struct drm_device *dev, unsigned long crtcs)
 	if (!dplane)
 	if (!dplane)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
-	spin_lock_init(&dplane->lock);
 	init_waitqueue_head(&dplane->vbl.wait);
 	init_waitqueue_head(&dplane->vbl.wait);
 	armada_drm_vbl_event_init(&dplane->vbl.update, armada_ovl_plane_vbl,
 	armada_drm_vbl_event_init(&dplane->vbl.update, armada_ovl_plane_vbl,
 				  dplane);
 				  dplane);