aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBhaktipriya Shridhar <bhaktipriya96@gmail.com>2016-07-16 04:50:28 -0400
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2016-08-24 08:29:09 -0400
commitc994be4a7c8471b950ed9baf4558ff488b127ec8 (patch)
tree2f272057b79a10250c40e989c64befecd497387f
parent29a3006e5209b5dde2d370b8de1e8c18c14040e7 (diff)
[media] gspca: sonixj: Remove deprecated create_singlethread_workqueue
The workqueue "work_thread" is involved in updating the JPEG quality of the gspca_dev. It has a single work item(&sd->work) and hence doesn't require ordering. Also, it is not being used on a memory reclaim path. Hence, the singlethreaded workqueue has been replaced with the use of system_wq. System workqueues have been able to handle high level of concurrency for a long time now and hence it's not required to have a singlethreaded workqueue just to gain concurrency. Unlike a dedicated per-cpu workqueue created with create_singlethread_workqueue(), system_wq allows multiple work items to overlap executions even on the same CPU; however, a per-cpu workqueue doesn't have any CPU locality or global ordering guarantee unless the target CPU is explicitly specified and thus the increase of local concurrency shouldn't make any difference. Work item has been flushed in sd_stop0() to ensure that there are no pending tasks while disconnecting the driver. Signed-off-by: Bhaktipriya Shridhar <bhaktipriya96@gmail.com> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
-rw-r--r--drivers/media/usb/gspca/sonixj.c13
1 files changed, 4 insertions, 9 deletions
diff --git a/drivers/media/usb/gspca/sonixj.c b/drivers/media/usb/gspca/sonixj.c
index fd1c8706d86a..d49d76ec1421 100644
--- a/drivers/media/usb/gspca/sonixj.c
+++ b/drivers/media/usb/gspca/sonixj.c
@@ -54,7 +54,6 @@ struct sd {
54 u32 exposure; 54 u32 exposure;
55 55
56 struct work_struct work; 56 struct work_struct work;
57 struct workqueue_struct *work_thread;
58 57
59 u32 pktsz; /* (used by pkt_scan) */ 58 u32 pktsz; /* (used by pkt_scan) */
60 u16 npkt; 59 u16 npkt;
@@ -2485,7 +2484,6 @@ static int sd_start(struct gspca_dev *gspca_dev)
2485 2484
2486 sd->pktsz = sd->npkt = 0; 2485 sd->pktsz = sd->npkt = 0;
2487 sd->nchg = sd->short_mark = 0; 2486 sd->nchg = sd->short_mark = 0;
2488 sd->work_thread = create_singlethread_workqueue(MODULE_NAME);
2489 2487
2490 return gspca_dev->usb_err; 2488 return gspca_dev->usb_err;
2491} 2489}
@@ -2569,12 +2567,9 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
2569{ 2567{
2570 struct sd *sd = (struct sd *) gspca_dev; 2568 struct sd *sd = (struct sd *) gspca_dev;
2571 2569
2572 if (sd->work_thread != NULL) { 2570 mutex_unlock(&gspca_dev->usb_lock);
2573 mutex_unlock(&gspca_dev->usb_lock); 2571 flush_work(&sd->work);
2574 destroy_workqueue(sd->work_thread); 2572 mutex_lock(&gspca_dev->usb_lock);
2575 mutex_lock(&gspca_dev->usb_lock);
2576 sd->work_thread = NULL;
2577 }
2578} 2573}
2579 2574
2580static void do_autogain(struct gspca_dev *gspca_dev) 2575static void do_autogain(struct gspca_dev *gspca_dev)
@@ -2785,7 +2780,7 @@ marker_found:
2785 new_qual = QUALITY_MAX; 2780 new_qual = QUALITY_MAX;
2786 if (new_qual != sd->quality) { 2781 if (new_qual != sd->quality) {
2787 sd->quality = new_qual; 2782 sd->quality = new_qual;
2788 queue_work(sd->work_thread, &sd->work); 2783 schedule_work(&sd->work);
2789 } 2784 }
2790 } 2785 }
2791 } else { 2786 } else {