|
@@ -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);
|