diff options
| -rw-r--r-- | drivers/infiniband/hw/mlx4/qp.c | 28 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_main.c | 27 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 2 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_vlan.c | 11 | ||||
| -rw-r--r-- | drivers/net/mlx4/profile.c | 6 |
5 files changed, 46 insertions, 28 deletions
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c index 39167a797f99..a91cb4c3fa5c 100644 --- a/drivers/infiniband/hw/mlx4/qp.c +++ b/drivers/infiniband/hw/mlx4/qp.c | |||
| @@ -1462,7 +1462,8 @@ static void __set_data_seg(struct mlx4_wqe_data_seg *dseg, struct ib_sge *sg) | |||
| 1462 | } | 1462 | } |
| 1463 | 1463 | ||
| 1464 | static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, struct ib_send_wr *wr, | 1464 | static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, struct ib_send_wr *wr, |
| 1465 | struct mlx4_ib_qp *qp, unsigned *lso_seg_len) | 1465 | struct mlx4_ib_qp *qp, unsigned *lso_seg_len, |
| 1466 | __be32 *lso_hdr_sz) | ||
| 1466 | { | 1467 | { |
| 1467 | unsigned halign = ALIGN(sizeof *wqe + wr->wr.ud.hlen, 16); | 1468 | unsigned halign = ALIGN(sizeof *wqe + wr->wr.ud.hlen, 16); |
| 1468 | 1469 | ||
| @@ -1479,12 +1480,8 @@ static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, struct ib_send_wr *wr, | |||
| 1479 | 1480 | ||
| 1480 | memcpy(wqe->header, wr->wr.ud.header, wr->wr.ud.hlen); | 1481 | memcpy(wqe->header, wr->wr.ud.header, wr->wr.ud.hlen); |
| 1481 | 1482 | ||
| 1482 | /* make sure LSO header is written before overwriting stamping */ | 1483 | *lso_hdr_sz = cpu_to_be32((wr->wr.ud.mss - wr->wr.ud.hlen) << 16 | |
| 1483 | wmb(); | 1484 | wr->wr.ud.hlen); |
| 1484 | |||
| 1485 | wqe->mss_hdr_size = cpu_to_be32((wr->wr.ud.mss - wr->wr.ud.hlen) << 16 | | ||
| 1486 | wr->wr.ud.hlen); | ||
| 1487 | |||
| 1488 | *lso_seg_len = halign; | 1485 | *lso_seg_len = halign; |
| 1489 | return 0; | 1486 | return 0; |
| 1490 | } | 1487 | } |
| @@ -1518,6 +1515,9 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
| 1518 | int uninitialized_var(stamp); | 1515 | int uninitialized_var(stamp); |
| 1519 | int uninitialized_var(size); | 1516 | int uninitialized_var(size); |
| 1520 | unsigned uninitialized_var(seglen); | 1517 | unsigned uninitialized_var(seglen); |
| 1518 | __be32 dummy; | ||
| 1519 | __be32 *lso_wqe; | ||
| 1520 | __be32 uninitialized_var(lso_hdr_sz); | ||
| 1521 | int i; | 1521 | int i; |
| 1522 | 1522 | ||
| 1523 | spin_lock_irqsave(&qp->sq.lock, flags); | 1523 | spin_lock_irqsave(&qp->sq.lock, flags); |
| @@ -1525,6 +1525,8 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
| 1525 | ind = qp->sq_next_wqe; | 1525 | ind = qp->sq_next_wqe; |
| 1526 | 1526 | ||
| 1527 | for (nreq = 0; wr; ++nreq, wr = wr->next) { | 1527 | for (nreq = 0; wr; ++nreq, wr = wr->next) { |
| 1528 | lso_wqe = &dummy; | ||
| 1529 | |||
| 1528 | if (mlx4_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq)) { | 1530 | if (mlx4_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq)) { |
| 1529 | err = -ENOMEM; | 1531 | err = -ENOMEM; |
| 1530 | *bad_wr = wr; | 1532 | *bad_wr = wr; |
| @@ -1606,11 +1608,12 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
| 1606 | size += sizeof (struct mlx4_wqe_datagram_seg) / 16; | 1608 | size += sizeof (struct mlx4_wqe_datagram_seg) / 16; |
| 1607 | 1609 | ||
| 1608 | if (wr->opcode == IB_WR_LSO) { | 1610 | if (wr->opcode == IB_WR_LSO) { |
| 1609 | err = build_lso_seg(wqe, wr, qp, &seglen); | 1611 | err = build_lso_seg(wqe, wr, qp, &seglen, &lso_hdr_sz); |
| 1610 | if (unlikely(err)) { | 1612 | if (unlikely(err)) { |
| 1611 | *bad_wr = wr; | 1613 | *bad_wr = wr; |
| 1612 | goto out; | 1614 | goto out; |
| 1613 | } | 1615 | } |
| 1616 | lso_wqe = (__be32 *) wqe; | ||
| 1614 | wqe += seglen; | 1617 | wqe += seglen; |
| 1615 | size += seglen / 16; | 1618 | size += seglen / 16; |
| 1616 | } | 1619 | } |
| @@ -1652,6 +1655,14 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
| 1652 | for (i = wr->num_sge - 1; i >= 0; --i, --dseg) | 1655 | for (i = wr->num_sge - 1; i >= 0; --i, --dseg) |
| 1653 | set_data_seg(dseg, wr->sg_list + i); | 1656 | set_data_seg(dseg, wr->sg_list + i); |
| 1654 | 1657 | ||
| 1658 | /* | ||
| 1659 | * Possibly overwrite stamping in cacheline with LSO | ||
| 1660 | * segment only after making sure all data segments | ||
| 1661 | * are written. | ||
| 1662 | */ | ||
| 1663 | wmb(); | ||
| 1664 | *lso_wqe = lso_hdr_sz; | ||
| 1665 | |||
| 1655 | ctrl->fence_size = (wr->send_flags & IB_SEND_FENCE ? | 1666 | ctrl->fence_size = (wr->send_flags & IB_SEND_FENCE ? |
| 1656 | MLX4_WQE_CTRL_FENCE : 0) | size; | 1667 | MLX4_WQE_CTRL_FENCE : 0) | size; |
| 1657 | 1668 | ||
| @@ -1686,7 +1697,6 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
| 1686 | stamp_send_wqe(qp, stamp, size * 16); | 1697 | stamp_send_wqe(qp, stamp, size * 16); |
| 1687 | ind = pad_wraparound(qp, ind); | 1698 | ind = pad_wraparound(qp, ind); |
| 1688 | } | 1699 | } |
| 1689 | |||
| 1690 | } | 1700 | } |
| 1691 | 1701 | ||
| 1692 | out: | 1702 | out: |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index dce0443f9d69..0bd2a4ff0842 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
| @@ -106,23 +106,17 @@ int ipoib_open(struct net_device *dev) | |||
| 106 | 106 | ||
| 107 | ipoib_dbg(priv, "bringing up interface\n"); | 107 | ipoib_dbg(priv, "bringing up interface\n"); |
| 108 | 108 | ||
| 109 | set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); | 109 | if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) |
| 110 | napi_enable(&priv->napi); | ||
| 110 | 111 | ||
| 111 | if (ipoib_pkey_dev_delay_open(dev)) | 112 | if (ipoib_pkey_dev_delay_open(dev)) |
| 112 | return 0; | 113 | return 0; |
| 113 | 114 | ||
| 114 | napi_enable(&priv->napi); | 115 | if (ipoib_ib_dev_open(dev)) |
| 116 | goto err_disable; | ||
| 115 | 117 | ||
| 116 | if (ipoib_ib_dev_open(dev)) { | 118 | if (ipoib_ib_dev_up(dev)) |
| 117 | napi_disable(&priv->napi); | 119 | goto err_stop; |
| 118 | return -EINVAL; | ||
| 119 | } | ||
| 120 | |||
| 121 | if (ipoib_ib_dev_up(dev)) { | ||
| 122 | ipoib_ib_dev_stop(dev, 1); | ||
| 123 | napi_disable(&priv->napi); | ||
| 124 | return -EINVAL; | ||
| 125 | } | ||
| 126 | 120 | ||
| 127 | if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { | 121 | if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { |
| 128 | struct ipoib_dev_priv *cpriv; | 122 | struct ipoib_dev_priv *cpriv; |
| @@ -144,6 +138,15 @@ int ipoib_open(struct net_device *dev) | |||
| 144 | netif_start_queue(dev); | 138 | netif_start_queue(dev); |
| 145 | 139 | ||
| 146 | return 0; | 140 | return 0; |
| 141 | |||
| 142 | err_stop: | ||
| 143 | ipoib_ib_dev_stop(dev, 1); | ||
| 144 | |||
| 145 | err_disable: | ||
| 146 | napi_disable(&priv->napi); | ||
| 147 | clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); | ||
| 148 | |||
| 149 | return -EINVAL; | ||
| 147 | } | 150 | } |
| 148 | 151 | ||
| 149 | static int ipoib_stop(struct net_device *dev) | 152 | static int ipoib_stop(struct net_device *dev) |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index 59d02e0b8df1..425e31112ed7 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
| @@ -409,7 +409,7 @@ static int ipoib_mcast_join_complete(int status, | |||
| 409 | } | 409 | } |
| 410 | 410 | ||
| 411 | if (mcast->logcount++ < 20) { | 411 | if (mcast->logcount++ < 20) { |
| 412 | if (status == -ETIMEDOUT) { | 412 | if (status == -ETIMEDOUT || status == -EAGAIN) { |
| 413 | ipoib_dbg_mcast(priv, "multicast join failed for %pI6, status %d\n", | 413 | ipoib_dbg_mcast(priv, "multicast join failed for %pI6, status %d\n", |
| 414 | mcast->mcmember.mgid.raw, status); | 414 | mcast->mcmember.mgid.raw, status); |
| 415 | } else { | 415 | } else { |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c index 2cf1a4088718..5a76a5510350 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c | |||
| @@ -61,6 +61,7 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) | |||
| 61 | 61 | ||
| 62 | ppriv = netdev_priv(pdev); | 62 | ppriv = netdev_priv(pdev); |
| 63 | 63 | ||
| 64 | rtnl_lock(); | ||
| 64 | mutex_lock(&ppriv->vlan_mutex); | 65 | mutex_lock(&ppriv->vlan_mutex); |
| 65 | 66 | ||
| 66 | /* | 67 | /* |
| @@ -111,7 +112,7 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) | |||
| 111 | goto device_init_failed; | 112 | goto device_init_failed; |
| 112 | } | 113 | } |
| 113 | 114 | ||
| 114 | result = register_netdev(priv->dev); | 115 | result = register_netdevice(priv->dev); |
| 115 | if (result) { | 116 | if (result) { |
| 116 | ipoib_warn(priv, "failed to initialize; error %i", result); | 117 | ipoib_warn(priv, "failed to initialize; error %i", result); |
| 117 | goto register_failed; | 118 | goto register_failed; |
| @@ -134,12 +135,13 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) | |||
| 134 | list_add_tail(&priv->list, &ppriv->child_intfs); | 135 | list_add_tail(&priv->list, &ppriv->child_intfs); |
| 135 | 136 | ||
| 136 | mutex_unlock(&ppriv->vlan_mutex); | 137 | mutex_unlock(&ppriv->vlan_mutex); |
| 138 | rtnl_unlock(); | ||
| 137 | 139 | ||
| 138 | return 0; | 140 | return 0; |
| 139 | 141 | ||
| 140 | sysfs_failed: | 142 | sysfs_failed: |
| 141 | ipoib_delete_debug_files(priv->dev); | 143 | ipoib_delete_debug_files(priv->dev); |
| 142 | unregister_netdev(priv->dev); | 144 | unregister_netdevice(priv->dev); |
| 143 | 145 | ||
| 144 | register_failed: | 146 | register_failed: |
| 145 | ipoib_dev_cleanup(priv->dev); | 147 | ipoib_dev_cleanup(priv->dev); |
| @@ -149,6 +151,7 @@ device_init_failed: | |||
| 149 | 151 | ||
| 150 | err: | 152 | err: |
| 151 | mutex_unlock(&ppriv->vlan_mutex); | 153 | mutex_unlock(&ppriv->vlan_mutex); |
| 154 | rtnl_unlock(); | ||
| 152 | return result; | 155 | return result; |
| 153 | } | 156 | } |
| 154 | 157 | ||
| @@ -162,10 +165,11 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) | |||
| 162 | 165 | ||
| 163 | ppriv = netdev_priv(pdev); | 166 | ppriv = netdev_priv(pdev); |
| 164 | 167 | ||
| 168 | rtnl_lock(); | ||
| 165 | mutex_lock(&ppriv->vlan_mutex); | 169 | mutex_lock(&ppriv->vlan_mutex); |
| 166 | list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) { | 170 | list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) { |
| 167 | if (priv->pkey == pkey) { | 171 | if (priv->pkey == pkey) { |
| 168 | unregister_netdev(priv->dev); | 172 | unregister_netdevice(priv->dev); |
| 169 | ipoib_dev_cleanup(priv->dev); | 173 | ipoib_dev_cleanup(priv->dev); |
| 170 | list_del(&priv->list); | 174 | list_del(&priv->list); |
| 171 | free_netdev(priv->dev); | 175 | free_netdev(priv->dev); |
| @@ -175,6 +179,7 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) | |||
| 175 | } | 179 | } |
| 176 | } | 180 | } |
| 177 | mutex_unlock(&ppriv->vlan_mutex); | 181 | mutex_unlock(&ppriv->vlan_mutex); |
| 182 | rtnl_unlock(); | ||
| 178 | 183 | ||
| 179 | return ret; | 184 | return ret; |
| 180 | } | 185 | } |
diff --git a/drivers/net/mlx4/profile.c b/drivers/net/mlx4/profile.c index 919fb9eb1b62..cebdf3243ca1 100644 --- a/drivers/net/mlx4/profile.c +++ b/drivers/net/mlx4/profile.c | |||
| @@ -107,9 +107,9 @@ u64 mlx4_make_profile(struct mlx4_dev *dev, | |||
| 107 | profile[MLX4_RES_AUXC].num = request->num_qp; | 107 | profile[MLX4_RES_AUXC].num = request->num_qp; |
| 108 | profile[MLX4_RES_SRQ].num = request->num_srq; | 108 | profile[MLX4_RES_SRQ].num = request->num_srq; |
| 109 | profile[MLX4_RES_CQ].num = request->num_cq; | 109 | profile[MLX4_RES_CQ].num = request->num_cq; |
| 110 | profile[MLX4_RES_EQ].num = min(dev_cap->max_eqs, | 110 | profile[MLX4_RES_EQ].num = min_t(unsigned, dev_cap->max_eqs, |
| 111 | dev_cap->reserved_eqs + | 111 | dev_cap->reserved_eqs + |
| 112 | num_possible_cpus() + 1); | 112 | num_possible_cpus() + 1); |
| 113 | profile[MLX4_RES_DMPT].num = request->num_mpt; | 113 | profile[MLX4_RES_DMPT].num = request->num_mpt; |
| 114 | profile[MLX4_RES_CMPT].num = MLX4_NUM_CMPTS; | 114 | profile[MLX4_RES_CMPT].num = MLX4_NUM_CMPTS; |
| 115 | profile[MLX4_RES_MTT].num = request->num_mtt; | 115 | profile[MLX4_RES_MTT].num = request->num_mtt; |
