RDMA fixes for 4.13
Subsystems (2)
cover RDMA fixes for 4.13
Hi Doug,
Those patches were found after you asked me if I have new patches for the rdma-rc and at that time I really didn't have.
There are three patches in this series, two from Majd and one from Noa.
The patch from Noa was the one which pushed me to send it now. Latest changes to support LID started to use port number to determine port type, and it is not always safe. This allows access to non-allocated memory, despite the fact that the scope of this attack is limited by the size of port (u8), but it is better to fix it now and don't bother ourselves with stable@ e.t.c.
The patches from Majd are fixing one panic and one as a followup to latest discussion with Selvin about common modify_port function.
Thanks
----------------------------------------------------------------
Majd Dibbiny (2):
IB/mlx5: Fix Raw Packet QP event handler assignment IB/mlx5: Always return success for RoCE modify port
Noa Osherovich (1):
IB/core: Avoid accessing non-allocated memory when inferring port type
drivers/infiniband/core/uverbs_cmd.c | 11 +++++++---- drivers/infiniband/core/verbs.c | 7 ++++++- drivers/infiniband/hw/mlx5/main.c | 6 ++++++ drivers/infiniband/hw/mlx5/qp.c | 1 + include/rdma/ib_verbs.h | 1 + 5 files changed, 21 insertions(+), 5 deletions(-)
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 20170823053542.17754-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
PATCH 1/3 IB/core: Avoid accessing non-allocated memory when inferring port type
From: Noa Osherovich <noaos-VPRAkNaXOzVWk0Htik3J/[email protected]>
Commit 44c58487d51a ("IB/core: Define 'ib' and 'roce' rdma_ah_attr types") introduced the concept of type in ah_attr:
* During ib_register_device, each port is checked for its type which is stored in ib_device's port_immutable array.
* During uverbs' modify_qp, the type is inferred using the port number in ib_uverbs_qp_dest struct (address vector) by accessing the relevant port_immutable array and the type is passed on to providers.
IB spec (version 1.3) enforces a valid port value only in Reset to Init. During Init to RTR, the address vector must be valid but port number is not mentioned as a field in the address vector, so its value is not validated, which leads to accesses to a non-allocated memory when inferring the port type.
Save the real port number in ib_qp during modify to Init (when the comp_mask indicates that the port number is valid) and use this value to infer the port type.
Avoid copying the address vector fields if the matching bit is not set in the attr_mask. Address vector can't be modified before the port, so no valid flow is affected.
--- drivers/infiniband/core/uverbs_cmd.c | 11 +++++++---- drivers/infiniband/core/verbs.c | 7 ++++++- include/rdma/ib_verbs.h | 1 + 3 files changed, 14 insertions(+), 5 deletions(-)
drivers/infiniband/core/uverbs_cmd.c +7 -4
@@ -1522,6 +1522,7 @@ static int create_qp(struct ib_uverbs_file *file, qp->qp_type = attr.qp_type;atomic_set (&qp->usecnt,0 );atomic_inc (&pd->usecnt); + qp->port =0 ;if (attr.send_cq)atomic_inc (&attr.send_cq->usecnt);if (attr.recv_cq)
@@ -1962,8 +1963,9 @@ static int modify_qp(struct ib_uverbs_file *file, attr->alt_timeout = cmd->base.alt_timeout; attr->rate_limit = cmd->rate_limit; - attr->ah_attr.type =rdma_ah_find_type (qp->device, - cmd->base.dest.port_num); +if (cmd->base.attr_mask &IB_QP_AV ) + attr->ah_attr.type =rdma_ah_find_type (qp->device, + cmd->base.dest.port_num);if (cmd->base.dest.is_global) { rdma_ah_set_grh(&attr->ah_attr, NULL, cmd->base.dest.flow_label,
@@ -1981,8 +1983,9 @@ static int modify_qp(struct ib_uverbs_file *file,rdma_ah_set_port_num (&attr->ah_attr, cmd->base.dest.port_num); - attr->alt_ah_attr.type =rdma_ah_find_type (qp->device, - cmd->base.dest.port_num); +if (cmd->base.attr_mask &IB_QP_ALT_PATH ) + attr->alt_ah_attr.type = +rdma_ah_find_type (qp->device, cmd->base.dest.port_num);if (cmd->base.alt_dest.is_global) { rdma_ah_set_grh(&attr->alt_ah_attr, NULL, cmd->base.alt_dest.flow_label,
drivers/infiniband/core/verbs.c +6 -1
@@ -838,6 +838,7 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,spin_lock_init (&qp->mr_lock);INIT_LIST_HEAD (&qp->rdma_mrs);INIT_LIST_HEAD (&qp->sig_mrs); + qp->port =0 ;if (qp_init_attr->qp_type ==IB_QPT_XRC_TGT )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,if (ret)return ret; } -return ib_security_modify_qp (qp, attr, attr_mask, udata); + ret =ib_security_modify_qp (qp, attr, attr_mask, udata); +if (!ret && (attr_mask &IB_QP_PORT )) + qp->port = attr->port_num; + +return ret; }EXPORT_SYMBOL (ib_modify_qp_with_udata);
include/rdma/ib_verbs.h +1 -0
@@ -1683,6 +1683,7 @@ struct ib_qp {enum ib_qp_type qp_type;struct ib_rwq_ind_table *rwq_ind_tbl;struct ib_qp_security *qp_sec; +u8 port; };struct ib_mr {
--
2.14.1
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 2/3 IB/mlx5: Fix Raw Packet QP event handler assignment
In reply to a message not in the archiveFrom: Majd Dibbiny <majd-VPRAkNaXOzVWk0Htik3J/[email protected]>
In case we have SQ and RQ for Raw Packet QP, the SQ's event handler wasn't assigned.
Fixing this by assigning event handler for each WQ after creation.
[ 1877.145243] Call Trace: [ 1877.148644] <IRQ> [ 1877.150580] [<ffffffffa07987c5>] ? mlx5_rsc_event+0x105/0x210 [mlx5_core] [ 1877.159581] [<ffffffffa0795bd7>] ? mlx5_cq_event+0x57/0xd0 [mlx5_core] [ 1877.167137] [<ffffffffa079208e>] mlx5_eq_int+0x53e/0x6c0 [mlx5_core] [ 1877.174526] [<ffffffff8101a679>] ? sched_clock+0x9/0x10 [ 1877.180753] [<ffffffff810f717e>] handle_irq_event_percpu+0x3e/0x1e0 [ 1877.188014] [<ffffffff810f735d>] handle_irq_event+0x3d/0x60 [ 1877.194567] [<ffffffff810f9fe7>] handle_edge_irq+0x77/0x130 [ 1877.201129] [<ffffffff81014c3f>] handle_irq+0xbf/0x150 [ 1877.207244] [<ffffffff815ed78a>] ? atomic_notifier_call_chain+0x1a/0x20 [ 1877.214829] [<ffffffff815f434f>] do_IRQ+0x4f/0xf0 [ 1877.220498] [<ffffffff815e94ad>] common_interrupt+0x6d/0x6d [ 1877.227025] <EOI> [ 1877.228967] [<ffffffff814834e2>] ? cpuidle_enter_state+0x52/0xc0 [ 1877.236990] [<ffffffff81483615>] cpuidle_idle_call+0xc5/0x200 [ 1877.243676] [<ffffffff8101bc7e>] arch_cpu_idle+0xe/0x30 [ 1877.249831] [<ffffffff810b4725>] cpu_startup_entry+0xf5/0x290 [ 1877.256513] [<ffffffff815cfee1>] start_secondary+0x265/0x27b [ 1877.263111] Code: Bad RIP value. [ 1877.267296] RIP [< (null)>] (null) [ 1877.273264] RSP <ffff88046fd63df8> [ 1877.277531] CR2: 0000000000000000
--- drivers/infiniband/hw/mlx5/qp.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/hw/mlx5/qp.c +1 -0
@@ -1238,6 +1238,7 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, goto err_destroy_tis; sq->base.container_mibqp = qp; + sq->base.mqp.event = mlx5_ib_qp_event; }if (qp->rq.wqe_cnt) {
--
2.14.1
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 3/3 IB/mlx5: Always return success for RoCE modify port
In reply to a message not in the archiveFrom: Majd Dibbiny <majd-VPRAkNaXOzVWk0Htik3J/[email protected]>
CM layer calls ib_modify_port() regardless of the link layer.
For the Ethernet ports, qkey violation and Port capabilities are meaningless. Therefore, always return success for ib_modify_port calls on the Ethernet ports.
--- drivers/infiniband/hw/mlx5/main.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/infiniband/hw/mlx5/main.c +6 -0
@@ -1085,6 +1085,12 @@ static int mlx5_ib_modify_port(struct ib_device *ibdev, u8 port, int mask,bool is_ib = (mlx5_ib_port_link_layer (ibdev, port) ==IB_LINK_LAYER_INFINIBAND ); +/* CM layer calls ib_modify_port() regardless of the link layer. For +* Ethernet ports, qkey violation and Port capabilities are meaningless. +*/ +if (!is_ib) +return 0 ; +if (MLX5_CAP_GEN (dev->mdev, ib_virt) && is_ib) { change_mask = props->clr_port_cap_mask | props->set_port_cap_mask; value = ~props->clr_port_cap_mask | props->set_port_cap_mask;
--
2.14.1
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 20170823053542.17754-4-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
Re: [PATCH rdma-rc 3/3] IB/mlx5: Always return success for RoCE modify port
Quoted 21 lines · Leon Romanovsky
From: Majd Dibbiny <majd-VPRAkNaXOzVWk0Htik3J/[email protected]>
CM layer calls
ib_modify_port()regardless of the link layer.For the Ethernet ports, qkey violation and Port capabilities are meaningless. Therefore, always return success for
ib_modify_portcalls on the Ethernet ports.Cc Selvin Xavier <selvin.xavier-dY08KVG/lbpWk0Htik3J/[email protected]>Signed-off-by Leon Romanovsky <[email protected]>--- drivers/infiniband/hw/mlx5/main.c | 6 ++++++ 1 file changed, 6 insertions(+)drivers/infiniband/hw/mlx5/main.c +0
-0
drivers/infiniband/hw/mlx5/main.c static int mlx5_ib_modify_port(struct ib_device *ibdev, u8 port, int mask, · line 1093
Quoted 9 lines
drivers/infiniband/hw/mlx5/main.c +6
-0@@ -1085,6 +1085,12 @@ static int mlx5_ib_modify_port(struct ib_device *ibdev, u8 port, int mask,bool is_ib = (mlx5_ib_port_link_layer (ibdev, port) ==IB_LINK_LAYER_INFINIBAND ); +/* CM layer calls ib_modify_port() regardless of the link layer. For +* Ethernet ports, qkey violation and Port capabilities are meaningless. +*/ +if (!is_ib) +return 0 ; +
Alternatively you better stick to the convention used in mlx5_ib_add and do the check there before installing the hook, like it is done for mlx5_ib_get_netdev.
Quoted 10 lines
drivers/infiniband/hw/mlx5/main.c +0
-1if (MLX5_CAP_GEN (dev->mdev, ib_virt) && is_ib) { change_mask = props->clr_port_cap_mask | props->set_port_cap_mask; value = ~props->clr_port_cap_mask | props->set_port_cap_mask; --2.14.1
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH rdma-rc 3/3] IB/mlx5: Always return success for RoCE modify port
Quoted 25 lines · Yuval Shaia
Quoted 24 lines · Leon Romanovsky
From: Majd Dibbiny <majd-VPRAkNaXOzVWk0Htik3J/[email protected]>
CM layer calls
ib_modify_port()regardless of the link layer.For the Ethernet ports, qkey violation and Port capabilities are meaningless. Therefore, always return success for
ib_modify_portcalls on the Ethernet ports.Cc Selvin Xavier <selvin.xavier-dY08KVG/lbpWk0Htik3J/[email protected]>Signed-off-by Leon Romanovsky <[email protected]>--- drivers/infiniband/hw/mlx5/main.c | 6 ++++++ 1 file changed, 6 insertions(+)drivers/infiniband/hw/mlx5/main.c +0
-0@@ -1085,6 +1085,12 @@ static int mlx5_ib_modify_port(struct ib_device *ibdev, u8 port, int mask,bool is_ib = (mlx5_ib_port_link_layer (ibdev, port) ==IB_LINK_LAYER_INFINIBAND );
Quoted 10 lines
drivers/infiniband/hw/mlx5/main.c static int mlx5_ib_modify_port(struct ib_device *ibdev, u8 port, int mask, · line 1093
Quoted 6 lines
drivers/infiniband/hw/mlx5/main.c +6
-0+/* CM layer calls ib_modify_port() regardless of the link layer. For +* Ethernet ports, qkey violation and Port capabilities are meaningless. +*/ +if (!is_ib) +return 0 ; +Alternatively you better stick to the convention used in
mlx5_ib_addand do the check there before installing the hook, like it is done formlx5_ib_get_netdev.
It is patch preparation to Selvin's common modify_qp change. In his change, it is checked outside of this function in global ib_modify_qp function.
Thanks
Quoted 11 lines
Quoted 11 lines
drivers/infiniband/hw/mlx5/main.c +0
-1if (MLX5_CAP_GEN (dev->mdev, ib_virt) && is_ib) { change_mask = props->clr_port_cap_mask | props->set_port_cap_mask; value = ~props->clr_port_cap_mask | props->set_port_cap_mask; --2.14.1
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Doug Ledford
AppliedQuoted 31 lines · Leon Romanovsky
Hi Doug,
Those patches were found after you asked me if I have new patches for the rdma-rc and at that time I really didn't have.
There are three patches in this series, two from Majd and one from Noa.
The patch from Noa was the one which pushed me to send it now. Latest changes to support LID started to use port number to determine port type, and it is not always safe. This allows access to non- allocated
memory, despite the fact that the scope of this attack is limited by the size
of port (u8), but it is better to fix it now and don't bother ourselves
with stable@e.t.c.The patches from Majd are fixing one panic and one as a followup to latest discussion with Selvin about common
modify_portfunction.Thanks
----------------------------------------------------------------
Majd Dibbiny (2):
IB/mlx5: Fix Raw Packet QP event handler assignment IB/mlx5: Always return success for RoCE modify portNoa Osherovich (1):
IB/core: Avoid accessing non-allocated memory when inferring
port type
Quoted 6 lines
drivers/infiniband/core/uverbs_cmd.c | 11 +++++++---- drivers/infiniband/core/verbs.c | 7 ++++++- drivers/infiniband/hw/mlx5/main.c | 6 ++++++ drivers/infiniband/hw/mlx5/qp.c | 1 + include/rdma/ib_verbs.h | 1 + 5 files changed, 21 insertions(+), 5 deletions(-)
Thanks, applied for -rc.
Signature · 8 lines
Doug Ledford <[email protected]> GPG KeyID: B826A3330E572FDD Key fingerprint = AE6B 1BDA 122B 23B4 265B 1274 B826 A333 0E57 2FDD -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html