* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).