diff options
author | Shaun Ruffell <sruffell@digium.com> | 2010-04-03 00:03:58 +0000 |
---|---|---|
committer | Shaun Ruffell <sruffell@digium.com> | 2010-04-03 00:03:58 +0000 |
commit | 2136804d4a5c49bd61a877e5e761f85211016786 (patch) | |
tree | bfe99acb901ca768a77a5585bd2519a4dcdc4e08 /drivers/dahdi/wcte12xp/base.c | |
parent | 6ab7988dbd6f5cf378688fb388ddc92db42696d5 (diff) |
wcte12xp: Use our own workqueue for the timer and maint events.
When the latency is large and register reads can take 100s of milliseconds, the
alarm polling function could tie up one of the global workqueue threads long
enough to interfere with other system operations. Most noticeably the console.
DAHDI-573
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@8455 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/wcte12xp/base.c')
-rw-r--r-- | drivers/dahdi/wcte12xp/base.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/dahdi/wcte12xp/base.c b/drivers/dahdi/wcte12xp/base.c index 294a0f8..a1f1c42 100644 --- a/drivers/dahdi/wcte12xp/base.c +++ b/drivers/dahdi/wcte12xp/base.c @@ -696,6 +696,7 @@ static void free_wc(struct t1 *wc) list_del_init(&cmd->node); free_cmd(wc, cmd); } + destroy_workqueue(wc->wq); kfree(wc); } @@ -1263,7 +1264,7 @@ static int t1xxp_maint(struct dahdi_span *span, int cmd) #else INIT_WORK(&work->work, t1xxp_maint_work); #endif - schedule_work(&work->work); + queue_work(wc->wq, &work->work); return 0; } @@ -1924,7 +1925,7 @@ static void te12xp_timer(unsigned long data) { struct t1 *wc = (struct t1 *)data; - schedule_work(&wc->timer_work); + queue_work(wc->wq, &wc->timer_work); return; } @@ -1995,6 +1996,12 @@ static int __devinit te12xp_init_one(struct pci_dev *pdev, const struct pci_devi return res; } + wc->wq = create_singlethread_workqueue(wc->name); + if (!wc->wq) { + kfree(wc); + return -ENOMEM; + } + if (VOICEBUS_DEFAULT_LATENCY != latency) { voicebus_set_minlatency(&wc->vb, latency); voicebus_set_maxlatency(&wc->vb, max_latency); @@ -2049,7 +2056,7 @@ static void __devexit te12xp_remove_one(struct pci_dev *pdev) #endif clear_bit(INITIALIZED, &wc->bit_flags); del_timer_sync(&wc->timer); - flush_scheduled_work(); + flush_workqueue(wc->wq); del_timer_sync(&wc->timer); voicebus_release(&wc->vb); |