vdpa/mlx5: Initialize CVQ vringh only once
[ Upstream commit ace9252446
]
Currently, CVQ vringh is initialized inside setup_virtqueues() which is
called every time a memory update is done. This is undesirable since it
resets all the context of the vring, including the available and used
indices.
Move the initialization to mlx5_vdpa_set_status() when
VIRTIO_CONFIG_S_DRIVER_OK is set.
Signed-off-by: Eli Cohen <elic@nvidia.com>
Message-Id: <20220613075958.511064-2-elic@nvidia.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Acked-by: Eugenio Pérez <eperezma@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Родитель
10f2cd373e
Коммит
b34dbeb2b0
|
@ -1898,7 +1898,6 @@ static int verify_driver_features(struct mlx5_vdpa_dev *mvdev, u64 features)
|
||||||
static int setup_virtqueues(struct mlx5_vdpa_dev *mvdev)
|
static int setup_virtqueues(struct mlx5_vdpa_dev *mvdev)
|
||||||
{
|
{
|
||||||
struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
|
struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
|
||||||
struct mlx5_control_vq *cvq = &mvdev->cvq;
|
|
||||||
int err;
|
int err;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -1908,16 +1907,6 @@ static int setup_virtqueues(struct mlx5_vdpa_dev *mvdev)
|
||||||
goto err_vq;
|
goto err_vq;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)) {
|
|
||||||
err = vringh_init_iotlb(&cvq->vring, mvdev->actual_features,
|
|
||||||
MLX5_CVQ_MAX_ENT, false,
|
|
||||||
(struct vring_desc *)(uintptr_t)cvq->desc_addr,
|
|
||||||
(struct vring_avail *)(uintptr_t)cvq->driver_addr,
|
|
||||||
(struct vring_used *)(uintptr_t)cvq->device_addr);
|
|
||||||
if (err)
|
|
||||||
goto err_vq;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_vq:
|
err_vq:
|
||||||
|
@ -2184,6 +2173,21 @@ static void clear_vqs_ready(struct mlx5_vdpa_net *ndev)
|
||||||
ndev->mvdev.cvq.ready = false;
|
ndev->mvdev.cvq.ready = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int setup_cvq_vring(struct mlx5_vdpa_dev *mvdev)
|
||||||
|
{
|
||||||
|
struct mlx5_control_vq *cvq = &mvdev->cvq;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
if (mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ))
|
||||||
|
err = vringh_init_iotlb(&cvq->vring, mvdev->actual_features,
|
||||||
|
MLX5_CVQ_MAX_ENT, false,
|
||||||
|
(struct vring_desc *)(uintptr_t)cvq->desc_addr,
|
||||||
|
(struct vring_avail *)(uintptr_t)cvq->driver_addr,
|
||||||
|
(struct vring_used *)(uintptr_t)cvq->device_addr);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static void mlx5_vdpa_set_status(struct vdpa_device *vdev, u8 status)
|
static void mlx5_vdpa_set_status(struct vdpa_device *vdev, u8 status)
|
||||||
{
|
{
|
||||||
struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
|
struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
|
||||||
|
@ -2194,6 +2198,11 @@ static void mlx5_vdpa_set_status(struct vdpa_device *vdev, u8 status)
|
||||||
|
|
||||||
if ((status ^ ndev->mvdev.status) & VIRTIO_CONFIG_S_DRIVER_OK) {
|
if ((status ^ ndev->mvdev.status) & VIRTIO_CONFIG_S_DRIVER_OK) {
|
||||||
if (status & VIRTIO_CONFIG_S_DRIVER_OK) {
|
if (status & VIRTIO_CONFIG_S_DRIVER_OK) {
|
||||||
|
err = setup_cvq_vring(mvdev);
|
||||||
|
if (err) {
|
||||||
|
mlx5_vdpa_warn(mvdev, "failed to setup control VQ vring\n");
|
||||||
|
goto err_setup;
|
||||||
|
}
|
||||||
err = setup_driver(mvdev);
|
err = setup_driver(mvdev);
|
||||||
if (err) {
|
if (err) {
|
||||||
mlx5_vdpa_warn(mvdev, "failed to setup driver\n");
|
mlx5_vdpa_warn(mvdev, "failed to setup driver\n");
|
||||||
|
|
Загрузка…
Ссылка в новой задаче