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.

vfio/mlx5: Add support for tracker object change event

Add support for tracker object change event by referring to its
MLX5_EVENT_TYPE_OBJECT_CHANGE event when occurs.

This lets the driver recognize whether the firmware moved the tracker
object to an error state.

In that case, the driver will skip/block any usage of that object
including an early exit in case the object was previously marked with an
error.

This functionality also covers the case when no CQE is delivered as of
the error state.

The driver was adapted to the device specification to handle the above.

Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Acked-by: Leon Romanovsky <leon@kernel.org>
Link: https://lore.kernel.org/r/20240205124828.232701-3-yishaih@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>

authored by

Yishai Hadas and committed by
Alex Williamson
f8864730 1cbcb564

+49
+48
drivers/vfio/pci/mlx5/cmd.c
··· 149 149 return 0; 150 150 } 151 151 152 + static void set_tracker_change_event(struct mlx5vf_pci_core_device *mvdev) 153 + { 154 + mvdev->tracker.object_changed = true; 155 + complete(&mvdev->tracker_comp); 156 + } 157 + 152 158 static void set_tracker_error(struct mlx5vf_pci_core_device *mvdev) 153 159 { 154 160 /* Mark the tracker under an error and wake it up if it's running */ ··· 906 900 return mlx5_cmd_exec(mdev, in, sizeof(in), out, sizeof(out)); 907 901 } 908 902 903 + static int mlx5vf_cmd_query_tracker(struct mlx5_core_dev *mdev, 904 + struct mlx5_vhca_page_tracker *tracker) 905 + { 906 + u32 out[MLX5_ST_SZ_DW(query_page_track_obj_out)] = {}; 907 + u32 in[MLX5_ST_SZ_DW(general_obj_in_cmd_hdr)] = {}; 908 + void *obj_context; 909 + void *cmd_hdr; 910 + int err; 911 + 912 + cmd_hdr = MLX5_ADDR_OF(modify_page_track_obj_in, in, general_obj_in_cmd_hdr); 913 + MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_QUERY_GENERAL_OBJECT); 914 + MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_PAGE_TRACK); 915 + MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_id, tracker->id); 916 + 917 + err = mlx5_cmd_exec(mdev, in, sizeof(in), out, sizeof(out)); 918 + if (err) 919 + return err; 920 + 921 + obj_context = MLX5_ADDR_OF(query_page_track_obj_out, out, obj_context); 922 + tracker->status = MLX5_GET(page_track, obj_context, state); 923 + return 0; 924 + } 925 + 909 926 static int alloc_cq_frag_buf(struct mlx5_core_dev *mdev, 910 927 struct mlx5_vhca_cq_buf *buf, int nent, 911 928 int cqe_size) ··· 986 957 mlx5_nb_cof(nb, struct mlx5_vhca_page_tracker, nb); 987 958 struct mlx5vf_pci_core_device *mvdev = container_of( 988 959 tracker, struct mlx5vf_pci_core_device, tracker); 960 + struct mlx5_eqe_obj_change *object; 989 961 struct mlx5_eqe *eqe = data; 990 962 u8 event_type = (u8)type; 991 963 u8 queue_type; 964 + u32 obj_id; 992 965 int qp_num; 993 966 994 967 switch (event_type) { ··· 1005 974 qp_num != tracker->fw_qp->qpn) 1006 975 break; 1007 976 set_tracker_error(mvdev); 977 + break; 978 + case MLX5_EVENT_TYPE_OBJECT_CHANGE: 979 + object = &eqe->data.obj_change; 980 + obj_id = be32_to_cpu(object->obj_id); 981 + if (obj_id == tracker->id) 982 + set_tracker_change_event(mvdev); 1008 983 break; 1009 984 default: 1010 985 break; ··· 1671 1634 goto end; 1672 1635 } 1673 1636 1637 + if (tracker->is_err) { 1638 + err = -EIO; 1639 + goto end; 1640 + } 1641 + 1674 1642 mdev = mvdev->mdev; 1675 1643 err = mlx5vf_cmd_modify_tracker(mdev, tracker->id, iova, length, 1676 1644 MLX5_PAGE_TRACK_STATE_REPORTING); ··· 1694 1652 dirty, &tracker->status); 1695 1653 if (poll_err == CQ_EMPTY) { 1696 1654 wait_for_completion(&mvdev->tracker_comp); 1655 + if (tracker->object_changed) { 1656 + tracker->object_changed = false; 1657 + err = mlx5vf_cmd_query_tracker(mdev, tracker); 1658 + if (err) 1659 + goto end; 1660 + } 1697 1661 continue; 1698 1662 } 1699 1663 }
+1
drivers/vfio/pci/mlx5/cmd.h
··· 162 162 u32 id; 163 163 u32 pdn; 164 164 u8 is_err:1; 165 + u8 object_changed:1; 165 166 struct mlx5_uars_page *uar; 166 167 struct mlx5_vhca_cq cq; 167 168 struct mlx5_vhca_qp *host_qp;