aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBhaktipriya Shridhar <bhaktipriya96@gmail.com>2016-07-02 04:59:41 -0400
committerMark Brown <broonie@kernel.org>2016-07-03 08:24:31 -0400
commiteac9837f87017c7a3a6c0a8908fdda66f7f9c076 (patch)
tree774ebabde8d3bc30401b56d3040415c4931efb60
parent1a695a905c18548062509178b98bc91e67510864 (diff)
spi: spi-bfin-sport: Remove deprecated create_singlethread_workqueue
The workqueue "workqueue" serves as a driver message queue. It has a single work item(&drv_data->pump_messages) 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 bfin_sport_spi_destroy_queue() 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: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-bfin-sport.c15
1 files changed, 4 insertions, 11 deletions
diff --git a/drivers/spi/spi-bfin-sport.c b/drivers/spi/spi-bfin-sport.c
index 6c967555a56a..01d0ba9c5942 100644
--- a/drivers/spi/spi-bfin-sport.c
+++ b/drivers/spi/spi-bfin-sport.c
@@ -64,8 +64,6 @@ struct bfin_sport_spi_master_data {
64 /* Pin request list */ 64 /* Pin request list */
65 u16 *pin_req; 65 u16 *pin_req;
66 66
67 /* Driver message queue */
68 struct workqueue_struct *workqueue;
69 struct work_struct pump_messages; 67 struct work_struct pump_messages;
70 spinlock_t lock; 68 spinlock_t lock;
71 struct list_head queue; 69 struct list_head queue;
@@ -300,7 +298,7 @@ bfin_sport_spi_giveback(struct bfin_sport_spi_master_data *drv_data)
300 drv_data->cur_msg = NULL; 298 drv_data->cur_msg = NULL;
301 drv_data->cur_transfer = NULL; 299 drv_data->cur_transfer = NULL;
302 drv_data->cur_chip = NULL; 300 drv_data->cur_chip = NULL;
303 queue_work(drv_data->workqueue, &drv_data->pump_messages); 301 schedule_work(&drv_data->pump_messages);
304 spin_unlock_irqrestore(&drv_data->lock, flags); 302 spin_unlock_irqrestore(&drv_data->lock, flags);
305 303
306 if (!drv_data->cs_change) 304 if (!drv_data->cs_change)
@@ -556,7 +554,7 @@ bfin_sport_spi_transfer(struct spi_device *spi, struct spi_message *msg)
556 list_add_tail(&msg->queue, &drv_data->queue); 554 list_add_tail(&msg->queue, &drv_data->queue);
557 555
558 if (drv_data->run && !drv_data->busy) 556 if (drv_data->run && !drv_data->busy)
559 queue_work(drv_data->workqueue, &drv_data->pump_messages); 557 schedule_work(&drv_data->pump_messages);
560 558
561 spin_unlock_irqrestore(&drv_data->lock, flags); 559 spin_unlock_irqrestore(&drv_data->lock, flags);
562 560
@@ -666,12 +664,7 @@ bfin_sport_spi_init_queue(struct bfin_sport_spi_master_data *drv_data)
666 tasklet_init(&drv_data->pump_transfers, 664 tasklet_init(&drv_data->pump_transfers,
667 bfin_sport_spi_pump_transfers, (unsigned long)drv_data); 665 bfin_sport_spi_pump_transfers, (unsigned long)drv_data);
668 666
669 /* init messages workqueue */
670 INIT_WORK(&drv_data->pump_messages, bfin_sport_spi_pump_messages); 667 INIT_WORK(&drv_data->pump_messages, bfin_sport_spi_pump_messages);
671 drv_data->workqueue =
672 create_singlethread_workqueue(dev_name(drv_data->master->dev.parent));
673 if (drv_data->workqueue == NULL)
674 return -EBUSY;
675 668
676 return 0; 669 return 0;
677} 670}
@@ -694,7 +687,7 @@ bfin_sport_spi_start_queue(struct bfin_sport_spi_master_data *drv_data)
694 drv_data->cur_chip = NULL; 687 drv_data->cur_chip = NULL;
695 spin_unlock_irqrestore(&drv_data->lock, flags); 688 spin_unlock_irqrestore(&drv_data->lock, flags);
696 689
697 queue_work(drv_data->workqueue, &drv_data->pump_messages); 690 schedule_work(&drv_data->pump_messages);
698 691
699 return 0; 692 return 0;
700} 693}
@@ -738,7 +731,7 @@ bfin_sport_spi_destroy_queue(struct bfin_sport_spi_master_data *drv_data)
738 if (status) 731 if (status)
739 return status; 732 return status;
740 733
741 destroy_workqueue(drv_data->workqueue); 734 flush_work(&drv_data->pump_messages);
742 735
743 return 0; 736 return 0;
744} 737}