Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost

Pull vdpa fix from Michael Tsirkin:
"A bugfix in the mlx driver I got at the last minute"

* tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost:
vdpa/mlx5: Restore the hardware used index after change map

+18
+18
drivers/vdpa/mlx5/net/mlx5_vnet.c
··· 87 87 u64 device_addr; 88 88 u64 driver_addr; 89 89 u16 avail_index; 90 + u16 used_index; 90 91 bool ready; 91 92 struct vdpa_callback cb; 92 93 bool restore; ··· 122 121 u32 virtq_id; 123 122 struct mlx5_vdpa_net *ndev; 124 123 u16 avail_idx; 124 + u16 used_idx; 125 125 int fw_state; 126 126 127 127 /* keep last in the struct */ ··· 806 804 807 805 obj_context = MLX5_ADDR_OF(create_virtio_net_q_in, in, obj_context); 808 806 MLX5_SET(virtio_net_q_object, obj_context, hw_available_index, mvq->avail_idx); 807 + MLX5_SET(virtio_net_q_object, obj_context, hw_used_index, mvq->used_idx); 809 808 MLX5_SET(virtio_net_q_object, obj_context, queue_feature_bit_mask_12_3, 810 809 get_features_12_3(ndev->mvdev.actual_features)); 811 810 vq_ctx = MLX5_ADDR_OF(virtio_net_q_object, obj_context, virtio_q_context); ··· 1025 1022 struct mlx5_virtq_attr { 1026 1023 u8 state; 1027 1024 u16 available_index; 1025 + u16 used_index; 1028 1026 }; 1029 1027 1030 1028 static int query_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, ··· 1056 1052 memset(attr, 0, sizeof(*attr)); 1057 1053 attr->state = MLX5_GET(virtio_net_q_object, obj_context, state); 1058 1054 attr->available_index = MLX5_GET(virtio_net_q_object, obj_context, hw_available_index); 1055 + attr->used_index = MLX5_GET(virtio_net_q_object, obj_context, hw_used_index); 1059 1056 kfree(out); 1060 1057 return 0; 1061 1058 ··· 1540 1535 } 1541 1536 } 1542 1537 1538 + static void clear_virtqueues(struct mlx5_vdpa_net *ndev) 1539 + { 1540 + int i; 1541 + 1542 + for (i = ndev->mvdev.max_vqs - 1; i >= 0; i--) { 1543 + ndev->vqs[i].avail_idx = 0; 1544 + ndev->vqs[i].used_idx = 0; 1545 + } 1546 + } 1547 + 1543 1548 /* TODO: cross-endian support */ 1544 1549 static inline bool mlx5_vdpa_is_little_endian(struct mlx5_vdpa_dev *mvdev) 1545 1550 { ··· 1625 1610 return err; 1626 1611 1627 1612 ri->avail_index = attr.available_index; 1613 + ri->used_index = attr.used_index; 1628 1614 ri->ready = mvq->ready; 1629 1615 ri->num_ent = mvq->num_ent; 1630 1616 ri->desc_addr = mvq->desc_addr; ··· 1670 1654 continue; 1671 1655 1672 1656 mvq->avail_idx = ri->avail_index; 1657 + mvq->used_idx = ri->used_index; 1673 1658 mvq->ready = ri->ready; 1674 1659 mvq->num_ent = ri->num_ent; 1675 1660 mvq->desc_addr = ri->desc_addr; ··· 1785 1768 if (!status) { 1786 1769 mlx5_vdpa_info(mvdev, "performing device reset\n"); 1787 1770 teardown_driver(ndev); 1771 + clear_virtqueues(ndev); 1788 1772 mlx5_vdpa_destroy_mr(&ndev->mvdev); 1789 1773 ndev->mvdev.status = 0; 1790 1774 ndev->mvdev.mlx_features = 0;