int cmd_out_len = uverbs_attr_get_len(attrs,
                                        MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT);
        void *cmd_out;
-       int err;
+       int err, err2;
        int uid;
 
        c = devx_ufile2uctx(attrs);
                return PTR_ERR(cmd_out);
 
        MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, uid);
-       err = mlx5_cmd_exec(dev->mdev, cmd_in,
-                           uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN),
-                           cmd_out, cmd_out_len);
-       if (err)
+       err = mlx5_cmd_do(dev->mdev, cmd_in,
+                         uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN),
+                         cmd_out, cmd_out_len);
+       if (err && err != -EREMOTEIO)
                return err;
 
-       return uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT, cmd_out,
+       err2 = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT, cmd_out,
                              cmd_out_len);
+
+       return err2 ?: err;
 }
 
 static void devx_obj_build_destroy_cmd(void *in, void *out, void *din,
        u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
        struct devx_obj *obj;
        u16 obj_type = 0;
-       int err;
+       int err, err2 = 0;
        int uid;
        u32 obj_id;
        u16 opcode;
                                     cmd_in, cmd_in_len, cmd_out,
                                     cmd_out_len);
        } else {
-               err = mlx5_cmd_exec(dev->mdev, cmd_in,
-                                   cmd_in_len,
-                                   cmd_out, cmd_out_len);
+               err = mlx5_cmd_do(dev->mdev, cmd_in, cmd_in_len,
+                                 cmd_out, cmd_out_len);
        }
 
+       if (err == -EREMOTEIO)
+               err2 = uverbs_copy_to(attrs,
+                                     MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT,
+                                     cmd_out, cmd_out_len);
        if (err)
                goto obj_free;
 
                              sizeof(out));
 obj_free:
        kfree(obj);
-       return err;
+       return err2 ?: err;
 }
 
 static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
                &attrs->driver_udata, struct mlx5_ib_ucontext, ibucontext);
        struct mlx5_ib_dev *mdev = to_mdev(c->ibucontext.device);
        void *cmd_out;
-       int err;
+       int err, err2;
        int uid;
 
        if (MLX5_GET(general_obj_in_cmd_hdr, cmd_in, vhca_tunnel_id))
        MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, uid);
        devx_set_umem_valid(cmd_in);
 
-       err = mlx5_cmd_exec(mdev->mdev, cmd_in,
-                           uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN),
-                           cmd_out, cmd_out_len);
-       if (err)
+       err = mlx5_cmd_do(mdev->mdev, cmd_in,
+                         uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN),
+                         cmd_out, cmd_out_len);
+       if (err && err != -EREMOTEIO)
                return err;
 
-       return uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT,
+       err2 = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT,
                              cmd_out, cmd_out_len);
+
+       return err2 ?: err;
 }
 
 static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(
        struct mlx5_ib_ucontext *c = rdma_udata_to_drv_context(
                &attrs->driver_udata, struct mlx5_ib_ucontext, ibucontext);
        void *cmd_out;
-       int err;
+       int err, err2;
        int uid;
        struct mlx5_ib_dev *mdev = to_mdev(c->ibucontext.device);
 
                return PTR_ERR(cmd_out);
 
        MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, uid);
-       err = mlx5_cmd_exec(mdev->mdev, cmd_in,
-                           uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN),
-                           cmd_out, cmd_out_len);
-       if (err)
+       err = mlx5_cmd_do(mdev->mdev, cmd_in,
+                         uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN),
+                         cmd_out, cmd_out_len);
+       if (err && err != -EREMOTEIO)
                return err;
 
-       return uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT,
+       err2 = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT,
                              cmd_out, cmd_out_len);
+
+       return err2 ?: err;
 }
 
 struct devx_async_event_queue {