]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/isdn/capi/kcapi.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / isdn / capi / kcapi.c
index 3acf94cc5acda3f056db58b559a8af477f6ae76a..2b33b2627fce5052fdf252ac13d225590c379f37 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/rcupdate.h>
 
 static int showcapimsgs = 0;
+static struct workqueue_struct *kcapi_wq;
 
 MODULE_DESCRIPTION("CAPI4Linux: kernel CAPI layer");
 MODULE_AUTHOR("Carsten Paeth");
@@ -291,7 +292,7 @@ static int notify_push(unsigned int event_type, u32 controller)
        event->type = event_type;
        event->controller = controller;
 
-       schedule_work(&event->work);
+       queue_work(kcapi_wq, &event->work);
        return 0;
 }
 
@@ -408,7 +409,7 @@ void capi_ctr_handle_message(struct capi_ctr *ctr, u16 appl,
                goto error;
        }
        skb_queue_tail(&ap->recv_queue, skb);
-       schedule_work(&ap->recv_work);
+       queue_work(kcapi_wq, &ap->recv_work);
        rcu_read_unlock();
 
        return;
@@ -743,7 +744,7 @@ u16 capi20_release(struct capi20_appl *ap)
 
        mutex_unlock(&capi_controller_lock);
 
-       flush_scheduled_work();
+       flush_workqueue(kcapi_wq);
        skb_queue_purge(&ap->recv_queue);
 
        if (showcapimsgs & 1) {
@@ -1285,21 +1286,30 @@ static int __init kcapi_init(void)
 {
        int err;
 
+       kcapi_wq = alloc_workqueue("kcapi", 0, 0);
+       if (!kcapi_wq)
+               return -ENOMEM;
+
        register_capictr_notifier(&capictr_nb);
 
        err = cdebug_init();
-       if (!err)
-               kcapi_proc_init();
-       return err;
+       if (err) {
+               unregister_capictr_notifier(&capictr_nb);
+               destroy_workqueue(kcapi_wq);
+               return err;
+       }
+
+       kcapi_proc_init();
+       return 0;
 }
 
 static void __exit kcapi_exit(void)
 {
         kcapi_proc_exit();
 
-       /* make sure all notifiers are finished */
-       flush_scheduled_work();
+       unregister_capictr_notifier(&capictr_nb);
        cdebug_exit();
+       destroy_workqueue(kcapi_wq);
 }
 
 module_init(kcapi_init);