Skip to content

Commit 2638134

Browse files
dtatuleamstsirkin
authored andcommitted
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 <[email protected]> Acked-by: Eugenio Pérez <[email protected]> Signed-off-by: Dragos Tatulea <[email protected]> Message-Id: <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
1 parent 0fe963d commit 2638134

File tree

1 file changed

+27
-3
lines changed

1 file changed

+27
-3
lines changed

drivers/vdpa/mlx5/net/mlx5_vnet.c

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3134,18 +3134,41 @@ static void init_group_to_asid_map(struct mlx5_vdpa_dev *mvdev)
31343134
mvdev->group2asid[i] = 0;
31353135
}
31363136

3137+
static bool needs_vqs_reset(const struct mlx5_vdpa_dev *mvdev)
3138+
{
3139+
struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
3140+
struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[0];
3141+
3142+
if (mvdev->status & VIRTIO_CONFIG_S_DRIVER_OK)
3143+
return true;
3144+
3145+
if (mvq->fw_state != MLX5_VIRTIO_NET_Q_OBJECT_STATE_INIT)
3146+
return true;
3147+
3148+
return mvq->modified_fields & (
3149+
MLX5_VIRTQ_MODIFY_MASK_STATE |
3150+
MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_ADDRS |
3151+
MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_AVAIL_IDX |
3152+
MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_USED_IDX
3153+
);
3154+
}
3155+
31373156
static int mlx5_vdpa_compat_reset(struct vdpa_device *vdev, u32 flags)
31383157
{
31393158
struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
31403159
struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
3160+
bool vq_reset;
31413161

31423162
print_status(mvdev, 0, true);
31433163
mlx5_vdpa_info(mvdev, "performing device reset\n");
31443164

31453165
down_write(&ndev->reslock);
31463166
unregister_link_notifier(ndev);
3147-
teardown_vq_resources(ndev);
3148-
mvqs_set_defaults(ndev);
3167+
vq_reset = needs_vqs_reset(mvdev);
3168+
if (vq_reset) {
3169+
teardown_vq_resources(ndev);
3170+
mvqs_set_defaults(ndev);
3171+
}
31493172

31503173
if (flags & VDPA_RESET_F_CLEAN_MAP)
31513174
mlx5_vdpa_destroy_mr_resources(&ndev->mvdev);
@@ -3165,7 +3188,8 @@ static int mlx5_vdpa_compat_reset(struct vdpa_device *vdev, u32 flags)
31653188
if (mlx5_vdpa_create_dma_mr(mvdev))
31663189
mlx5_vdpa_warn(mvdev, "create MR failed\n");
31673190
}
3168-
setup_vq_resources(ndev, false);
3191+
if (vq_reset)
3192+
setup_vq_resources(ndev, false);
31693193
up_write(&ndev->reslock);
31703194

31713195
return 0;

0 commit comments

Comments
 (0)