diff options
| author | Mario Kleiner <mario.kleiner@tuebingen.mpg.de> | 2011-02-21 05:42:01 +0100 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2011-02-23 10:08:46 +1000 | 
| commit | bc21512835a72bc1eab7abd7d8a1bff0435591d7 (patch) | |
| tree | 015b9212d6fbd176dcbe141d5d96ee30d4bf1a76 /drivers/gpu/drm/drm_irq.c | |
| parent | c4cc383915549cf14f027f374904e30c13653dac (diff) | |
| download | olio-linux-3.10-bc21512835a72bc1eab7abd7d8a1bff0435591d7.tar.xz olio-linux-3.10-bc21512835a72bc1eab7abd7d8a1bff0435591d7.zip  | |
drm/vblank: Use memory barriers optimized for atomic_t instead of generics.
Documentation/atomic_ops.txt tells us that there are memory
barriers optimized for atomic_inc and other atomic_t ops.
Use these instead of smp_wmb(), and also to make the required
memory barriers around vblank counter increments more explicit.
Signed-off-by: Mario Kleiner <mario.kleiner@tuebingen.mpg.de>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/drm_irq.c')
| -rw-r--r-- | drivers/gpu/drm/drm_irq.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 6d2d4faf867..22f3bf5ecbd 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c @@ -164,8 +164,10 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc)  	 * available. In that case we can't account for this and just  	 * hope for the best.  	 */ -	if ((vblrc > 0) && (abs64(diff_ns) > 1000000)) +	if ((vblrc > 0) && (abs64(diff_ns) > 1000000)) {  		atomic_inc(&dev->_vblank_count[crtc]); +		smp_mb__after_atomic_inc(); +	}  	/* Invalidate all timestamps while vblank irq's are off. */  	clear_vblank_timestamps(dev, crtc); @@ -858,10 +860,11 @@ static void drm_update_vblank_count(struct drm_device *dev, int crtc)  	if (rc) {  		tslot = atomic_read(&dev->_vblank_count[crtc]) + diff;  		vblanktimestamp(dev, crtc, tslot) = t_vblank; -		smp_wmb();  	} +	smp_mb__before_atomic_inc();  	atomic_add(diff, &dev->_vblank_count[crtc]); +	smp_mb__after_atomic_inc();  }  /** @@ -1296,12 +1299,13 @@ bool drm_handle_vblank(struct drm_device *dev, int crtc)  	if (abs64(diff_ns) > DRM_REDUNDANT_VBLIRQ_THRESH_NS) {  		/* Store new timestamp in ringbuffer. */  		vblanktimestamp(dev, crtc, vblcount + 1) = tvblank; -		smp_wmb();  		/* Increment cooked vblank count. This also atomically commits  		 * the timestamp computed above.  		 */ +		smp_mb__before_atomic_inc();  		atomic_inc(&dev->_vblank_count[crtc]); +		smp_mb__after_atomic_inc();  	} else {  		DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n",  			  crtc, (int) diff_ns);  |