drm/i915/gvt: Fix kernel oops for 3-level ppgtt guest
authorZhenyu Wang <zhenyuw@linux.intel.com>
Wed, 6 May 2020 09:59:18 +0000 (17:59 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Mon, 11 May 2020 09:07:25 +0000 (17:07 +0800)
As i915 won't allocate extra PDP for current default PML4 table,
so for 3-level ppgtt guest, we would hit kernel pointer access
failure on extra PDP pointers. So this trys to bypass that now.
It won't impact real shadow PPGTT setup, so guest context still
works.

This is verified on 4.15 guest kernel with i915.enable_ppgtt=1
to force on old aliasing ppgtt behavior.

Fixes: 4f15665ccbba ("drm/i915: Add ppgtt to GVT GEM context")
Reviewed-by: Xiong Zhang <xiong.y.zhang@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20200506095918.124913-1-zhenyuw@linux.intel.com
drivers/gpu/drm/i915/gvt/scheduler.c

index cb11c31840857293ff2d3b7a0d7688e4ccf02e35..0f1d6998cf9cee7b585b8a4d0e7af3ea1c1c5a57 100644 (file)
@@ -379,7 +379,11 @@ static void set_context_ppgtt_from_shadow(struct intel_vgpu_workload *workload,
                for (i = 0; i < GVT_RING_CTX_NR_PDPS; i++) {
                        struct i915_page_directory * const pd =
                                i915_pd_entry(ppgtt->pd, i);
-
+                       /* skip now as current i915 ppgtt alloc won't allocate
+                          top level pdp for non 4-level table, won't impact
+                          shadow ppgtt. */
+                       if (!pd)
+                               break;
                        px_dma(pd) = mm->ppgtt_mm.shadow_pdps[i];
                }
        }