IPoIB/cm: Optimize stale connection detection
In the presence of some running RX connections, we repeat queue_delayed_work calls each 4 RX WRs, which is a waste. It's enough to start stale task when a first passive connection is added, and rerun it every IPOIB_CM_RX_DELAY as long as there are outstanding passive connections. This removes some code from RX data path. Signed-off-by: Michael S. Tsirkin <mst@dev.mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
bd18c11277
commit
7c5b9ef857
1 changed files with 7 additions and 4 deletions
|
@ -257,10 +257,11 @@ static int ipoib_cm_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even
|
|||
cm_id->context = p;
|
||||
p->jiffies = jiffies;
|
||||
spin_lock_irq(&priv->lock);
|
||||
if (list_empty(&priv->cm.passive_ids))
|
||||
queue_delayed_work(ipoib_workqueue,
|
||||
&priv->cm.stale_task, IPOIB_CM_RX_DELAY);
|
||||
list_add(&p->list, &priv->cm.passive_ids);
|
||||
spin_unlock_irq(&priv->lock);
|
||||
queue_delayed_work(ipoib_workqueue,
|
||||
&priv->cm.stale_task, IPOIB_CM_RX_DELAY);
|
||||
return 0;
|
||||
|
||||
err_rep:
|
||||
|
@ -378,8 +379,6 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
|
|||
if (!list_empty(&p->list))
|
||||
list_move(&p->list, &priv->cm.passive_ids);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
queue_delayed_work(ipoib_workqueue,
|
||||
&priv->cm.stale_task, IPOIB_CM_RX_DELAY);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1100,6 +1099,10 @@ static void ipoib_cm_stale_task(struct work_struct *work)
|
|||
kfree(p);
|
||||
spin_lock_irq(&priv->lock);
|
||||
}
|
||||
|
||||
if (!list_empty(&priv->cm.passive_ids))
|
||||
queue_delayed_work(ipoib_workqueue,
|
||||
&priv->cm.stale_task, IPOIB_CM_RX_DELAY);
|
||||
spin_unlock_irq(&priv->lock);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue