drm/i915/gtt: Setup vm callbacks late
authorMika Kuoppala <mika.kuoppala@linux.intel.com>
Tue, 28 Feb 2017 15:28:11 +0000 (17:28 +0200)
committerMika Kuoppala <mika.kuoppala@intel.com>
Fri, 3 Mar 2017 14:46:44 +0000 (16:46 +0200)
If we manage to tangle errorpaths and get call to callbacks,
it is better to defensively keep them as null until object init is
finished so that we get clean null deref on callsite,
instead of more cryptic wreckage with partly initialized vm objects.

Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1488295691-9404-5-git-send-email-mika.kuoppala@intel.com
drivers/gpu/drm/i915/i915_gem_gtt.c

index 9c9a03ee44b9983739a05e92ab750b90a33f9135..cee9c4fec52a1d90fc7ed03328cfc2c139f794f3 100644 (file)
@@ -1338,11 +1338,6 @@ static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
                return ret;
        }
 
-       ppgtt->base.cleanup = gen8_ppgtt_cleanup;
-       ppgtt->base.unbind_vma = ppgtt_unbind_vma;
-       ppgtt->base.bind_vma = ppgtt_bind_vma;
-       ppgtt->debug_dump = gen8_dump_ppgtt;
-
        /* There are only few exceptions for gen >=6. chv and bxt.
         * And we are not sure about the latter so play safe for now.
         */
@@ -1382,6 +1377,11 @@ static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
        if (intel_vgpu_active(dev_priv))
                gen8_ppgtt_notify_vgt(ppgtt, true);
 
+       ppgtt->base.cleanup = gen8_ppgtt_cleanup;
+       ppgtt->base.unbind_vma = ppgtt_unbind_vma;
+       ppgtt->base.bind_vma = ppgtt_bind_vma;
+       ppgtt->debug_dump = gen8_dump_ppgtt;
+
        return 0;
 
 free_scratch:
@@ -1808,13 +1808,7 @@ static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
        if (ret)
                return ret;
 
-       ppgtt->base.clear_range = gen6_ppgtt_clear_range;
-       ppgtt->base.insert_entries = gen6_ppgtt_insert_entries;
-       ppgtt->base.unbind_vma = ppgtt_unbind_vma;
-       ppgtt->base.bind_vma = ppgtt_bind_vma;
-       ppgtt->base.cleanup = gen6_ppgtt_cleanup;
        ppgtt->base.total = I915_PDES * GEN6_PTES * PAGE_SIZE;
-       ppgtt->debug_dump = gen6_dump_ppgtt;
 
        gen6_scratch_va_range(ppgtt, 0, ppgtt->base.total);
        gen6_write_page_range(ppgtt, 0, ppgtt->base.total);
@@ -1825,6 +1819,13 @@ static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
                return ret;
        }
 
+       ppgtt->base.clear_range = gen6_ppgtt_clear_range;
+       ppgtt->base.insert_entries = gen6_ppgtt_insert_entries;
+       ppgtt->base.unbind_vma = ppgtt_unbind_vma;
+       ppgtt->base.bind_vma = ppgtt_bind_vma;
+       ppgtt->base.cleanup = gen6_ppgtt_cleanup;
+       ppgtt->debug_dump = gen6_dump_ppgtt;
+
        DRM_DEBUG_DRIVER("Allocated pde space (%lldM) at GTT entry: %llx\n",
                         ppgtt->node.size >> 20,
                         ppgtt->node.start / PAGE_SIZE);