|
@@ -1030,10 +1030,20 @@ static struct ib_qp *ipoib_cm_create_tx_qp(struct net_device *dev, struct ipoib_
|
|
|
.cap.max_send_sge = 1,
|
|
|
.sq_sig_type = IB_SIGNAL_ALL_WR,
|
|
|
.qp_type = IB_QPT_RC,
|
|
|
- .qp_context = tx
|
|
|
+ .qp_context = tx,
|
|
|
+ .create_flags = IB_QP_CREATE_USE_GFP_NOIO
|
|
|
};
|
|
|
|
|
|
- return ib_create_qp(priv->pd, &attr);
|
|
|
+ struct ib_qp *tx_qp;
|
|
|
+
|
|
|
+ tx_qp = ib_create_qp(priv->pd, &attr);
|
|
|
+ if (PTR_ERR(tx_qp) == -EINVAL) {
|
|
|
+ ipoib_warn(priv, "can't use GFP_NOIO for QPs on device %s, using GFP_KERNEL\n",
|
|
|
+ priv->ca->name);
|
|
|
+ attr.create_flags &= ~IB_QP_CREATE_USE_GFP_NOIO;
|
|
|
+ tx_qp = ib_create_qp(priv->pd, &attr);
|
|
|
+ }
|
|
|
+ return tx_qp;
|
|
|
}
|
|
|
|
|
|
static int ipoib_cm_send_req(struct net_device *dev,
|
|
@@ -1104,12 +1114,14 @@ static int ipoib_cm_tx_init(struct ipoib_cm_tx *p, u32 qpn,
|
|
|
struct ipoib_dev_priv *priv = netdev_priv(p->dev);
|
|
|
int ret;
|
|
|
|
|
|
- p->tx_ring = vzalloc(ipoib_sendq_size * sizeof *p->tx_ring);
|
|
|
+ p->tx_ring = __vmalloc(ipoib_sendq_size * sizeof *p->tx_ring,
|
|
|
+ GFP_NOIO, PAGE_KERNEL);
|
|
|
if (!p->tx_ring) {
|
|
|
ipoib_warn(priv, "failed to allocate tx ring\n");
|
|
|
ret = -ENOMEM;
|
|
|
goto err_tx;
|
|
|
}
|
|
|
+ memset(p->tx_ring, 0, ipoib_sendq_size * sizeof *p->tx_ring);
|
|
|
|
|
|
p->qp = ipoib_cm_create_tx_qp(p->dev, p);
|
|
|
if (IS_ERR(p->qp)) {
|