Skip to content

Commit b89bb34

Browse files
dtatuleamstsirkin
authored andcommitted
vdpa/mlx5: Add error code for suspend/resume VQ
Instead of blindly calling suspend/resume_vqs(), make then return error codes. To keep compatibility, keep suspending or resuming VQs on error and return the last error code. The assumption here is that the error code would be the same. 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 fc9af25 commit b89bb34

File tree

1 file changed

+54
-23
lines changed

1 file changed

+54
-23
lines changed

drivers/vdpa/mlx5/net/mlx5_vnet.c

Lines changed: 54 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1526,71 +1526,102 @@ static int setup_vq(struct mlx5_vdpa_net *ndev,
15261526
return err;
15271527
}
15281528

1529-
static void suspend_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1529+
static int suspend_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
15301530
{
15311531
struct mlx5_virtq_attr attr;
1532+
int err;
15321533

15331534
if (!mvq->initialized)
1534-
return;
1535+
return 0;
15351536

15361537
if (mvq->fw_state != MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY)
1537-
return;
1538+
return 0;
15381539

1539-
if (modify_virtqueue_state(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND))
1540-
mlx5_vdpa_warn(&ndev->mvdev, "modify to suspend failed\n");
1540+
err = modify_virtqueue_state(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND);
1541+
if (err) {
1542+
mlx5_vdpa_warn(&ndev->mvdev, "modify to suspend failed, err: %d\n", err);
1543+
return err;
1544+
}
15411545

1542-
if (query_virtqueue(ndev, mvq, &attr)) {
1543-
mlx5_vdpa_warn(&ndev->mvdev, "failed to query virtqueue\n");
1544-
return;
1546+
err = query_virtqueue(ndev, mvq, &attr);
1547+
if (err) {
1548+
mlx5_vdpa_warn(&ndev->mvdev, "failed to query virtqueue, err: %d\n", err);
1549+
return err;
15451550
}
1551+
15461552
mvq->avail_idx = attr.available_index;
15471553
mvq->used_idx = attr.used_index;
1554+
1555+
return 0;
15481556
}
15491557

1550-
static void suspend_vqs(struct mlx5_vdpa_net *ndev)
1558+
static int suspend_vqs(struct mlx5_vdpa_net *ndev)
15511559
{
1560+
int err = 0;
15521561
int i;
15531562

1554-
for (i = 0; i < ndev->cur_num_vqs; i++)
1555-
suspend_vq(ndev, &ndev->vqs[i]);
1563+
for (i = 0; i < ndev->cur_num_vqs; i++) {
1564+
int local_err = suspend_vq(ndev, &ndev->vqs[i]);
1565+
1566+
err = local_err ? local_err : err;
1567+
}
1568+
1569+
return err;
15561570
}
15571571

1558-
static void resume_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1572+
static int resume_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
15591573
{
1574+
int err;
1575+
15601576
if (!mvq->initialized)
1561-
return;
1577+
return 0;
15621578

15631579
switch (mvq->fw_state) {
15641580
case MLX5_VIRTIO_NET_Q_OBJECT_STATE_INIT:
15651581
/* Due to a FW quirk we need to modify the VQ fields first then change state.
15661582
* This should be fixed soon. After that, a single command can be used.
15671583
*/
1568-
if (modify_virtqueue(ndev, mvq, 0))
1584+
err = modify_virtqueue(ndev, mvq, 0);
1585+
if (err) {
15691586
mlx5_vdpa_warn(&ndev->mvdev,
1570-
"modify vq properties failed for vq %u\n", mvq->index);
1587+
"modify vq properties failed for vq %u, err: %d\n",
1588+
mvq->index, err);
1589+
return err;
1590+
}
15711591
break;
15721592
case MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND:
15731593
if (!is_resumable(ndev)) {
15741594
mlx5_vdpa_warn(&ndev->mvdev, "vq %d is not resumable\n", mvq->index);
1575-
return;
1595+
return -EINVAL;
15761596
}
15771597
break;
15781598
case MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY:
1579-
return;
1599+
return 0;
15801600
default:
15811601
mlx5_vdpa_warn(&ndev->mvdev, "resume vq %u called from bad state %d\n",
15821602
mvq->index, mvq->fw_state);
1583-
return;
1603+
return -EINVAL;
15841604
}
15851605

1586-
if (modify_virtqueue_state(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY))
1587-
mlx5_vdpa_warn(&ndev->mvdev, "modify to resume failed for vq %u\n", mvq->index);
1606+
err = modify_virtqueue_state(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY);
1607+
if (err)
1608+
mlx5_vdpa_warn(&ndev->mvdev, "modify to resume failed for vq %u, err: %d\n",
1609+
mvq->index, err);
1610+
1611+
return err;
15881612
}
15891613

1590-
static void resume_vqs(struct mlx5_vdpa_net *ndev)
1614+
static int resume_vqs(struct mlx5_vdpa_net *ndev)
15911615
{
1592-
for (int i = 0; i < ndev->cur_num_vqs; i++)
1593-
resume_vq(ndev, &ndev->vqs[i]);
1616+
int err = 0;
1617+
1618+
for (int i = 0; i < ndev->cur_num_vqs; i++) {
1619+
int local_err = resume_vq(ndev, &ndev->vqs[i]);
1620+
1621+
err = local_err ? local_err : err;
1622+
}
1623+
1624+
return err;
15941625
}
15951626

15961627
static void teardown_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)

0 commit comments

Comments
 (0)