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