mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-27 15:06:50 +00:00
vdpa/mlx5: Re-create HW VQs under certain conditions
There are a few conditions under which the hardware VQs need a full teardown and setup: - VQ size changed to something else than default value. Hardware VQ size modification is not supported. - User turns off certain device features: mergeable buffers, checksum virtio 1.0 compliance. In these cases, the TIR and RQT need to be re-created. Add a needs_teardown configuration variable and set it when detecting the above scenarios. On next DRIVER_OK, the resources will be torn down first. 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-22-560c491078df@nvidia.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
ffb1aae43e
commit
0fe963d6fc
@ -2390,6 +2390,7 @@ static void mlx5_vdpa_set_vq_num(struct vdpa_device *vdev, u16 idx, u32 num)
|
||||
}
|
||||
|
||||
mvq = &ndev->vqs[idx];
|
||||
ndev->needs_teardown = num != mvq->num_ent;
|
||||
mvq->num_ent = num;
|
||||
}
|
||||
|
||||
@ -2800,6 +2801,7 @@ static int mlx5_vdpa_set_driver_features(struct vdpa_device *vdev, u64 features)
|
||||
struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
|
||||
struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
|
||||
u64 old_features = mvdev->actual_features;
|
||||
u64 diff_features;
|
||||
int err;
|
||||
|
||||
print_features(mvdev, features, true);
|
||||
@ -2822,6 +2824,14 @@ static int mlx5_vdpa_set_driver_features(struct vdpa_device *vdev, u64 features)
|
||||
}
|
||||
}
|
||||
|
||||
/* When below features diverge from initial device features, VQs need a full teardown. */
|
||||
#define NEEDS_TEARDOWN_MASK (BIT_ULL(VIRTIO_NET_F_MRG_RXBUF) | \
|
||||
BIT_ULL(VIRTIO_NET_F_CSUM) | \
|
||||
BIT_ULL(VIRTIO_F_VERSION_1))
|
||||
|
||||
diff_features = mvdev->mlx_features ^ mvdev->actual_features;
|
||||
ndev->needs_teardown = !!(diff_features & NEEDS_TEARDOWN_MASK);
|
||||
|
||||
update_cvq_info(mvdev);
|
||||
return err;
|
||||
}
|
||||
@ -3038,6 +3048,7 @@ static void teardown_vq_resources(struct mlx5_vdpa_net *ndev)
|
||||
destroy_rqt(ndev);
|
||||
teardown_virtqueues(ndev);
|
||||
ndev->setup = false;
|
||||
ndev->needs_teardown = false;
|
||||
}
|
||||
|
||||
static int setup_cvq_vring(struct mlx5_vdpa_dev *mvdev)
|
||||
@ -3078,6 +3089,10 @@ static void mlx5_vdpa_set_status(struct vdpa_device *vdev, u8 status)
|
||||
goto err_setup;
|
||||
}
|
||||
register_link_notifier(ndev);
|
||||
|
||||
if (ndev->needs_teardown)
|
||||
teardown_vq_resources(ndev);
|
||||
|
||||
if (ndev->setup) {
|
||||
err = resume_vqs(ndev);
|
||||
if (err) {
|
||||
|
@ -56,6 +56,7 @@ struct mlx5_vdpa_net {
|
||||
struct dentry *rx_dent;
|
||||
struct dentry *rx_table_dent;
|
||||
bool setup;
|
||||
bool needs_teardown;
|
||||
u32 cur_num_vqs;
|
||||
u32 rqt_size;
|
||||
bool nb_registered;
|
||||
|
Loading…
Reference in New Issue
Block a user