Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=7c5b9ef8577bfa7b74ea58fc9ff2934ffce13532
Commit:     7c5b9ef8577bfa7b74ea58fc9ff2934ffce13532
Parent:     bd18c112774db5bb887adb981ffbe9bfe00b2f3a
Author:     Michael S. Tsirkin <[EMAIL PROTECTED]>
AuthorDate: Mon May 14 07:26:51 2007 +0300
Committer:  Roland Dreier <[EMAIL PROTECTED]>
CommitDate: Mon May 14 14:11:01 2007 -0700

    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 <[EMAIL PROTECTED]>
    Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>
---
 drivers/infiniband/ulp/ipoib/ipoib_cm.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c 
b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 785bc85..eec833b 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -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);
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to