Move the removal of the work queue element to the 
end of the processing loop. This avoids the race with 
the cm_event_handler and obviates the need for the local
copy of the work structure.

I'll be testing this concurrently, but here's the patch for review...

Signed-off-by: Tom Tucker <[EMAIL PROTECTED]>

---

 drivers/infiniband/core/iwcm.c |   12 ++++--------
 1 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c
index c3fb304..3a14355 100644
--- a/drivers/infiniband/core/iwcm.c
+++ b/drivers/infiniband/core/iwcm.c
@@ -830,21 +830,15 @@ static int process_event(struct iwcm_id_
  */
 static void cm_work_handler(void *arg)
 {
-       struct iwcm_work *work = arg, lwork;
+       struct iwcm_work *work = arg;
        struct iwcm_id_private *cm_id_priv = work->cm_id;
        unsigned long flags;
-       int empty;
        int ret = 0;
 
        spin_lock_irqsave(&cm_id_priv->lock, flags);
-       empty = list_empty(&cm_id_priv->work_list);
-       while (!empty) {
+       while (!list_empty(&cm_id_priv->work_list)) {
                work = list_entry(cm_id_priv->work_list.next,
                                  struct iwcm_work, list);
-               list_del_init(&work->list);
-               empty = list_empty(&cm_id_priv->work_list);
-               lwork = *work;
-               put_work(work);
                spin_unlock_irqrestore(&cm_id_priv->lock, flags);
 
                ret = process_event(cm_id_priv, &work->event);
@@ -863,6 +857,8 @@ static void cm_work_handler(void *arg)
                        return;
                }
                spin_lock_irqsave(&cm_id_priv->lock, flags);
+               list_del_init(&work->list);
+               put_work(work);
        }
        spin_unlock_irqrestore(&cm_id_priv->lock, flags);
 }


_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to