vfio/mlx5: Refactor the SAVE callback to activate a work only upon an error
authorYishai Hadas <yishaih@nvidia.com>
Mon, 11 Sep 2023 09:38:50 +0000 (12:38 +0300)
committerAlex Williamson <alex.williamson@redhat.com>
Thu, 28 Sep 2023 19:07:29 +0000 (13:07 -0600)
Upon a successful SAVE callback there is no need to activate a work, all
the required stuff can be done directly.

As so, refactor the above flow to activate a work only upon an error.

Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/20230911093856.81910-4-yishaih@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/pci/mlx5/cmd.c

index 33574b04477da39019e854e580c0c355ec934825..18d9d1768066ce008637b1f3d7be4ea5d84db7f5 100644 (file)
@@ -475,6 +475,15 @@ found:
        return buf;
 }
 
+static void
+mlx5vf_save_callback_complete(struct mlx5_vf_migration_file *migf,
+                             struct mlx5vf_async_data *async_data)
+{
+       kvfree(async_data->out);
+       complete(&migf->save_comp);
+       fput(migf->filp);
+}
+
 void mlx5vf_mig_file_cleanup_cb(struct work_struct *_work)
 {
        struct mlx5vf_async_data *async_data = container_of(_work,
@@ -494,9 +503,7 @@ void mlx5vf_mig_file_cleanup_cb(struct work_struct *_work)
                wake_up_interruptible(&migf->poll_wait);
        }
        mutex_unlock(&migf->lock);
-       kvfree(async_data->out);
-       complete(&migf->save_comp);
-       fput(migf->filp);
+       mlx5vf_save_callback_complete(migf, async_data);
 }
 
 static int add_buf_header(struct mlx5_vhca_data_buffer *header_buf,
@@ -560,13 +567,12 @@ static void mlx5vf_save_callback(int status, struct mlx5_async_work *context)
                migf->state = async_data->last_chunk ?
                        MLX5_MIGF_STATE_COMPLETE : MLX5_MIGF_STATE_PRE_COPY;
                wake_up_interruptible(&migf->poll_wait);
+               mlx5vf_save_callback_complete(migf, async_data);
+               return;
        }
 
 err:
-       /*
-        * The error and the cleanup flows can't run from an
-        * interrupt context
-        */
+       /* The error flow can't run from an interrupt context */
        if (status == -EREMOTEIO)
                status = MLX5_GET(save_vhca_state_out, async_data->out, status);
        async_data->status = status;