aboutsummaryrefslogtreecommitdiff
path: root/sys/ofed
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2019-10-02 09:06:13 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2019-10-02 09:06:13 +0000
commit6fe20cefa3e1d66006ec704a5cc2e254e4ba0970 (patch)
treee947c1c0dd2ac70dbbae02e09712e082ac147047 /sys/ofed
parente8f206cc602021f0e70c5d12f16344ef0190fcc8 (diff)
Notes
Diffstat (limited to 'sys/ofed')
-rw-r--r--sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h4
-rw-r--r--sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c6
-rw-r--r--sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_ib.c11
-rw-r--r--sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c22
4 files changed, 29 insertions, 14 deletions
diff --git a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h
index 70cb4a384235..8f27a0dca03c 100644
--- a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -536,7 +536,7 @@ void ipoib_drain_cq(struct ipoib_dev_priv *priv);
int ipoib_dma_map_tx(struct ib_device *ca, struct ipoib_tx_buf *tx_req, int max);
void ipoib_dma_unmap_tx(struct ib_device *ca, struct ipoib_tx_buf *tx_req);
-int ipoib_poll_tx(struct ipoib_dev_priv *priv);
+int ipoib_poll_tx(struct ipoib_dev_priv *priv, bool do_start);
void ipoib_dma_unmap_rx(struct ipoib_dev_priv *priv, struct ipoib_rx_buf *rx_req);
void ipoib_dma_mb(struct ipoib_dev_priv *priv, struct mbuf *mb, unsigned int length);
@@ -764,4 +764,6 @@ extern int ipoib_debug_level;
#define IPOIB_QPN(ha) (be32_to_cpup((__be32 *) ha) & 0xffffff)
+void ipoib_start_locked(struct ifnet *, struct ipoib_dev_priv *);
+
#endif /* _IPOIB_H */
diff --git a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 119503d7726e..2f0ea2fc5783 100644
--- a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -618,8 +618,10 @@ void ipoib_cm_send(struct ipoib_dev_priv *priv, struct mbuf *mb, struct ipoib_cm
struct ipoib_cm_tx_buf *tx_req;
struct ifnet *dev = priv->dev;
- if (unlikely(priv->tx_outstanding > MAX_SEND_CQE))
- while (ipoib_poll_tx(priv)); /* nothing */
+ if (unlikely(priv->tx_outstanding > MAX_SEND_CQE)) {
+ while (ipoib_poll_tx(priv, false))
+ ; /* nothing */
+ }
m_adj(mb, sizeof(struct ipoib_pseudoheader));
if (unlikely(mb->m_pkthdr.len > tx->mtu)) {
diff --git a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index e38b450eb0b2..9cb2e9b1f8a6 100644
--- a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -366,7 +366,7 @@ static void ipoib_ib_handle_tx_wc(struct ipoib_dev_priv *priv, struct ib_wc *wc)
}
int
-ipoib_poll_tx(struct ipoib_dev_priv *priv)
+ipoib_poll_tx(struct ipoib_dev_priv *priv, bool do_start)
{
int n, i;
@@ -379,6 +379,9 @@ ipoib_poll_tx(struct ipoib_dev_priv *priv)
ipoib_ib_handle_tx_wc(priv, wc);
}
+ if (do_start && n != 0)
+ ipoib_start_locked(priv->dev, priv);
+
return n == MAX_SEND_CQE;
}
@@ -425,7 +428,7 @@ static void drain_tx_cq(struct ipoib_dev_priv *priv)
struct ifnet *dev = priv->dev;
spin_lock(&priv->lock);
- while (ipoib_poll_tx(priv))
+ while (ipoib_poll_tx(priv, true))
; /* nothing */
if (dev->if_drv_flags & IFF_DRV_OACTIVE)
@@ -482,7 +485,7 @@ ipoib_send(struct ipoib_dev_priv *priv, struct mbuf *mb,
void *phead;
if (unlikely(priv->tx_outstanding > MAX_SEND_CQE))
- while (ipoib_poll_tx(priv))
+ while (ipoib_poll_tx(priv, false))
; /* nothing */
m_adj(mb, sizeof (struct ipoib_pseudoheader));
@@ -762,7 +765,7 @@ void ipoib_drain_cq(struct ipoib_dev_priv *priv)
spin_unlock(&priv->drain_lock);
spin_lock(&priv->lock);
- while (ipoib_poll_tx(priv))
+ while (ipoib_poll_tx(priv, true))
; /* nothing */
spin_unlock(&priv->lock);
diff --git a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 4cd2e0d76a68..bb1efcc666a1 100644
--- a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -773,17 +773,13 @@ ipoib_send_one(struct ipoib_dev_priv *priv, struct mbuf *mb)
return 0;
}
-
-static void
-_ipoib_start(struct ifnet *dev, struct ipoib_dev_priv *priv)
+void
+ipoib_start_locked(struct ifnet *dev, struct ipoib_dev_priv *priv)
{
struct mbuf *mb;
- if ((dev->if_drv_flags & (IFF_DRV_RUNNING|IFF_DRV_OACTIVE)) !=
- IFF_DRV_RUNNING)
- return;
+ assert_spin_locked(&priv->lock);
- spin_lock(&priv->lock);
while (!IFQ_DRV_IS_EMPTY(&dev->if_snd) &&
(dev->if_drv_flags & IFF_DRV_OACTIVE) == 0) {
IFQ_DRV_DEQUEUE(&dev->if_snd, mb);
@@ -792,6 +788,18 @@ _ipoib_start(struct ifnet *dev, struct ipoib_dev_priv *priv)
IPOIB_MTAP(dev, mb);
ipoib_send_one(priv, mb);
}
+}
+
+static void
+_ipoib_start(struct ifnet *dev, struct ipoib_dev_priv *priv)
+{
+
+ if ((dev->if_drv_flags & (IFF_DRV_RUNNING|IFF_DRV_OACTIVE)) !=
+ IFF_DRV_RUNNING)
+ return;
+
+ spin_lock(&priv->lock);
+ ipoib_start_locked(dev, priv);
spin_unlock(&priv->lock);
}