IB/mlx4: Load balance ports in port aggregation mode
When the mlx4 IB (RoCE) device works in link aggregation mode, it exposes a single port to upper layers. Therefore, applications always set '1' in port_num attribute when modifying a QP or creating an address handle. To make sure that a node uses all available ports the mlx4 driver will override the port_num attribute with a round robin policy. Signed-off-by: Moni Shoua <monis@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
此提交包含在:
@@ -1905,6 +1905,22 @@ int mlx4_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (mlx4_is_bonded(dev->dev) && (attr_mask & IB_QP_PORT)) {
|
||||
if ((cur_state == IB_QPS_RESET) && (new_state == IB_QPS_INIT)) {
|
||||
if ((ibqp->qp_type == IB_QPT_RC) ||
|
||||
(ibqp->qp_type == IB_QPT_UD) ||
|
||||
(ibqp->qp_type == IB_QPT_UC) ||
|
||||
(ibqp->qp_type == IB_QPT_RAW_PACKET) ||
|
||||
(ibqp->qp_type == IB_QPT_XRC_INI)) {
|
||||
attr->port_num = mlx4_ib_bond_next_port(dev);
|
||||
}
|
||||
} else {
|
||||
/* no sense in changing port_num
|
||||
* when ports are bonded */
|
||||
attr_mask &= ~IB_QP_PORT;
|
||||
}
|
||||
}
|
||||
|
||||
if ((attr_mask & IB_QP_PORT) &&
|
||||
(attr->port_num == 0 || attr->port_num > dev->num_ports)) {
|
||||
pr_debug("qpn 0x%x: invalid port number (%d) specified "
|
||||
@@ -1955,6 +1971,9 @@ int mlx4_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||
|
||||
err = __mlx4_ib_modify_qp(ibqp, attr, attr_mask, cur_state, new_state);
|
||||
|
||||
if (mlx4_is_bonded(dev->dev) && (attr_mask & IB_QP_PORT))
|
||||
attr->port_num = 1;
|
||||
|
||||
out:
|
||||
mutex_unlock(&qp->mutex);
|
||||
return err;
|
||||
|
新增問題並參考
封鎖使用者