Don't rely on store ordering to protect us from caller seeing a
partially initialized vm.

Reported-by: Sashiko <[email protected]>
Fixes: feb8ef4636a4 ("drm/msm: Add opt-in for VM_BIND")
Signed-off-by: Rob Clark <[email protected]>
---
 drivers/gpu/drm/msm/msm_drv.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index 32d5ebea2596..ec88155e0ed7 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -224,18 +224,19 @@ 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);
 
        /* Once ctx->vm is created it is valid for the lifetime of the context: 
*/
-       if (ctx->vm)
-               return ctx->vm;
+       if (vm)
+               return vm;
+
+       guard(mutex)(&init_lock);
 
-       mutex_lock(&init_lock);
        if (!ctx->vm) {
-               ctx->vm = msm_gpu_create_private_vm(
+               vm = msm_gpu_create_private_vm(
                        priv->gpu, current, !ctx->userspace_managed_vm);
-
+               smp_store_release(&ctx->vm, vm);
        }
-       mutex_unlock(&init_lock);
 
        return ctx->vm;
 }
-- 
2.54.0

Reply via email to