eaddr = eaddr & ((1 << shift) - 1);
 
        flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
+       if (vm->root.base.bo->shadow)
+               flags |= AMDGPU_GEM_CREATE_SHADOW;
        if (vm->use_cpu_for_update)
                flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
        else
-               flags |= (AMDGPU_GEM_CREATE_NO_CPU_ACCESS |
-                               AMDGPU_GEM_CREATE_SHADOW);
+               flags |= AMDGPU_GEM_CREATE_NO_CPU_ACCESS;
 
        /* walk over the address space and allocate the page tables */
        for (pt_idx = from; pt_idx <= to; ++pt_idx) {
        flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
        if (vm->use_cpu_for_update)
                flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
-       else
+       else if (vm_context != AMDGPU_VM_CONTEXT_COMPUTE)
                flags |= AMDGPU_GEM_CREATE_SHADOW;
 
        size = amdgpu_vm_bo_size(adev, adev->vm_manager.root_level);
  * - pasid (old PASID is released, because compute manages its own PASIDs)
  *
  * Reinitializes the page directory to reflect the changed ATS
- * setting. May leave behind an unused shadow BO for the page
- * directory when switching from SDMA updates to CPU updates.
+ * setting.
  *
  * Returns:
  * 0 for success, -errno for errors.
                vm->pasid = 0;
        }
 
+       /* Free the shadow bo for compute VM */
+       amdgpu_bo_unref(&vm->root.base.bo->shadow);
+
 error:
        amdgpu_bo_unreserve(vm->root.base.bo);
        return r;