Commit 7b2d16f5 authored by Bhaktipriya Shridhar's avatar Bhaktipriya Shridhar Committed by Daniel Vetter

drm/qxl: Remove deprecated create_singlethread_workqueue

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: default avatarBhaktipriya Shridhar <bhaktipriya96@gmail.com>
Acked-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20160702110209.GA3560@Karyakshetra
parent 4517cf9b
...@@ -203,7 +203,7 @@ qxl_push_cursor_ring_release(struct qxl_device *qdev, struct qxl_release *releas ...@@ -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) bool qxl_queue_garbage_collect(struct qxl_device *qdev, bool flush)
{ {
if (!qxl_check_idle(qdev->release_ring)) { if (!qxl_check_idle(qdev->release_ring)) {
queue_work(qdev->gc_queue, &qdev->gc_work); schedule_work(&qdev->gc_work);
if (flush) if (flush)
flush_work(&qdev->gc_work); flush_work(&qdev->gc_work);
return true; return true;
......
...@@ -321,7 +321,6 @@ struct qxl_device { ...@@ -321,7 +321,6 @@ struct qxl_device {
struct qxl_bo *current_release_bo[3]; struct qxl_bo *current_release_bo[3];
int current_release_bo_offset[3]; int current_release_bo_offset[3];
struct workqueue_struct *gc_queue;
struct work_struct gc_work; struct work_struct gc_work;
struct drm_property *hotplug_mode_update_property; struct drm_property *hotplug_mode_update_property;
......
...@@ -258,7 +258,6 @@ static int qxl_device_init(struct qxl_device *qdev, ...@@ -258,7 +258,6 @@ static int qxl_device_init(struct qxl_device *qdev,
(unsigned long)qdev->surfaceram_size); (unsigned long)qdev->surfaceram_size);
qdev->gc_queue = create_singlethread_workqueue("qxl_gc");
INIT_WORK(&qdev->gc_work, qxl_gc_work); INIT_WORK(&qdev->gc_work, qxl_gc_work);
return 0; return 0;
...@@ -270,10 +269,7 @@ static void qxl_device_fini(struct qxl_device *qdev) ...@@ -270,10 +269,7 @@ static void qxl_device_fini(struct qxl_device *qdev)
qxl_bo_unref(&qdev->current_release_bo[0]); qxl_bo_unref(&qdev->current_release_bo[0]);
if (qdev->current_release_bo[1]) if (qdev->current_release_bo[1])
qxl_bo_unref(&qdev->current_release_bo[1]); qxl_bo_unref(&qdev->current_release_bo[1]);
flush_workqueue(qdev->gc_queue); flush_work(&qdev->gc_work);
destroy_workqueue(qdev->gc_queue);
qdev->gc_queue = NULL;
qxl_ring_free(qdev->command_ring); qxl_ring_free(qdev->command_ring);
qxl_ring_free(qdev->cursor_ring); qxl_ring_free(qdev->cursor_ring);
qxl_ring_free(qdev->release_ring); qxl_ring_free(qdev->release_ring);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment