drm/i915: initialize the parity work only once
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 31 May 2012 12:57:42 +0000 (14:57 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 1 Jun 2012 08:00:47 +0000 (10:00 +0200)
This fixes an (albeit really hard to hit) race resulting in an oops:
- The parity work get scheduled.
- We re-init the irq state and call INIT_WORK again.
- The workqueue code tries to run the work item and stumbles over a
  work item that should be on it's runlist.

Also initiliaze the work item unconditionally like all the others,
it's simpler.

Reviewed-by: Ben Widawsky <ben@bwidawsk.net>
Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_irq.c

index 53356f44aba30ec4524f20f873950c17ab00e39c..6553dcc2ca7934eee4ecad01972d6874a732e48c 100644 (file)
@@ -1723,10 +1723,6 @@ static void ironlake_irq_preinstall(struct drm_device *dev)
 
        atomic_set(&dev_priv->irq_received, 0);
 
-
-       if (IS_IVYBRIDGE(dev))
-               INIT_WORK(&dev_priv->parity_error_work, ivybridge_parity_work);
-
        I915_WRITE(HWSTAM, 0xeffe);
 
        /* XXX hotplug from PCH */
@@ -2647,6 +2643,7 @@ void intel_irq_init(struct drm_device *dev)
        INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
        INIT_WORK(&dev_priv->error_work, i915_error_work_func);
        INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work);
+       INIT_WORK(&dev_priv->parity_error_work, ivybridge_parity_work);
 
        dev->driver->get_vblank_counter = i915_get_vblank_counter;
        dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */