Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branches 'ehca', 'ipoib' and 'mlx4' into for-linus

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