if (test_bit(gpuidx, prange->bitmap_access))
                                bitmap_set(ctx->bitmap, gpuidx, 1);
                }
+
+               /*
+                * If prange is already mapped or with always mapped flag,
+                * update mapping on GPUs with ACCESS attribute
+                */
+               if (bitmap_empty(ctx->bitmap, MAX_GPU_INSTANCE)) {
+                       if (prange->mapped_to_gpu ||
+                           prange->flags & KFD_IOCTL_SVM_FLAG_GPU_ALWAYS_MAPPED)
+                               bitmap_copy(ctx->bitmap, prange->bitmap_access, MAX_GPU_INSTANCE);
+               }
        } else {
                bitmap_or(ctx->bitmap, prange->bitmap_access,
                          prange->bitmap_aip, MAX_GPU_INSTANCE);
        }
 
        if (bitmap_empty(ctx->bitmap, MAX_GPU_INSTANCE)) {
-               bitmap_copy(ctx->bitmap, prange->bitmap_access, MAX_GPU_INSTANCE);
-               if (!prange->mapped_to_gpu ||
-                   bitmap_empty(ctx->bitmap, MAX_GPU_INSTANCE)) {
-                       r = 0;
-                       goto free_ctx;
-               }
+               r = 0;
+               goto free_ctx;
        }
 
        if (prange->actual_loc && !prange->ttm_res) {