* [bug report] IB/mlx4: Add support for steerable IB UD QPs
@ 2021-10-11 9:12 Dan Carpenter
0 siblings, 0 replies; only message in thread
From: Dan Carpenter @ 2021-10-11 9:12 UTC (permalink / raw)
To: matanb; +Cc: linux-rdma
[ Ancient code. No idea why this is only showing up now... -dan ]
Hello Matan Barak,
The patch c1c98501121e: "IB/mlx4: Add support for steerable IB UD
QPs" from Nov 7, 2013, leads to the following Smatch static checker
warning:
drivers/infiniband/hw/mlx4/qp.c:1103 create_qp_common()
warn: missing error code 'err'
drivers/infiniband/hw/mlx4/qp.c
952 static int create_qp_common(struct ib_pd *pd, struct ib_qp_init_attr *init_attr,
953 struct ib_udata *udata, int sqpn,
954 struct mlx4_ib_qp *qp)
955 {
956 struct mlx4_ib_dev *dev = to_mdev(pd->device);
957 int qpn;
958 int err;
959 struct mlx4_ib_ucontext *context = rdma_udata_to_drv_context(
960 udata, struct mlx4_ib_ucontext, ibucontext);
961 enum mlx4_ib_qp_type qp_type = (enum mlx4_ib_qp_type) init_attr->qp_type;
962 struct mlx4_ib_cq *mcq;
963 unsigned long flags;
964
965 /* When tunneling special qps, we use a plain UD qp */
966 if (sqpn) {
967 if (mlx4_is_mfunc(dev->dev) &&
968 (!mlx4_is_master(dev->dev) ||
969 !(init_attr->create_flags & MLX4_IB_SRIOV_SQP))) {
970 if (init_attr->qp_type == IB_QPT_GSI)
971 qp_type = MLX4_IB_QPT_PROXY_GSI;
972 else {
973 if (mlx4_is_master(dev->dev) ||
974 qp0_enabled_vf(dev->dev, sqpn))
975 qp_type = MLX4_IB_QPT_PROXY_SMI_OWNER;
976 else
977 qp_type = MLX4_IB_QPT_PROXY_SMI;
978 }
979 }
980 qpn = sqpn;
981 /* add extra sg entry for tunneling */
982 init_attr->cap.max_recv_sge++;
983 } else if (init_attr->create_flags & MLX4_IB_SRIOV_TUNNEL_QP) {
984 struct mlx4_ib_qp_tunnel_init_attr *tnl_init =
985 container_of(init_attr,
986 struct mlx4_ib_qp_tunnel_init_attr, init_attr);
987 if ((tnl_init->proxy_qp_type != IB_QPT_SMI &&
988 tnl_init->proxy_qp_type != IB_QPT_GSI) ||
989 !mlx4_is_master(dev->dev))
990 return -EINVAL;
991 if (tnl_init->proxy_qp_type == IB_QPT_GSI)
992 qp_type = MLX4_IB_QPT_TUN_GSI;
993 else if (tnl_init->slave == mlx4_master_func_num(dev->dev) ||
994 mlx4_vf_smi_enabled(dev->dev, tnl_init->slave,
995 tnl_init->port))
996 qp_type = MLX4_IB_QPT_TUN_SMI_OWNER;
997 else
998 qp_type = MLX4_IB_QPT_TUN_SMI;
999 /* we are definitely in the PPF here, since we are creating
1000 * tunnel QPs. base_tunnel_sqpn is therefore valid. */
1001 qpn = dev->dev->phys_caps.base_tunnel_sqpn + 8 * tnl_init->slave
1002 + tnl_init->proxy_qp_type * 2 + tnl_init->port - 1;
1003 sqpn = qpn;
1004 }
1005
1006 if (init_attr->qp_type == IB_QPT_SMI ||
1007 init_attr->qp_type == IB_QPT_GSI || qp_type == MLX4_IB_QPT_SMI ||
1008 qp_type == MLX4_IB_QPT_GSI ||
1009 (qp_type & (MLX4_IB_QPT_PROXY_SMI | MLX4_IB_QPT_PROXY_SMI_OWNER |
1010 MLX4_IB_QPT_PROXY_GSI | MLX4_IB_QPT_TUN_SMI_OWNER))) {
1011 qp->sqp = kzalloc(sizeof(struct mlx4_ib_sqp), GFP_KERNEL);
1012 if (!qp->sqp)
1013 return -ENOMEM;
1014 }
1015
1016 qp->mlx4_ib_qp_type = qp_type;
1017
1018 spin_lock_init(&qp->sq.lock);
1019 spin_lock_init(&qp->rq.lock);
1020 INIT_LIST_HEAD(&qp->gid_list);
1021 INIT_LIST_HEAD(&qp->steering_rules);
1022
1023 qp->state = IB_QPS_RESET;
1024 if (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR)
1025 qp->sq_signal_bits = cpu_to_be32(MLX4_WQE_CTRL_CQ_UPDATE);
1026
1027 if (udata) {
1028 struct mlx4_ib_create_qp ucmd;
1029 size_t copy_len;
1030 int shift;
1031 int n;
1032
1033 copy_len = sizeof(struct mlx4_ib_create_qp);
1034
1035 if (ib_copy_from_udata(&ucmd, udata, copy_len)) {
1036 err = -EFAULT;
1037 goto err;
1038 }
1039
1040 qp->inl_recv_sz = ucmd.inl_recv_sz;
1041
1042 if (init_attr->create_flags & IB_QP_CREATE_SCATTER_FCS) {
1043 if (!(dev->dev->caps.flags &
1044 MLX4_DEV_CAP_FLAG_FCS_KEEP)) {
1045 pr_debug("scatter FCS is unsupported\n");
1046 err = -EOPNOTSUPP;
1047 goto err;
1048 }
1049
1050 qp->flags |= MLX4_IB_QP_SCATTER_FCS;
1051 }
1052
1053 err = set_rq_size(dev, &init_attr->cap, udata,
1054 qp_has_rq(init_attr), qp, qp->inl_recv_sz);
1055 if (err)
1056 goto err;
1057
1058 qp->sq_no_prefetch = ucmd.sq_no_prefetch;
1059
1060 err = set_user_sq_size(dev, qp, &ucmd);
1061 if (err)
1062 goto err;
1063
1064 qp->umem =
1065 ib_umem_get(pd->device, ucmd.buf_addr, qp->buf_size, 0);
1066 if (IS_ERR(qp->umem)) {
1067 err = PTR_ERR(qp->umem);
1068 goto err;
1069 }
1070
1071 shift = mlx4_ib_umem_calc_optimal_mtt_size(qp->umem, 0, &n);
1072 err = mlx4_mtt_init(dev->dev, n, shift, &qp->mtt);
1073
1074 if (err)
1075 goto err_buf;
1076
1077 err = mlx4_ib_umem_write_mtt(dev, &qp->mtt, qp->umem);
1078 if (err)
1079 goto err_mtt;
1080
1081 if (qp_has_rq(init_attr)) {
1082 err = mlx4_ib_db_map_user(udata, ucmd.db_addr, &qp->db);
1083 if (err)
1084 goto err_mtt;
1085 }
1086 qp->mqp.usage = MLX4_RES_USAGE_USER_VERBS;
1087 } else {
1088 err = set_rq_size(dev, &init_attr->cap, udata,
1089 qp_has_rq(init_attr), qp, 0);
1090 if (err)
1091 goto err;
1092
1093 qp->sq_no_prefetch = 0;
1094
1095 if (init_attr->create_flags & IB_QP_CREATE_IPOIB_UD_LSO)
1096 qp->flags |= MLX4_IB_QP_LSO;
1097
1098 if (init_attr->create_flags & IB_QP_CREATE_NETIF_QP) {
1099 if (dev->steering_support ==
1100 MLX4_STEERING_MODE_DEVICE_MANAGED)
1101 qp->flags |= MLX4_IB_QP_NETIF;
1102 else
--> 1103 goto err;
^^^^^^^^
It looks like this should have an error code.
1104 }
1105
1106 err = set_kernel_sq_size(dev, &init_attr->cap, qp_type, qp);
1107 if (err)
1108 goto err;
1109
1110 if (qp_has_rq(init_attr)) {
1111 err = mlx4_db_alloc(dev->dev, &qp->db, 0);
1112 if (err)
1113 goto err;
1114
1115 *qp->db.db = 0;
1116 }
1117
1118 if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2,
1119 &qp->buf)) {
1120 err = -ENOMEM;
1121 goto err_db;
1122 }
1123
1124 err = mlx4_mtt_init(dev->dev, qp->buf.npages, qp->buf.page_shift,
1125 &qp->mtt);
1126 if (err)
1127 goto err_buf;
1128
1129 err = mlx4_buf_write_mtt(dev->dev, &qp->mtt, &qp->buf);
1130 if (err)
1131 goto err_mtt;
1132
1133 qp->sq.wrid = kvmalloc_array(qp->sq.wqe_cnt,
1134 sizeof(u64), GFP_KERNEL);
1135 qp->rq.wrid = kvmalloc_array(qp->rq.wqe_cnt,
1136 sizeof(u64), GFP_KERNEL);
1137 if (!qp->sq.wrid || !qp->rq.wrid) {
1138 err = -ENOMEM;
1139 goto err_wrid;
1140 }
1141 qp->mqp.usage = MLX4_RES_USAGE_DRIVER;
1142 }
1143
1144 if (sqpn) {
1145 if (qp->mlx4_ib_qp_type & (MLX4_IB_QPT_PROXY_SMI_OWNER |
1146 MLX4_IB_QPT_PROXY_SMI | MLX4_IB_QPT_PROXY_GSI)) {
1147 if (alloc_proxy_bufs(pd->device, qp)) {
1148 err = -ENOMEM;
1149 goto err_wrid;
1150 }
1151 }
1152 } else {
1153 /* Raw packet QPNs may not have bits 6,7 set in their qp_num;
1154 * otherwise, the WQE BlueFlame setup flow wrongly causes
1155 * VLAN insertion. */
1156 if (init_attr->qp_type == IB_QPT_RAW_PACKET)
1157 err = mlx4_qp_reserve_range(dev->dev, 1, 1, &qpn,
1158 (init_attr->cap.max_send_wr ?
1159 MLX4_RESERVE_ETH_BF_QP : 0) |
1160 (init_attr->cap.max_recv_wr ?
1161 MLX4_RESERVE_A0_QP : 0),
1162 qp->mqp.usage);
1163 else
1164 if (qp->flags & MLX4_IB_QP_NETIF)
1165 err = mlx4_ib_steer_qp_alloc(dev, 1, &qpn);
1166 else
1167 err = mlx4_qp_reserve_range(dev->dev, 1, 1,
1168 &qpn, 0, qp->mqp.usage);
1169 if (err)
1170 goto err_proxy;
1171 }
1172
1173 if (init_attr->create_flags & IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK)
1174 qp->flags |= MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK;
1175
1176 err = mlx4_qp_alloc(dev->dev, qpn, &qp->mqp);
1177 if (err)
1178 goto err_qpn;
1179
1180 if (init_attr->qp_type == IB_QPT_XRC_TGT)
1181 qp->mqp.qpn |= (1 << 23);
1182
1183 /*
1184 * Hardware wants QPN written in big-endian order (after
1185 * shifting) for send doorbell. Precompute this value to save
1186 * a little bit when posting sends.
1187 */
1188 qp->doorbell_qpn = swab32(qp->mqp.qpn << 8);
1189
1190 qp->mqp.event = mlx4_ib_qp_event;
1191
1192 spin_lock_irqsave(&dev->reset_flow_resource_lock, flags);
1193 mlx4_ib_lock_cqs(to_mcq(init_attr->send_cq),
1194 to_mcq(init_attr->recv_cq));
1195 /* Maintain device to QPs access, needed for further handling
1196 * via reset flow
1197 */
1198 list_add_tail(&qp->qps_list, &dev->qp_list);
1199 /* Maintain CQ to QPs access, needed for further handling
1200 * via reset flow
1201 */
1202 mcq = to_mcq(init_attr->send_cq);
1203 list_add_tail(&qp->cq_send_list, &mcq->send_qp_list);
1204 mcq = to_mcq(init_attr->recv_cq);
1205 list_add_tail(&qp->cq_recv_list, &mcq->recv_qp_list);
1206 mlx4_ib_unlock_cqs(to_mcq(init_attr->send_cq),
1207 to_mcq(init_attr->recv_cq));
1208 spin_unlock_irqrestore(&dev->reset_flow_resource_lock, flags);
1209 return 0;
1210
1211 err_qpn:
1212 if (!sqpn) {
1213 if (qp->flags & MLX4_IB_QP_NETIF)
1214 mlx4_ib_steer_qp_free(dev, qpn, 1);
1215 else
1216 mlx4_qp_release_range(dev->dev, qpn, 1);
1217 }
1218 err_proxy:
1219 if (qp->mlx4_ib_qp_type == MLX4_IB_QPT_PROXY_GSI)
1220 free_proxy_bufs(pd->device, qp);
1221 err_wrid:
1222 if (udata) {
1223 if (qp_has_rq(init_attr))
1224 mlx4_ib_db_unmap_user(context, &qp->db);
1225 } else {
1226 kvfree(qp->sq.wrid);
1227 kvfree(qp->rq.wrid);
1228 }
1229
1230 err_mtt:
1231 mlx4_mtt_cleanup(dev->dev, &qp->mtt);
1232
1233 err_buf:
1234 if (!qp->umem)
1235 mlx4_buf_free(dev->dev, qp->buf_size, &qp->buf);
1236 ib_umem_release(qp->umem);
1237
1238 err_db:
1239 if (!udata && qp_has_rq(init_attr))
1240 mlx4_db_free(dev->dev, &qp->db);
1241
1242 err:
1243 kfree(qp->sqp);
1244 return err;
1245 }
regards,
dan carpenter
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-10-11 9:12 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-11 9:12 [bug report] IB/mlx4: Add support for steerable IB UD QPs Dan Carpenter
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.