Module Name:    src
Committed By:   riastradh
Date:           Sat Apr 26 20:26:26 UTC 2014

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915: i915_dma.c i915_drv.h
            i915_gem.c intel_display.c

Log Message:
Convert pending_flip_lock to spin lock -- interrupt handlers take it.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.4 src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.4	Fri Apr  4 15:16:29 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c	Sat Apr 26 20:26:26 2014
@@ -1756,7 +1756,7 @@ out_gem_unload:
 	spin_lock_destroy(&dev_priv->dpio_lock);
 	linux_mutex_destroy(&dev_priv->rps.hw_lock);
 	DRM_DESTROY_WAITQUEUE(&dev_priv->pending_flip_queue);
-	linux_mutex_destroy(&dev_priv->pending_flip_lock);
+	spin_lock_destroy(&dev_priv->pending_flip_lock);
 	destroy_completion(&dev_priv->error_completion);
 #endif
 
@@ -1878,7 +1878,7 @@ int i915_driver_unload(struct drm_device
 #ifdef __NetBSD__
 	/* XXX Not sure this is the right place, but it looks safe.  */
 	DRM_DESTROY_WAITQUEUE(&dev_priv->pending_flip_queue);
-	linux_mutex_destroy(&dev_priv->pending_flip_lock);
+	spin_lock_destroy(&dev_priv->pending_flip_lock);
 	destroy_completion(&dev_priv->error_completion);
 #endif
 

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.2	Tue Mar 18 18:20:42 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h	Sat Apr 26 20:26:26 2014
@@ -891,7 +891,7 @@ typedef struct drm_i915_private {
 	struct drm_crtc *pipe_to_crtc_mapping[3];
 #ifdef __NetBSD__
 	/* XXX The locking scheme looks broken.  This mutex is a stop-gap.  */
-	struct mutex pending_flip_lock;
+	struct spinlock pending_flip_lock;
 	drm_waitqueue_t pending_flip_queue;
 #else
 	wait_queue_head_t pending_flip_queue;
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.2	Tue Mar 18 18:20:42 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c	Sat Apr 26 20:26:26 2014
@@ -4643,7 +4643,7 @@ i915_gem_load(struct drm_device *dev)
 	i915_gem_detect_bit_6_swizzle(dev);
 #ifdef __NetBSD__
 	DRM_INIT_WAITQUEUE(&dev_priv->pending_flip_queue, "i915flip");
-	linux_mutex_init(&dev_priv->pending_flip_lock);
+	spin_lock_init(&dev_priv->pending_flip_lock);
 #else
 	init_waitqueue_head(&dev_priv->pending_flip_queue);
 #endif

Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c:1.3	Tue Mar 18 21:36:52 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/intel_display.c	Sat Apr 26 20:26:26 2014
@@ -2248,12 +2248,15 @@ intel_finish_fb(struct drm_framebuffer *
 	int ret;
 
 #ifdef __NetBSD__
-	mutex_lock(&dev_priv->pending_flip_lock);
-	DRM_WAIT_NOINTR_UNTIL(ret, &dev_priv->pending_flip_queue,
+    {
+	unsigned long flags;
+	spin_lock_irqsave(&dev_priv->pending_flip_lock, flags);
+	DRM_SPIN_WAIT_NOINTR_UNTIL(ret, &dev_priv->pending_flip_queue,
 	    &dev_priv->pending_flip_lock,
 	    (atomic_read(&dev_priv->mm.wedged) ||
 		atomic_read(&obj->pending_flip) == 0));
-	mutex_unlock(&dev_priv->pending_flip_lock);
+	spin_unlock_irqrestore(&dev_priv->pending_flip_lock, flags);
+    }
 #else
 	wait_event(dev_priv->pending_flip_queue,
 		   atomic_read(&dev_priv->mm.wedged) ||
@@ -2968,11 +2971,14 @@ static void intel_crtc_wait_for_pending_
 		return;
 
 #ifdef __NetBSD__
-	mutex_lock(&dev_priv->pending_flip_lock);
-	DRM_WAIT_NOINTR_UNTIL(error, &dev_priv->pending_flip_queue,
+    {
+	unsigned long flags;
+	spin_lock_irqsave(&dev_priv->pending_flip_lock, flags);
+	DRM_SPIN_WAIT_NOINTR_UNTIL(error, &dev_priv->pending_flip_queue,
 	    &dev_priv->pending_flip_lock,
 	    !intel_crtc_has_pending_flip(crtc));
-	mutex_unlock(&dev_priv->pending_flip_lock);
+	spin_unlock_irqrestore(&dev_priv->pending_flip_lock, flags);
+    }
 #else
 	wait_event(dev_priv->pending_flip_queue,
 		   !intel_crtc_has_pending_flip(crtc));
@@ -7148,10 +7154,10 @@ static void do_intel_finish_page_flip(st
 
 #ifdef __NetBSD__		/* XXX */
 	atomic_clear_mask(1 << intel_crtc->plane, &obj->pending_flip);
-	mutex_lock(&dev_priv->pending_flip_lock);
-	DRM_WAKEUP_ONE(&dev_priv->pending_flip_queue,
+	spin_lock_irqsave(&dev_priv->pending_flip_lock, flags);
+	DRM_SPIN_WAKEUP_ONE(&dev_priv->pending_flip_queue,
 	    &dev_priv->pending_flip_lock);
-	mutex_unlock(&dev_priv->pending_flip_lock);
+	spin_unlock_irqrestore(&dev_priv->pending_flip_lock, flags);
 #else
 	atomic_clear_mask(1 << intel_crtc->plane,
 			  &obj->pending_flip.counter);

Reply via email to