The patch number 9776 was added via Andy Walls <[EMAIL PROTECTED]>
to http://linuxtv.org/hg/v4l-dvb master development tree.
Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel
If anyone has any objections, please let us know by sending a message to:
[EMAIL PROTECTED]
------
From: Andy Walls <[EMAIL PROTECTED]>
cx18: Change to per CX23418 device work queues for deferrable work handling
cx18: Change to per CX23418 device work queues for deferrable work handling.
Needed to support 2.6.22 and earlier kernels that can't selectively cancel
work orders. Also will provide slightly better performance on SMP systems.
Priority: normal
Signed-off-by: Andy Walls <[EMAIL PROTECTED]>
---
linux/drivers/media/video/cx18/cx18-driver.c | 33 ++++++------------
linux/drivers/media/video/cx18/cx18-driver.h | 2 -
linux/drivers/media/video/cx18/cx18-mailbox.c | 2 -
3 files changed, 14 insertions(+), 23 deletions(-)
diff -r 8aabdabb517c -r 91440b07aa64
linux/drivers/media/video/cx18/cx18-driver.c
--- a/linux/drivers/media/video/cx18/cx18-driver.c Tue Nov 25 14:10:14
2008 -0200
+++ b/linux/drivers/media/video/cx18/cx18-driver.c Tue Nov 25 19:43:05
2008 -0500
@@ -55,9 +55,6 @@ struct cx18 *cx18_cards[CX18_MAX_CARDS];
/* Protects cx18_cards_active */
DEFINE_SPINLOCK(cx18_cards_lock);
-
-/* Queue for deferrable IRQ handling work for all cx18 cards in system */
-struct workqueue_struct *cx18_work_queue;
/* add your revision and whatnot here */
static struct pci_device_id cx18_pci_tbl[] __devinitdata = {
@@ -446,6 +443,12 @@ static int __devinit cx18_init_struct1(s
spin_lock_init(&cx->lock);
+ cx->work_queue = create_singlethread_workqueue(cx->name);
+ if (cx->work_queue == NULL) {
+ CX18_ERR("Unable to create work hander thread\n");
+ return -ENOMEM;
+ }
+
for (i = 0; i < CX18_MAX_EPU_WORK_ORDERS; i++) {
cx->epu_work_order[i].cx = cx;
cx->epu_work_order[i].str = cx->epu_debug_str;
@@ -660,12 +663,9 @@ static int __devinit cx18_probe(struct p
/* PCI Device Setup */
retval = cx18_setup_pci(cx, dev, pci_id);
- if (retval != 0) {
- if (retval == -EIO)
- goto free_workqueue;
- else if (retval == -ENXIO)
- goto free_mem;
- }
+ if (retval != 0)
+ goto free_workqueue;
+
/* save cx in the pci struct for later use */
pci_set_drvdata(dev, cx);
@@ -835,6 +835,7 @@ free_mem:
free_mem:
release_mem_region(cx->base_addr, CX18_MEM_SIZE);
free_workqueue:
+ destroy_workqueue(cx->work_queue);
err:
if (retval == 0)
retval = -ENODEV;
@@ -943,6 +944,8 @@ static void cx18_remove(struct pci_dev *
cx18_cancel_epu_work_orders(cx);
+ destroy_workqueue(cx->work_queue);
+
cx18_streams_cleanup(cx, 1);
exit_cx18_i2c(cx);
@@ -984,17 +987,8 @@ static int module_start(void)
printk(KERN_INFO "cx18: Debug value must be >= 0 and <=
511!\n");
}
- cx18_work_queue = create_singlethread_workqueue("cx18");
- if (cx18_work_queue == NULL) {
- printk(KERN_ERR
- "cx18: Unable to create work hander thread\n");
- return -ENOMEM;
- }
-
if (pci_register_driver(&cx18_pci_driver)) {
printk(KERN_ERR "cx18: Error detecting PCI card\n");
- destroy_workqueue(cx18_work_queue);
- cx18_work_queue = NULL;
return -ENODEV;
}
printk(KERN_INFO "cx18: End initialization\n");
@@ -1006,9 +1000,6 @@ static void module_cleanup(void)
int i;
pci_unregister_driver(&cx18_pci_driver);
-
- destroy_workqueue(cx18_work_queue);
- cx18_work_queue = NULL;
for (i = 0; i < cx18_cards_active; i++) {
if (cx18_cards[i] == NULL)
diff -r 8aabdabb517c -r 91440b07aa64
linux/drivers/media/video/cx18/cx18-driver.h
--- a/linux/drivers/media/video/cx18/cx18-driver.h Tue Nov 25 14:10:14
2008 -0200
+++ b/linux/drivers/media/video/cx18/cx18-driver.h Tue Nov 25 19:43:05
2008 -0500
@@ -447,6 +447,7 @@ struct cx18 {
u32 sw2_irq_mask;
u32 hw2_irq_mask;
+ struct workqueue_struct *work_queue;
struct cx18_epu_work_order epu_work_order[CX18_MAX_EPU_WORK_ORDERS];
char epu_debug_str[256]; /* CX18_EPU_DEBUG is rare: use shared space */
@@ -478,7 +479,6 @@ extern int cx18_cards_active;
extern int cx18_cards_active;
extern int cx18_first_minor;
extern spinlock_t cx18_cards_lock;
-extern struct workqueue_struct *cx18_work_queue;
/*==============Prototypes==================*/
diff -r 8aabdabb517c -r 91440b07aa64
linux/drivers/media/video/cx18/cx18-mailbox.c
--- a/linux/drivers/media/video/cx18/cx18-mailbox.c Tue Nov 25 14:10:14
2008 -0200
+++ b/linux/drivers/media/video/cx18/cx18-mailbox.c Tue Nov 25 19:43:05
2008 -0500
@@ -460,7 +460,7 @@ void cx18_api_epu_cmd_irq(struct cx18 *c
*/
submit = epu_cmd_irq(cx, order);
if (submit > 0) {
- queue_work(cx18_work_queue, &order->work);
+ queue_work(cx->work_queue, &order->work);
}
}
---
Patch is available at:
http://linuxtv.org/hg/v4l-dvb/rev/91440b07aa64bd7c12b1ad7f6148789956a13b15
_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits