diff options
| -rw-r--r-- | drivers/infiniband/core/uverbs_cmd.c | 13 | ||||
| -rw-r--r-- | drivers/infiniband/core/verbs.c | 7 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mlx5/main.c | 6 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mlx5/qp.c | 1 | ||||
| -rw-r--r-- | include/rdma/ib_verbs.h | 1 |
5 files changed, 22 insertions, 6 deletions
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index c551d2b275fd..739bd69ef1d4 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c | |||
| @@ -1015,7 +1015,7 @@ static struct ib_ucq_object *create_cq(struct ib_uverbs_file *file, | |||
| 1015 | cq->uobject = &obj->uobject; | 1015 | cq->uobject = &obj->uobject; |
| 1016 | cq->comp_handler = ib_uverbs_comp_handler; | 1016 | cq->comp_handler = ib_uverbs_comp_handler; |
| 1017 | cq->event_handler = ib_uverbs_cq_event_handler; | 1017 | cq->event_handler = ib_uverbs_cq_event_handler; |
| 1018 | cq->cq_context = &ev_file->ev_queue; | 1018 | cq->cq_context = ev_file ? &ev_file->ev_queue : NULL; |
| 1019 | atomic_set(&cq->usecnt, 0); | 1019 | atomic_set(&cq->usecnt, 0); |
| 1020 | 1020 | ||
| 1021 | obj->uobject.object = cq; | 1021 | obj->uobject.object = cq; |
| @@ -1522,6 +1522,7 @@ static int create_qp(struct ib_uverbs_file *file, | |||
| 1522 | qp->qp_type = attr.qp_type; | 1522 | qp->qp_type = attr.qp_type; |
| 1523 | atomic_set(&qp->usecnt, 0); | 1523 | atomic_set(&qp->usecnt, 0); |
| 1524 | atomic_inc(&pd->usecnt); | 1524 | atomic_inc(&pd->usecnt); |
| 1525 | qp->port = 0; | ||
| 1525 | if (attr.send_cq) | 1526 | if (attr.send_cq) |
| 1526 | atomic_inc(&attr.send_cq->usecnt); | 1527 | atomic_inc(&attr.send_cq->usecnt); |
| 1527 | if (attr.recv_cq) | 1528 | if (attr.recv_cq) |
| @@ -1962,8 +1963,9 @@ static int modify_qp(struct ib_uverbs_file *file, | |||
| 1962 | attr->alt_timeout = cmd->base.alt_timeout; | 1963 | attr->alt_timeout = cmd->base.alt_timeout; |
| 1963 | attr->rate_limit = cmd->rate_limit; | 1964 | attr->rate_limit = cmd->rate_limit; |
| 1964 | 1965 | ||
| 1965 | attr->ah_attr.type = rdma_ah_find_type(qp->device, | 1966 | if (cmd->base.attr_mask & IB_QP_AV) |
| 1966 | cmd->base.dest.port_num); | 1967 | attr->ah_attr.type = rdma_ah_find_type(qp->device, |
| 1968 | cmd->base.dest.port_num); | ||
| 1967 | if (cmd->base.dest.is_global) { | 1969 | if (cmd->base.dest.is_global) { |
| 1968 | rdma_ah_set_grh(&attr->ah_attr, NULL, | 1970 | rdma_ah_set_grh(&attr->ah_attr, NULL, |
| 1969 | cmd->base.dest.flow_label, | 1971 | cmd->base.dest.flow_label, |
| @@ -1981,8 +1983,9 @@ static int modify_qp(struct ib_uverbs_file *file, | |||
| 1981 | rdma_ah_set_port_num(&attr->ah_attr, | 1983 | rdma_ah_set_port_num(&attr->ah_attr, |
| 1982 | cmd->base.dest.port_num); | 1984 | cmd->base.dest.port_num); |
| 1983 | 1985 | ||
| 1984 | attr->alt_ah_attr.type = rdma_ah_find_type(qp->device, | 1986 | if (cmd->base.attr_mask & IB_QP_ALT_PATH) |
| 1985 | cmd->base.dest.port_num); | 1987 | attr->alt_ah_attr.type = |
| 1988 | rdma_ah_find_type(qp->device, cmd->base.dest.port_num); | ||
| 1986 | if (cmd->base.alt_dest.is_global) { | 1989 | if (cmd->base.alt_dest.is_global) { |
| 1987 | rdma_ah_set_grh(&attr->alt_ah_attr, NULL, | 1990 | rdma_ah_set_grh(&attr->alt_ah_attr, NULL, |
| 1988 | cmd->base.alt_dest.flow_label, | 1991 | cmd->base.alt_dest.flow_label, |
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index 7f8fe443df46..b456e3ca1876 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c | |||
| @@ -838,6 +838,7 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, | |||
| 838 | spin_lock_init(&qp->mr_lock); | 838 | spin_lock_init(&qp->mr_lock); |
| 839 | INIT_LIST_HEAD(&qp->rdma_mrs); | 839 | INIT_LIST_HEAD(&qp->rdma_mrs); |
| 840 | INIT_LIST_HEAD(&qp->sig_mrs); | 840 | INIT_LIST_HEAD(&qp->sig_mrs); |
| 841 | qp->port = 0; | ||
| 841 | 842 | ||
| 842 | if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) | 843 | if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) |
| 843 | return ib_create_xrc_qp(qp, qp_init_attr); | 844 | return ib_create_xrc_qp(qp, qp_init_attr); |
| @@ -1297,7 +1298,11 @@ int ib_modify_qp_with_udata(struct ib_qp *qp, struct ib_qp_attr *attr, | |||
| 1297 | if (ret) | 1298 | if (ret) |
| 1298 | return ret; | 1299 | return ret; |
| 1299 | } | 1300 | } |
| 1300 | return ib_security_modify_qp(qp, attr, attr_mask, udata); | 1301 | ret = ib_security_modify_qp(qp, attr, attr_mask, udata); |
| 1302 | if (!ret && (attr_mask & IB_QP_PORT)) | ||
| 1303 | qp->port = attr->port_num; | ||
| 1304 | |||
| 1305 | return ret; | ||
| 1301 | } | 1306 | } |
| 1302 | EXPORT_SYMBOL(ib_modify_qp_with_udata); | 1307 | EXPORT_SYMBOL(ib_modify_qp_with_udata); |
| 1303 | 1308 | ||
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index a7f2e60085c4..f7fcde1ff0aa 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c | |||
| @@ -1085,6 +1085,12 @@ static int mlx5_ib_modify_port(struct ib_device *ibdev, u8 port, int mask, | |||
| 1085 | bool is_ib = (mlx5_ib_port_link_layer(ibdev, port) == | 1085 | bool is_ib = (mlx5_ib_port_link_layer(ibdev, port) == |
| 1086 | IB_LINK_LAYER_INFINIBAND); | 1086 | IB_LINK_LAYER_INFINIBAND); |
| 1087 | 1087 | ||
| 1088 | /* CM layer calls ib_modify_port() regardless of the link layer. For | ||
| 1089 | * Ethernet ports, qkey violation and Port capabilities are meaningless. | ||
| 1090 | */ | ||
| 1091 | if (!is_ib) | ||
| 1092 | return 0; | ||
| 1093 | |||
| 1088 | if (MLX5_CAP_GEN(dev->mdev, ib_virt) && is_ib) { | 1094 | if (MLX5_CAP_GEN(dev->mdev, ib_virt) && is_ib) { |
| 1089 | change_mask = props->clr_port_cap_mask | props->set_port_cap_mask; | 1095 | change_mask = props->clr_port_cap_mask | props->set_port_cap_mask; |
| 1090 | value = ~props->clr_port_cap_mask | props->set_port_cap_mask; | 1096 | value = ~props->clr_port_cap_mask | props->set_port_cap_mask; |
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c index 0889ff367c86..f58f8f5f3ebe 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c | |||
| @@ -1238,6 +1238,7 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, | |||
| 1238 | goto err_destroy_tis; | 1238 | goto err_destroy_tis; |
| 1239 | 1239 | ||
| 1240 | sq->base.container_mibqp = qp; | 1240 | sq->base.container_mibqp = qp; |
| 1241 | sq->base.mqp.event = mlx5_ib_qp_event; | ||
| 1241 | } | 1242 | } |
| 1242 | 1243 | ||
| 1243 | if (qp->rq.wqe_cnt) { | 1244 | if (qp->rq.wqe_cnt) { |
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index b5732432bb29..88c32aba32f7 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
| @@ -1683,6 +1683,7 @@ struct ib_qp { | |||
| 1683 | enum ib_qp_type qp_type; | 1683 | enum ib_qp_type qp_type; |
| 1684 | struct ib_rwq_ind_table *rwq_ind_tbl; | 1684 | struct ib_rwq_ind_table *rwq_ind_tbl; |
| 1685 | struct ib_qp_security *qp_sec; | 1685 | struct ib_qp_security *qp_sec; |
| 1686 | u8 port; | ||
| 1686 | }; | 1687 | }; |
| 1687 | 1688 | ||
| 1688 | struct ib_mr { | 1689 | struct ib_mr { |
