[bug report] IB/mlx4: Add support for WQ related verbs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Guy Levi,

This is a semi-automatic email about new static checker warnings.

The patch 400b1ebcfe31: "IB/mlx4: Add support for WQ related verbs"
from Jul 4, 2017, leads to the following Smatch complaint:

    drivers/infiniband/hw/mlx4/qp.c:1203 create_qp_common()
    error: we previously assumed 'pd->uobject' could be null (see line 1033)

drivers/infiniband/hw/mlx4/qp.c
  1032	
  1033		if (pd->uobject) {
                    ^^^^^^^^^^^
New check for NULL.

  1034			union {
  1035				struct mlx4_ib_create_qp qp;
  1036				struct mlx4_ib_create_wq wq;
  1037			} ucmd;
  1038			size_t copy_len;
  1039	
  1040			copy_len = (src == MLX4_IB_QP_SRC) ?
  1041				   sizeof(struct mlx4_ib_create_qp) :
  1042				   min(sizeof(struct mlx4_ib_create_wq), udata->inlen);
  1043	
  1044			if (ib_copy_from_udata(&ucmd, udata, copy_len)) {
  1045				err = -EFAULT;
  1046				goto err;
  1047			}
  1048	
  1049			if (src == MLX4_IB_RWQ_SRC) {
  1050				if (ucmd.wq.comp_mask || ucmd.wq.reserved1 ||
  1051				    ucmd.wq.reserved[0] || ucmd.wq.reserved[1] ||
  1052				    ucmd.wq.reserved[2]) {
  1053					pr_debug("user command isn't supported\n");
  1054					err = -EOPNOTSUPP;
  1055					goto err;
  1056				}
  1057	
  1058				if (ucmd.wq.log_range_size >
  1059				    ilog2(dev->dev->caps.max_rss_tbl_sz)) {
  1060					pr_debug("WQN range size must be equal or smaller than %d\n",
  1061						 dev->dev->caps.max_rss_tbl_sz);
  1062					err = -EOPNOTSUPP;
  1063					goto err;
  1064				}
  1065				range_size = 1 << ucmd.wq.log_range_size;
  1066			} else {
  1067				qp->inl_recv_sz = ucmd.qp.inl_recv_sz;
  1068			}
  1069	
  1070			err = set_rq_size(dev, &init_attr->cap, !!pd->uobject,
                                                                  ^^^^^^^^^^^
Not necessary check for NULL.

  1071					  qp_has_rq(init_attr), qp, qp->inl_recv_sz);
  1072			if (err)
  1073				goto err;
  1074	
  1075			if (src == MLX4_IB_QP_SRC) {
  1076				qp->sq_no_prefetch = ucmd.qp.sq_no_prefetch;
  1077	
  1078				err = set_user_sq_size(dev, qp,
  1079						       (struct mlx4_ib_create_qp *)
  1080						       &ucmd);
  1081				if (err)
  1082					goto err;
  1083			} else {
  1084				qp->sq_no_prefetch = 1;
  1085				qp->sq.wqe_cnt = 1;
  1086				qp->sq.wqe_shift = MLX4_IB_MIN_SQ_STRIDE;
  1087				/* Allocated buffer expects to have at least that SQ
  1088				 * size.
  1089				 */
  1090				qp->buf_size = (qp->rq.wqe_cnt << qp->rq.wqe_shift) +
  1091					(qp->sq.wqe_cnt << qp->sq.wqe_shift);
  1092			}
  1093	
  1094			qp->umem = ib_umem_get(pd->uobject->context,
  1095					(src == MLX4_IB_QP_SRC) ? ucmd.qp.buf_addr :
  1096					ucmd.wq.buf_addr, qp->buf_size, 0, 0);
  1097			if (IS_ERR(qp->umem)) {
  1098				err = PTR_ERR(qp->umem);
  1099				goto err;
  1100			}
  1101	
  1102			err = mlx4_mtt_init(dev->dev, ib_umem_page_count(qp->umem),
  1103					    qp->umem->page_shift, &qp->mtt);
  1104			if (err)
  1105				goto err_buf;
  1106	
  1107			err = mlx4_ib_umem_write_mtt(dev, &qp->mtt, qp->umem);
  1108			if (err)
  1109				goto err_mtt;
  1110	
  1111			if (qp_has_rq(init_attr)) {
  1112				err = mlx4_ib_db_map_user(to_mucontext(pd->uobject->context),
  1113					(src == MLX4_IB_QP_SRC) ? ucmd.qp.db_addr :
  1114					ucmd.wq.db_addr, &qp->db);
  1115				if (err)
  1116					goto err_mtt;
  1117			}
  1118			qp->mqp.usage = MLX4_RES_USAGE_USER_VERBS;
  1119		} else {
  1120			err = set_rq_size(dev, &init_attr->cap, !!pd->uobject,
                                                                ^^^^^^^^^^^^^
Always NULL now.

  1121					  qp_has_rq(init_attr), qp, 0);
  1122			if (err)
  1123				goto err;
  1124	
  1125			qp->sq_no_prefetch = 0;
  1126	
  1127			if (init_attr->create_flags & IB_QP_CREATE_IPOIB_UD_LSO)
  1128				qp->flags |= MLX4_IB_QP_LSO;
  1129	
  1130			if (init_attr->create_flags & IB_QP_CREATE_NETIF_QP) {
  1131				if (dev->steering_support ==
  1132				    MLX4_STEERING_MODE_DEVICE_MANAGED)
  1133					qp->flags |= MLX4_IB_QP_NETIF;
  1134				else
  1135					goto err;
  1136			}
  1137	
  1138			memcpy(&backup_cap, &init_attr->cap, sizeof(backup_cap));
  1139			err = set_kernel_sq_size(dev, &init_attr->cap,
  1140						 qp_type, qp, true);
  1141			if (err)
  1142				goto err;
  1143	
  1144			if (qp_has_rq(init_attr)) {
  1145				err = mlx4_db_alloc(dev->dev, &qp->db, 0);
  1146				if (err)
  1147					goto err;
  1148	
  1149				*qp->db.db = 0;
  1150			}
  1151	
  1152			if (mlx4_buf_alloc(dev->dev, qp->buf_size, qp->buf_size,
  1153					   &qp->buf)) {
  1154				memcpy(&init_attr->cap, &backup_cap,
  1155				       sizeof(backup_cap));
  1156				err = set_kernel_sq_size(dev, &init_attr->cap, qp_type,
  1157							 qp, false);
  1158				if (err)
  1159					goto err_db;
  1160	
  1161				if (mlx4_buf_alloc(dev->dev, qp->buf_size,
  1162						   PAGE_SIZE * 2, &qp->buf)) {
  1163					err = -ENOMEM;
  1164					goto err_db;
  1165				}
  1166			}
  1167	
  1168			err = mlx4_mtt_init(dev->dev, qp->buf.npages, qp->buf.page_shift,
  1169					    &qp->mtt);
  1170			if (err)
  1171				goto err_buf;
  1172	
  1173			err = mlx4_buf_write_mtt(dev->dev, &qp->mtt, &qp->buf);
  1174			if (err)
  1175				goto err_mtt;
  1176	
  1177			qp->sq.wrid = kmalloc_array(qp->sq.wqe_cnt, sizeof(u64),
  1178						GFP_KERNEL | __GFP_NOWARN);
  1179			if (!qp->sq.wrid)
  1180				qp->sq.wrid = __vmalloc(qp->sq.wqe_cnt * sizeof(u64),
  1181							GFP_KERNEL, PAGE_KERNEL);
  1182			qp->rq.wrid = kmalloc_array(qp->rq.wqe_cnt, sizeof(u64),
  1183						GFP_KERNEL | __GFP_NOWARN);
  1184			if (!qp->rq.wrid)
  1185				qp->rq.wrid = __vmalloc(qp->rq.wqe_cnt * sizeof(u64),
  1186							GFP_KERNEL, PAGE_KERNEL);
  1187			if (!qp->sq.wrid || !qp->rq.wrid) {
  1188				err = -ENOMEM;
  1189				goto err_wrid;
  1190			}
  1191			qp->mqp.usage = MLX4_RES_USAGE_DRIVER;
  1192		}
  1193	
  1194		if (sqpn) {
  1195			if (qp->mlx4_ib_qp_type & (MLX4_IB_QPT_PROXY_SMI_OWNER |
  1196			    MLX4_IB_QPT_PROXY_SMI | MLX4_IB_QPT_PROXY_GSI)) {
  1197				if (alloc_proxy_bufs(pd->device, qp)) {
  1198					err = -ENOMEM;
  1199					goto err_wrid;
  1200				}
  1201			}
  1202		} else if (src == MLX4_IB_RWQ_SRC) {
  1203			err = mlx4_ib_alloc_wqn(to_mucontext(pd->uobject->context), qp,
                                                             ^^^^^^^^^^^^^^^^^^^^
Unchecked dereference.

  1204						range_size, &qpn);
  1205			if (err)

regards,
dan carpenter
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux