drm/i915: Protect pipe_crc->entries update
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 9 Dec 2014 19:28:30 +0000 (21:28 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 10 Dec 2014 16:47:25 +0000 (17:47 +0100)
Set the pipe_crc->entries pointer while holding the relevant spinlock.
Doesn't matter too much since a spurious pipe crc interrupt would then
just update one entry but later that entry would get cleared when head
and tail are both set to 0. But being a bit more paranoid doesn't hurt.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_debugfs.c

index 0779e7f33f4239e789449651648362b8bc2bcbf4..218e27cb3e2fb2802ff5068fe264ca72b56ef335 100644 (file)
@@ -3410,13 +3410,15 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
 
        /* none -> real source transition */
        if (source) {
+               struct intel_pipe_crc_entry *entries;
+
                DRM_DEBUG_DRIVER("collecting CRCs for pipe %c, %s\n",
                                 pipe_name(pipe), pipe_crc_source_name(source));
 
-               pipe_crc->entries = kzalloc(sizeof(*pipe_crc->entries) *
-                                           INTEL_PIPE_CRC_ENTRIES_NR,
-                                           GFP_KERNEL);
-               if (!pipe_crc->entries)
+               entries = kzalloc(sizeof(*pipe_crc->entries) *
+                                 INTEL_PIPE_CRC_ENTRIES_NR,
+                                 GFP_KERNEL);
+               if (!entries)
                        return -ENOMEM;
 
                /*
@@ -3428,6 +3430,7 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
                hsw_disable_ips(crtc);
 
                spin_lock_irq(&pipe_crc->lock);
+               pipe_crc->entries = entries;
                pipe_crc->head = 0;
                pipe_crc->tail = 0;
                spin_unlock_irq(&pipe_crc->lock);