And serialize setting EN_VM_BIND against VM creation.

Signed-off-by: Rob Clark <[email protected]>
---
 drivers/gpu/drm/msm/adreno/adreno_gpu.c | 5 ++++-
 drivers/gpu/drm/msm/msm_drv.c           | 3 +--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c 
b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index c62c45bb0ddb..0d54141ff089 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -503,7 +503,9 @@ int adreno_set_param(struct msm_gpu *gpu, struct 
msm_context *ctx,
                if (!perfmon_capable())
                        return UERR(EPERM, drm, "invalid permissions");
                return msm_context_set_sysprof(ctx, gpu, value);
-       case MSM_PARAM_EN_VM_BIND:
+       case MSM_PARAM_EN_VM_BIND: {
+               guard(rwsem_read)(&ctx->ctxlock);
+
                /* We can only support VM_BIND with per-process pgtables: */
                if (ctx->vm == gpu->vm)
                        return UERR(EINVAL, drm, "requires per-process 
pgtables");
@@ -518,6 +520,7 @@ int adreno_set_param(struct msm_gpu *gpu, struct 
msm_context *ctx,
                ctx->userspace_managed_vm = value;
 
                return 0;
+       }
        default:
                return UERR(EINVAL, drm, "%s: invalid param: %u", gpu->name, 
param);
        }
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index 384f32f4d0c2..2fd1b717d8e6 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -222,7 +222,6 @@ static void load_gpu(struct drm_device *dev)
  */
 struct drm_gpuvm *msm_context_vm(struct drm_device *dev, struct msm_context 
*ctx)
 {
-       static DEFINE_MUTEX(init_lock);
        struct msm_drm_private *priv = dev->dev_private;
        struct drm_gpuvm *vm = smp_load_acquire(&ctx->vm);
 
@@ -230,7 +229,7 @@ struct drm_gpuvm *msm_context_vm(struct drm_device *dev, 
struct msm_context *ctx
        if (vm)
                return vm;
 
-       guard(mutex)(&init_lock);
+       guard(rwsem_write)(&ctx->ctxlock);
 
        if (!ctx->vm) {
                vm = msm_gpu_create_private_vm(
-- 
2.55.0

Reply via email to