Loading drivers/infiniband/hw/mlx4/qp.c +19 −9 Original line number Original line Diff line number Diff line Loading @@ -1462,7 +1462,8 @@ static void __set_data_seg(struct mlx4_wqe_data_seg *dseg, struct ib_sge *sg) } } static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, struct ib_send_wr *wr, static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, struct ib_send_wr *wr, struct mlx4_ib_qp *qp, unsigned *lso_seg_len) struct mlx4_ib_qp *qp, unsigned *lso_seg_len, __be32 *lso_hdr_sz) { { unsigned halign = ALIGN(sizeof *wqe + wr->wr.ud.hlen, 16); unsigned halign = ALIGN(sizeof *wqe + wr->wr.ud.hlen, 16); Loading @@ -1479,12 +1480,8 @@ static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, struct ib_send_wr *wr, memcpy(wqe->header, wr->wr.ud.header, wr->wr.ud.hlen); memcpy(wqe->header, wr->wr.ud.header, wr->wr.ud.hlen); /* make sure LSO header is written before overwriting stamping */ *lso_hdr_sz = cpu_to_be32((wr->wr.ud.mss - wr->wr.ud.hlen) << 16 | wmb(); wqe->mss_hdr_size = cpu_to_be32((wr->wr.ud.mss - wr->wr.ud.hlen) << 16 | wr->wr.ud.hlen); wr->wr.ud.hlen); *lso_seg_len = halign; *lso_seg_len = halign; return 0; return 0; } } Loading Loading @@ -1518,6 +1515,9 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, int uninitialized_var(stamp); int uninitialized_var(stamp); int uninitialized_var(size); int uninitialized_var(size); unsigned uninitialized_var(seglen); unsigned uninitialized_var(seglen); __be32 dummy; __be32 *lso_wqe; __be32 uninitialized_var(lso_hdr_sz); int i; int i; spin_lock_irqsave(&qp->sq.lock, flags); spin_lock_irqsave(&qp->sq.lock, flags); Loading @@ -1525,6 +1525,8 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, ind = qp->sq_next_wqe; ind = qp->sq_next_wqe; for (nreq = 0; wr; ++nreq, wr = wr->next) { for (nreq = 0; wr; ++nreq, wr = wr->next) { lso_wqe = &dummy; if (mlx4_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq)) { if (mlx4_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq)) { err = -ENOMEM; err = -ENOMEM; *bad_wr = wr; *bad_wr = wr; Loading Loading @@ -1606,11 +1608,12 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, size += sizeof (struct mlx4_wqe_datagram_seg) / 16; size += sizeof (struct mlx4_wqe_datagram_seg) / 16; if (wr->opcode == IB_WR_LSO) { if (wr->opcode == IB_WR_LSO) { err = build_lso_seg(wqe, wr, qp, &seglen); err = build_lso_seg(wqe, wr, qp, &seglen, &lso_hdr_sz); if (unlikely(err)) { if (unlikely(err)) { *bad_wr = wr; *bad_wr = wr; goto out; goto out; } } lso_wqe = (__be32 *) wqe; wqe += seglen; wqe += seglen; size += seglen / 16; size += seglen / 16; } } Loading Loading @@ -1652,6 +1655,14 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, for (i = wr->num_sge - 1; i >= 0; --i, --dseg) for (i = wr->num_sge - 1; i >= 0; --i, --dseg) set_data_seg(dseg, wr->sg_list + i); set_data_seg(dseg, wr->sg_list + i); /* * Possibly overwrite stamping in cacheline with LSO * segment only after making sure all data segments * are written. */ wmb(); *lso_wqe = lso_hdr_sz; ctrl->fence_size = (wr->send_flags & IB_SEND_FENCE ? ctrl->fence_size = (wr->send_flags & IB_SEND_FENCE ? MLX4_WQE_CTRL_FENCE : 0) | size; MLX4_WQE_CTRL_FENCE : 0) | size; Loading Loading @@ -1686,7 +1697,6 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, stamp_send_wqe(qp, stamp, size * 16); stamp_send_wqe(qp, stamp, size * 16); ind = pad_wraparound(qp, ind); ind = pad_wraparound(qp, ind); } } } } out: out: Loading drivers/infiniband/ulp/ipoib/ipoib_main.c +15 −12 Original line number Original line Diff line number Diff line Loading @@ -106,23 +106,17 @@ int ipoib_open(struct net_device *dev) ipoib_dbg(priv, "bringing up interface\n"); ipoib_dbg(priv, "bringing up interface\n"); set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) napi_enable(&priv->napi); if (ipoib_pkey_dev_delay_open(dev)) if (ipoib_pkey_dev_delay_open(dev)) return 0; return 0; napi_enable(&priv->napi); if (ipoib_ib_dev_open(dev)) goto err_disable; if (ipoib_ib_dev_open(dev)) { if (ipoib_ib_dev_up(dev)) napi_disable(&priv->napi); goto err_stop; return -EINVAL; } if (ipoib_ib_dev_up(dev)) { ipoib_ib_dev_stop(dev, 1); napi_disable(&priv->napi); return -EINVAL; } if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { struct ipoib_dev_priv *cpriv; struct ipoib_dev_priv *cpriv; Loading @@ -144,6 +138,15 @@ int ipoib_open(struct net_device *dev) netif_start_queue(dev); netif_start_queue(dev); return 0; return 0; err_stop: ipoib_ib_dev_stop(dev, 1); err_disable: napi_disable(&priv->napi); clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); return -EINVAL; } } static int ipoib_stop(struct net_device *dev) static int ipoib_stop(struct net_device *dev) Loading drivers/infiniband/ulp/ipoib/ipoib_multicast.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -409,7 +409,7 @@ static int ipoib_mcast_join_complete(int status, } } if (mcast->logcount++ < 20) { if (mcast->logcount++ < 20) { if (status == -ETIMEDOUT) { if (status == -ETIMEDOUT || status == -EAGAIN) { ipoib_dbg_mcast(priv, "multicast join failed for %pI6, status %d\n", ipoib_dbg_mcast(priv, "multicast join failed for %pI6, status %d\n", mcast->mcmember.mgid.raw, status); mcast->mcmember.mgid.raw, status); } else { } else { Loading drivers/infiniband/ulp/ipoib/ipoib_vlan.c +8 −3 Original line number Original line Diff line number Diff line Loading @@ -61,6 +61,7 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) ppriv = netdev_priv(pdev); ppriv = netdev_priv(pdev); rtnl_lock(); mutex_lock(&ppriv->vlan_mutex); mutex_lock(&ppriv->vlan_mutex); /* /* Loading Loading @@ -111,7 +112,7 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) goto device_init_failed; goto device_init_failed; } } result = register_netdev(priv->dev); result = register_netdevice(priv->dev); if (result) { if (result) { ipoib_warn(priv, "failed to initialize; error %i", result); ipoib_warn(priv, "failed to initialize; error %i", result); goto register_failed; goto register_failed; Loading @@ -134,12 +135,13 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) list_add_tail(&priv->list, &ppriv->child_intfs); list_add_tail(&priv->list, &ppriv->child_intfs); mutex_unlock(&ppriv->vlan_mutex); mutex_unlock(&ppriv->vlan_mutex); rtnl_unlock(); return 0; return 0; sysfs_failed: sysfs_failed: ipoib_delete_debug_files(priv->dev); ipoib_delete_debug_files(priv->dev); unregister_netdev(priv->dev); unregister_netdevice(priv->dev); register_failed: register_failed: ipoib_dev_cleanup(priv->dev); ipoib_dev_cleanup(priv->dev); Loading @@ -149,6 +151,7 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) err: err: mutex_unlock(&ppriv->vlan_mutex); mutex_unlock(&ppriv->vlan_mutex); rtnl_unlock(); return result; return result; } } Loading @@ -162,10 +165,11 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) ppriv = netdev_priv(pdev); ppriv = netdev_priv(pdev); rtnl_lock(); mutex_lock(&ppriv->vlan_mutex); mutex_lock(&ppriv->vlan_mutex); list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) { list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) { if (priv->pkey == pkey) { if (priv->pkey == pkey) { unregister_netdev(priv->dev); unregister_netdevice(priv->dev); ipoib_dev_cleanup(priv->dev); ipoib_dev_cleanup(priv->dev); list_del(&priv->list); list_del(&priv->list); free_netdev(priv->dev); free_netdev(priv->dev); Loading @@ -175,6 +179,7 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) } } } } mutex_unlock(&ppriv->vlan_mutex); mutex_unlock(&ppriv->vlan_mutex); rtnl_unlock(); return ret; return ret; } } drivers/net/mlx4/profile.c +3 −3 Original line number Original line Diff line number Diff line Loading @@ -107,7 +107,7 @@ u64 mlx4_make_profile(struct mlx4_dev *dev, profile[MLX4_RES_AUXC].num = request->num_qp; profile[MLX4_RES_AUXC].num = request->num_qp; profile[MLX4_RES_SRQ].num = request->num_srq; profile[MLX4_RES_SRQ].num = request->num_srq; profile[MLX4_RES_CQ].num = request->num_cq; profile[MLX4_RES_CQ].num = request->num_cq; profile[MLX4_RES_EQ].num = min(dev_cap->max_eqs, profile[MLX4_RES_EQ].num = min_t(unsigned, dev_cap->max_eqs, dev_cap->reserved_eqs + dev_cap->reserved_eqs + num_possible_cpus() + 1); num_possible_cpus() + 1); profile[MLX4_RES_DMPT].num = request->num_mpt; profile[MLX4_RES_DMPT].num = request->num_mpt; Loading Loading
drivers/infiniband/hw/mlx4/qp.c +19 −9 Original line number Original line Diff line number Diff line Loading @@ -1462,7 +1462,8 @@ static void __set_data_seg(struct mlx4_wqe_data_seg *dseg, struct ib_sge *sg) } } static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, struct ib_send_wr *wr, static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, struct ib_send_wr *wr, struct mlx4_ib_qp *qp, unsigned *lso_seg_len) struct mlx4_ib_qp *qp, unsigned *lso_seg_len, __be32 *lso_hdr_sz) { { unsigned halign = ALIGN(sizeof *wqe + wr->wr.ud.hlen, 16); unsigned halign = ALIGN(sizeof *wqe + wr->wr.ud.hlen, 16); Loading @@ -1479,12 +1480,8 @@ static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, struct ib_send_wr *wr, memcpy(wqe->header, wr->wr.ud.header, wr->wr.ud.hlen); memcpy(wqe->header, wr->wr.ud.header, wr->wr.ud.hlen); /* make sure LSO header is written before overwriting stamping */ *lso_hdr_sz = cpu_to_be32((wr->wr.ud.mss - wr->wr.ud.hlen) << 16 | wmb(); wqe->mss_hdr_size = cpu_to_be32((wr->wr.ud.mss - wr->wr.ud.hlen) << 16 | wr->wr.ud.hlen); wr->wr.ud.hlen); *lso_seg_len = halign; *lso_seg_len = halign; return 0; return 0; } } Loading Loading @@ -1518,6 +1515,9 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, int uninitialized_var(stamp); int uninitialized_var(stamp); int uninitialized_var(size); int uninitialized_var(size); unsigned uninitialized_var(seglen); unsigned uninitialized_var(seglen); __be32 dummy; __be32 *lso_wqe; __be32 uninitialized_var(lso_hdr_sz); int i; int i; spin_lock_irqsave(&qp->sq.lock, flags); spin_lock_irqsave(&qp->sq.lock, flags); Loading @@ -1525,6 +1525,8 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, ind = qp->sq_next_wqe; ind = qp->sq_next_wqe; for (nreq = 0; wr; ++nreq, wr = wr->next) { for (nreq = 0; wr; ++nreq, wr = wr->next) { lso_wqe = &dummy; if (mlx4_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq)) { if (mlx4_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq)) { err = -ENOMEM; err = -ENOMEM; *bad_wr = wr; *bad_wr = wr; Loading Loading @@ -1606,11 +1608,12 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, size += sizeof (struct mlx4_wqe_datagram_seg) / 16; size += sizeof (struct mlx4_wqe_datagram_seg) / 16; if (wr->opcode == IB_WR_LSO) { if (wr->opcode == IB_WR_LSO) { err = build_lso_seg(wqe, wr, qp, &seglen); err = build_lso_seg(wqe, wr, qp, &seglen, &lso_hdr_sz); if (unlikely(err)) { if (unlikely(err)) { *bad_wr = wr; *bad_wr = wr; goto out; goto out; } } lso_wqe = (__be32 *) wqe; wqe += seglen; wqe += seglen; size += seglen / 16; size += seglen / 16; } } Loading Loading @@ -1652,6 +1655,14 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, for (i = wr->num_sge - 1; i >= 0; --i, --dseg) for (i = wr->num_sge - 1; i >= 0; --i, --dseg) set_data_seg(dseg, wr->sg_list + i); set_data_seg(dseg, wr->sg_list + i); /* * Possibly overwrite stamping in cacheline with LSO * segment only after making sure all data segments * are written. */ wmb(); *lso_wqe = lso_hdr_sz; ctrl->fence_size = (wr->send_flags & IB_SEND_FENCE ? ctrl->fence_size = (wr->send_flags & IB_SEND_FENCE ? MLX4_WQE_CTRL_FENCE : 0) | size; MLX4_WQE_CTRL_FENCE : 0) | size; Loading Loading @@ -1686,7 +1697,6 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, stamp_send_wqe(qp, stamp, size * 16); stamp_send_wqe(qp, stamp, size * 16); ind = pad_wraparound(qp, ind); ind = pad_wraparound(qp, ind); } } } } out: out: Loading
drivers/infiniband/ulp/ipoib/ipoib_main.c +15 −12 Original line number Original line Diff line number Diff line Loading @@ -106,23 +106,17 @@ int ipoib_open(struct net_device *dev) ipoib_dbg(priv, "bringing up interface\n"); ipoib_dbg(priv, "bringing up interface\n"); set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) napi_enable(&priv->napi); if (ipoib_pkey_dev_delay_open(dev)) if (ipoib_pkey_dev_delay_open(dev)) return 0; return 0; napi_enable(&priv->napi); if (ipoib_ib_dev_open(dev)) goto err_disable; if (ipoib_ib_dev_open(dev)) { if (ipoib_ib_dev_up(dev)) napi_disable(&priv->napi); goto err_stop; return -EINVAL; } if (ipoib_ib_dev_up(dev)) { ipoib_ib_dev_stop(dev, 1); napi_disable(&priv->napi); return -EINVAL; } if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { struct ipoib_dev_priv *cpriv; struct ipoib_dev_priv *cpriv; Loading @@ -144,6 +138,15 @@ int ipoib_open(struct net_device *dev) netif_start_queue(dev); netif_start_queue(dev); return 0; return 0; err_stop: ipoib_ib_dev_stop(dev, 1); err_disable: napi_disable(&priv->napi); clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); return -EINVAL; } } static int ipoib_stop(struct net_device *dev) static int ipoib_stop(struct net_device *dev) Loading
drivers/infiniband/ulp/ipoib/ipoib_multicast.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -409,7 +409,7 @@ static int ipoib_mcast_join_complete(int status, } } if (mcast->logcount++ < 20) { if (mcast->logcount++ < 20) { if (status == -ETIMEDOUT) { if (status == -ETIMEDOUT || status == -EAGAIN) { ipoib_dbg_mcast(priv, "multicast join failed for %pI6, status %d\n", ipoib_dbg_mcast(priv, "multicast join failed for %pI6, status %d\n", mcast->mcmember.mgid.raw, status); mcast->mcmember.mgid.raw, status); } else { } else { Loading
drivers/infiniband/ulp/ipoib/ipoib_vlan.c +8 −3 Original line number Original line Diff line number Diff line Loading @@ -61,6 +61,7 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) ppriv = netdev_priv(pdev); ppriv = netdev_priv(pdev); rtnl_lock(); mutex_lock(&ppriv->vlan_mutex); mutex_lock(&ppriv->vlan_mutex); /* /* Loading Loading @@ -111,7 +112,7 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) goto device_init_failed; goto device_init_failed; } } result = register_netdev(priv->dev); result = register_netdevice(priv->dev); if (result) { if (result) { ipoib_warn(priv, "failed to initialize; error %i", result); ipoib_warn(priv, "failed to initialize; error %i", result); goto register_failed; goto register_failed; Loading @@ -134,12 +135,13 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) list_add_tail(&priv->list, &ppriv->child_intfs); list_add_tail(&priv->list, &ppriv->child_intfs); mutex_unlock(&ppriv->vlan_mutex); mutex_unlock(&ppriv->vlan_mutex); rtnl_unlock(); return 0; return 0; sysfs_failed: sysfs_failed: ipoib_delete_debug_files(priv->dev); ipoib_delete_debug_files(priv->dev); unregister_netdev(priv->dev); unregister_netdevice(priv->dev); register_failed: register_failed: ipoib_dev_cleanup(priv->dev); ipoib_dev_cleanup(priv->dev); Loading @@ -149,6 +151,7 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) err: err: mutex_unlock(&ppriv->vlan_mutex); mutex_unlock(&ppriv->vlan_mutex); rtnl_unlock(); return result; return result; } } Loading @@ -162,10 +165,11 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) ppriv = netdev_priv(pdev); ppriv = netdev_priv(pdev); rtnl_lock(); mutex_lock(&ppriv->vlan_mutex); mutex_lock(&ppriv->vlan_mutex); list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) { list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) { if (priv->pkey == pkey) { if (priv->pkey == pkey) { unregister_netdev(priv->dev); unregister_netdevice(priv->dev); ipoib_dev_cleanup(priv->dev); ipoib_dev_cleanup(priv->dev); list_del(&priv->list); list_del(&priv->list); free_netdev(priv->dev); free_netdev(priv->dev); Loading @@ -175,6 +179,7 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) } } } } mutex_unlock(&ppriv->vlan_mutex); mutex_unlock(&ppriv->vlan_mutex); rtnl_unlock(); return ret; return ret; } }
drivers/net/mlx4/profile.c +3 −3 Original line number Original line Diff line number Diff line Loading @@ -107,7 +107,7 @@ u64 mlx4_make_profile(struct mlx4_dev *dev, profile[MLX4_RES_AUXC].num = request->num_qp; profile[MLX4_RES_AUXC].num = request->num_qp; profile[MLX4_RES_SRQ].num = request->num_srq; profile[MLX4_RES_SRQ].num = request->num_srq; profile[MLX4_RES_CQ].num = request->num_cq; profile[MLX4_RES_CQ].num = request->num_cq; profile[MLX4_RES_EQ].num = min(dev_cap->max_eqs, profile[MLX4_RES_EQ].num = min_t(unsigned, dev_cap->max_eqs, dev_cap->reserved_eqs + dev_cap->reserved_eqs + num_possible_cpus() + 1); num_possible_cpus() + 1); profile[MLX4_RES_DMPT].num = request->num_mpt; profile[MLX4_RES_DMPT].num = request->num_mpt; Loading