mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 19:13:47 +02:00
vdpa/mlx5: Don't reset VQs more than necessary
The vdpa device can be reset many times in sequence without any significant state changes in between. Previously this was not a problem: VQs were torn down only on first reset. But after VQ pre-creation was introduced, each reset will delete and re-create the hardware VQs and their associated resources. To solve this problem, avoid resetting hardware VQs if the VQs are still in a blank state. Reviewed-by: Cosmin Ratiu <cratiu@nvidia.com> Acked-by: Eugenio Pérez <eperezma@redhat.com> Signed-off-by: Dragos Tatulea <dtatulea@nvidia.com> Message-Id: <20240626-stage-vdpa-vq-precreate-v2-23-560c491078df@nvidia.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
0fe963d6fc
commit
2638134f71
|
|
@ -3134,18 +3134,41 @@ static void init_group_to_asid_map(struct mlx5_vdpa_dev *mvdev)
|
|||
mvdev->group2asid[i] = 0;
|
||||
}
|
||||
|
||||
static bool needs_vqs_reset(const struct mlx5_vdpa_dev *mvdev)
|
||||
{
|
||||
struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
|
||||
struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[0];
|
||||
|
||||
if (mvdev->status & VIRTIO_CONFIG_S_DRIVER_OK)
|
||||
return true;
|
||||
|
||||
if (mvq->fw_state != MLX5_VIRTIO_NET_Q_OBJECT_STATE_INIT)
|
||||
return true;
|
||||
|
||||
return mvq->modified_fields & (
|
||||
MLX5_VIRTQ_MODIFY_MASK_STATE |
|
||||
MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_ADDRS |
|
||||
MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_AVAIL_IDX |
|
||||
MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_USED_IDX
|
||||
);
|
||||
}
|
||||
|
||||
static int mlx5_vdpa_compat_reset(struct vdpa_device *vdev, u32 flags)
|
||||
{
|
||||
struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
|
||||
struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
|
||||
bool vq_reset;
|
||||
|
||||
print_status(mvdev, 0, true);
|
||||
mlx5_vdpa_info(mvdev, "performing device reset\n");
|
||||
|
||||
down_write(&ndev->reslock);
|
||||
unregister_link_notifier(ndev);
|
||||
teardown_vq_resources(ndev);
|
||||
mvqs_set_defaults(ndev);
|
||||
vq_reset = needs_vqs_reset(mvdev);
|
||||
if (vq_reset) {
|
||||
teardown_vq_resources(ndev);
|
||||
mvqs_set_defaults(ndev);
|
||||
}
|
||||
|
||||
if (flags & VDPA_RESET_F_CLEAN_MAP)
|
||||
mlx5_vdpa_destroy_mr_resources(&ndev->mvdev);
|
||||
|
|
@ -3165,7 +3188,8 @@ static int mlx5_vdpa_compat_reset(struct vdpa_device *vdev, u32 flags)
|
|||
if (mlx5_vdpa_create_dma_mr(mvdev))
|
||||
mlx5_vdpa_warn(mvdev, "create MR failed\n");
|
||||
}
|
||||
setup_vq_resources(ndev, false);
|
||||
if (vq_reset)
|
||||
setup_vq_resources(ndev, false);
|
||||
up_write(&ndev->reslock);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user