Otherwise a GEM_SUBMIT ioctl before any BOs are mapped could cause a
NPE.

Reported-by: Sashiko <[email protected]>
Fixes: 6a4d287a1ae6 ("drm/msm: Mark VM as unusable on GPU hangs")
Signed-off-by: Rob Clark <[email protected]>
---
 drivers/gpu/drm/msm/msm_gem_submit.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c 
b/drivers/gpu/drm/msm/msm_gem_submit.c
index 3c6bc90c3d48..56929e821200 100644
--- a/drivers/gpu/drm/msm/msm_gem_submit.c
+++ b/drivers/gpu/drm/msm/msm_gem_submit.c
@@ -30,7 +30,7 @@
  */
 
 static struct msm_gem_submit *submit_create(struct drm_device *dev,
-               struct msm_gpu *gpu,
+               struct msm_gpu *gpu, struct drm_gpuvm *vm,
                struct msm_gpu_submitqueue *queue, uint32_t nr_bos,
                uint32_t nr_cmds, u64 drm_client_id)
 {
@@ -66,7 +66,7 @@ static struct msm_gem_submit *submit_create(struct drm_device 
*dev,
 
        kref_init(&submit->ref);
        submit->dev = dev;
-       submit->vm = msm_context_vm(dev, queue->ctx);
+       submit->vm = vm;
        submit->gpu = gpu;
        submit->cmd = (void *)&submit->bos[nr_bos];
        submit->queue = queue;
@@ -554,6 +554,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
        struct msm_drm_private *priv = dev->dev_private;
        struct drm_msm_gem_submit *args = data;
        struct msm_context *ctx = file->driver_priv;
+       struct drm_gpuvm *vm = msm_context_vm(dev, ctx);
        struct msm_gem_submit *submit = NULL;
        struct msm_gpu *gpu = priv->gpu;
        struct msm_gpu_submitqueue *queue;
@@ -572,7 +573,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
        if (args->pad)
                return -EINVAL;
 
-       if (to_msm_vm(ctx->vm)->unusable)
+       if (vm && to_msm_vm(vm)->unusable)
                return UERR(EPIPE, dev, "context is unusable");
 
        /* for now, we just have 3d pipe.. eventually this would need to
@@ -609,7 +610,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
                }
        }
 
-       submit = submit_create(dev, gpu, queue, args->nr_bos, args->nr_cmds,
+       submit = submit_create(dev, gpu, vm, queue, args->nr_bos, args->nr_cmds,
                               file->client_id);
        if (IS_ERR(submit)) {
                ret = PTR_ERR(submit);
-- 
2.54.0

Reply via email to