Index: access/ib_mad_priv.h
===================================================================
--- access/ib_mad_priv.h        (revision 1078)
+++ access/ib_mad_priv.h        (working copy)
@@ -153,6 +153,7 @@
        struct ib_mad_mgmt_class_table *version[MAX_MGMT_VERSION];
        struct list_head agent_list;
        struct workqueue_struct *wq;
+       struct work_struct work;
 
        spinlock_t send_list_lock;
        struct list_head send_posted_mad_list;
@@ -162,9 +163,6 @@
        struct list_head recv_posted_mad_list[IB_MAD_QPS_CORE];
        int recv_posted_mad_count[IB_MAD_QPS_CORE];
        u32 recv_wr_index[IB_MAD_QPS_CORE];
-
-       struct task_struct *mad_thread;
-       int thread_wake;
 };
 
 #endif /* __IB_MAD_PRIV_H__ */
Index: access/ib_mad.c
===================================================================
--- access/ib_mad.c     (revision 1078)
+++ access/ib_mad.c     (working copy)
@@ -1158,10 +1158,12 @@
 /*
  * IB MAD completion callback
  */
-static void ib_mad_completion_handler(struct ib_mad_port_private *port_priv)
+static void ib_mad_completion_handler(void *data)
 {
+       struct ib_mad_port_private *port_priv;
        struct ib_wc wc;
 
+       port_priv = (struct ib_mad_port_private*)data;
        ib_req_notify_cq(port_priv->cq, IB_CQ_NEXT_COMP);
        
        while (ib_poll_cq(port_priv->cq, 1, &wc) == 1) {
@@ -1333,57 +1335,10 @@
        spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
 }
 
-/*
- * IB MAD thread
- */
-static int ib_mad_thread(void *param)
-{
-       struct ib_mad_port_private *port_priv = param;
-
-       __set_current_state(TASK_RUNNING);
-
-       do {
-               port_priv->thread_wake = 0;
-               wmb();
-
-               ib_mad_completion_handler(port_priv);
-
-               set_current_state(TASK_INTERRUPTIBLE);
-               if (!port_priv->thread_wake)
-                       schedule();
-               __set_current_state(TASK_RUNNING);
-       } while (!kthread_should_stop());
-
-       return 0;
-}
-
-/*
- * Initialize the IB MAD thread
- */
-static int ib_mad_thread_init(struct ib_mad_port_private *port_priv)
-{
-       port_priv->thread_wake = 0;
-
-       port_priv->mad_thread = kthread_create(ib_mad_thread,
-                                              port_priv,
-                                              "ib_mad(%6s-%-2d)",
-                                              port_priv->device->name,
-                                              port_priv->port_num);
-       if (IS_ERR(port_priv->mad_thread)) {
-               printk(KERN_ERR PFX "Couldn't start ib_mad thread for %s port %d\n",
-                      port_priv->device->name, port_priv->port_num);
-               return PTR_ERR(port_priv->mad_thread);
-       }       
-       return 0;
-}
-
 static void ib_mad_thread_completion_handler(struct ib_cq *cq)
 {
        struct ib_mad_port_private *port_priv = cq->cq_context;
-
-       port_priv->thread_wake = 1;
-       wmb();
-       wake_up_process(port_priv->mad_thread);
+       queue_work(port_priv->wq, &port_priv->work);
 }
 
 static int ib_mad_post_receive_mad(struct ib_mad_port_private *port_priv,
@@ -1845,15 +1800,12 @@
                ret = -ENOMEM;
                goto error8;
        }
-
-       ret = ib_mad_thread_init(port_priv);
-       if (ret)
-               goto error9;
+       INIT_WORK(&port_priv->work, ib_mad_completion_handler, port_priv);
 
        ret = ib_mad_port_start(port_priv);
        if (ret) {
                printk(KERN_ERR PFX "Couldn't start port\n");
-               goto error10;
+               goto error9;
        }
 
        spin_lock_irqsave(&ib_mad_port_list_lock, flags);
@@ -1862,8 +1814,6 @@
 
        return 0;
 
-error10:
-       kthread_stop(port_priv->mad_thread);
 error9:
        destroy_workqueue(port_priv->wq);
 error8:
@@ -1903,7 +1853,7 @@
        spin_unlock_irqrestore(&ib_mad_port_list_lock, flags);
 
        ib_mad_port_stop(port_priv);
-       kthread_stop(port_priv->mad_thread);
+       flush_workqueue(port_priv->wq);
        destroy_workqueue(port_priv->wq);
        ib_destroy_qp(port_priv->qp[1]);
        ib_destroy_qp(port_priv->qp[0]);

-- 
_______________________________________________
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