linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] drm/qxl: Remove deprecated create_singlethread_workqueue
@ 2016-07-02 11:02 Bhaktipriya Shridhar
  2016-07-02 13:44 ` Tejun Heo
  0 siblings, 1 reply; 3+ messages in thread
From: Bhaktipriya Shridhar @ 2016-07-02 11:02 UTC (permalink / raw)
  To: Dave Airlie, David Airlie, Alex Deucher, Sinclair Yeh,
	Christian König, Daniel Vetter, Jonathon Jongsma,
	Jani Nikula, John Keeping, Ville Syrjälä,
	Noralf Trønnes
  Cc: Tejun Heo, dri-devel, linux-kernel

System workqueues have been able to handle high level of concurrency
for a long time now and there's no reason to use dedicated workqueues
just to gain concurrency. Since the workqueue in the QXL graphics device
driver is involved in freeing and processing the release ring
(workitem &qdev->gc_workqxl, maps to gc_work which calls
qxl_garbage_collect) and is not being used on a memory reclaim path,
dedicated gc_queue has been replaced with the use of system_wq.

Unlike a dedicated per-cpu workqueue created with create_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 guarantees unless the target CPU is
explicitly specified and thus the increase of local concurrency
shouldn't make any difference.

flush_work() has been called in qxl_device_fini() to ensure that there
are no pending tasks while disconnecting the driver.

Signed-off-by: Bhaktipriya Shridhar <bhaktipriya96@gmail.com>
---
 drivers/gpu/drm/qxl/qxl_cmd.c | 2 +-
 drivers/gpu/drm/qxl/qxl_drv.h | 1 -
 drivers/gpu/drm/qxl/qxl_kms.c | 6 +-----
 3 files changed, 2 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c
index b5d4b41..04270f5 100644
--- a/drivers/gpu/drm/qxl/qxl_cmd.c
+++ b/drivers/gpu/drm/qxl/qxl_cmd.c
@@ -203,7 +203,7 @@ qxl_push_cursor_ring_release(struct qxl_device *qdev, struct qxl_release *releas
 bool qxl_queue_garbage_collect(struct qxl_device *qdev, bool flush)
 {
 	if (!qxl_check_idle(qdev->release_ring)) {
-		queue_work(qdev->gc_queue, &qdev->gc_work);
+		schedule_work(&qdev->gc_work);
 		if (flush)
 			flush_work(&qdev->gc_work);
 		return true;
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index 3ad6604..8e633ca 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -321,7 +321,6 @@ struct qxl_device {
 	struct qxl_bo *current_release_bo[3];
 	int current_release_bo_offset[3];

-	struct workqueue_struct *gc_queue;
 	struct work_struct gc_work;

 	struct drm_property *hotplug_mode_update_property;
diff --git a/drivers/gpu/drm/qxl/qxl_kms.c b/drivers/gpu/drm/qxl/qxl_kms.c
index 2319800..144627c 100644
--- a/drivers/gpu/drm/qxl/qxl_kms.c
+++ b/drivers/gpu/drm/qxl/qxl_kms.c
@@ -258,7 +258,6 @@ static int qxl_device_init(struct qxl_device *qdev,
 		 (unsigned long)qdev->surfaceram_size);


-	qdev->gc_queue = create_singlethread_workqueue("qxl_gc");
 	INIT_WORK(&qdev->gc_work, qxl_gc_work);

 	return 0;
@@ -270,10 +269,7 @@ static void qxl_device_fini(struct qxl_device *qdev)
 		qxl_bo_unref(&qdev->current_release_bo[0]);
 	if (qdev->current_release_bo[1])
 		qxl_bo_unref(&qdev->current_release_bo[1]);
-	flush_workqueue(qdev->gc_queue);
-	destroy_workqueue(qdev->gc_queue);
-	qdev->gc_queue = NULL;
-
+	flush_work(&qdev->gc_work);
 	qxl_ring_free(qdev->command_ring);
 	qxl_ring_free(qdev->cursor_ring);
 	qxl_ring_free(qdev->release_ring);
--
2.1.4

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] drm/qxl: Remove deprecated create_singlethread_workqueue
  2016-07-02 11:02 [PATCH] drm/qxl: Remove deprecated create_singlethread_workqueue Bhaktipriya Shridhar
@ 2016-07-02 13:44 ` Tejun Heo
  2016-07-12 12:45   ` Daniel Vetter
  0 siblings, 1 reply; 3+ messages in thread
From: Tejun Heo @ 2016-07-02 13:44 UTC (permalink / raw)
  To: Bhaktipriya Shridhar
  Cc: Dave Airlie, David Airlie, Alex Deucher, Sinclair Yeh,
	Christian König, Daniel Vetter, Jonathon Jongsma,
	Jani Nikula, John Keeping, Ville Syrjälä,
	Noralf Trønnes, dri-devel, linux-kernel

On Sat, Jul 02, 2016 at 04:32:09PM +0530, Bhaktipriya Shridhar wrote:
> System workqueues have been able to handle high level of concurrency
> for a long time now and there's no reason to use dedicated workqueues
> just to gain concurrency. Since the workqueue in the QXL graphics device
> driver is involved in freeing and processing the release ring
> (workitem &qdev->gc_workqxl, maps to gc_work which calls
> qxl_garbage_collect) and is not being used on a memory reclaim path,
> dedicated gc_queue has been replaced with the use of system_wq.
> 
> Unlike a dedicated per-cpu workqueue created with create_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 guarantees unless the target CPU is
> explicitly specified and thus the increase of local concurrency
> shouldn't make any difference.
> 
> flush_work() has been called in qxl_device_fini() 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>

Thanks.

-- 
tejun

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] drm/qxl: Remove deprecated create_singlethread_workqueue
  2016-07-02 13:44 ` Tejun Heo
@ 2016-07-12 12:45   ` Daniel Vetter
  0 siblings, 0 replies; 3+ messages in thread
From: Daniel Vetter @ 2016-07-12 12:45 UTC (permalink / raw)
  To: Tejun Heo
  Cc: Bhaktipriya Shridhar, Dave Airlie, David Airlie, Alex Deucher,
	Sinclair Yeh, Christian König, Daniel Vetter,
	Jonathon Jongsma, Jani Nikula, John Keeping,
	Ville Syrjälä,
	Noralf Trønnes, dri-devel, linux-kernel

On Sat, Jul 02, 2016 at 09:44:17AM -0400, Tejun Heo wrote:
> On Sat, Jul 02, 2016 at 04:32:09PM +0530, Bhaktipriya Shridhar wrote:
> > System workqueues have been able to handle high level of concurrency
> > for a long time now and there's no reason to use dedicated workqueues
> > just to gain concurrency. Since the workqueue in the QXL graphics device
> > driver is involved in freeing and processing the release ring
> > (workitem &qdev->gc_workqxl, maps to gc_work which calls
> > qxl_garbage_collect) and is not being used on a memory reclaim path,
> > dedicated gc_queue has been replaced with the use of system_wq.
> > 
> > Unlike a dedicated per-cpu workqueue created with create_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 guarantees unless the target CPU is
> > explicitly specified and thus the increase of local concurrency
> > shouldn't make any difference.
> > 
> > flush_work() has been called in qxl_device_fini() 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>

Applied to drm-misc, thanks.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-07-12 12:45 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-02 11:02 [PATCH] drm/qxl: Remove deprecated create_singlethread_workqueue Bhaktipriya Shridhar
2016-07-02 13:44 ` Tejun Heo
2016-07-12 12:45   ` Daniel Vetter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).