Some of these spin_lock_irqsave()s are too conservative.  For example:

 >  static void __exit ib_cm_cleanup(void)
 >  {
 > +    struct cm_timewait_info *timewait_info;
 > +    unsigned long flags;
 > +
 > +    spin_lock_irqsave(&cm.lock, flags);
 > +    list_for_each_entry(timewait_info, &cm.timewait_list, list)
 > +            cancel_delayed_work(&timewait_info->work.work);
 > +    spin_unlock_irqrestore(&cm.lock, flags);
 > +
 >      destroy_workqueue(cm.wq);

destroy_workqueue() can only be called in process context -- so it
is fine to just use spin_lock_irq() above.

 > +
 > +    while (!list_empty(&cm.timewait_list)) {
 > +            timewait_info = container_of(cm.timewait_list.next,
 > +                                         struct cm_timewait_info, list);
 > +            list_del(&timewait_info->list);
 > +            kfree(timewait_info);
 > +    }

list_for_each_entry_safe() here?  I assume nothing is getting added to
the list while the loop runs...

 > +
 >      ib_unregister_client(&cm_client);
 >      idr_destroy(&cm.local_id_table);
 >  }

_______________________________________________
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