On 06.07.2016 06:06, Tejun Heo wrote:
On Mon, Jul 04, 2016 at 12:58:32PM +0900, Michel Dänzer wrote:
On 02.07.2016 22:46, Tejun Heo wrote:
On Sat, Jul 02, 2016 at 04:33:50PM +0530, Bhaktipriya Shridhar wrote:
alloc_workqueue replaces deprecated create_singlethread_workqueue().
A dedicated workqueue has been used since work items need to be flushed as a group rather than individually.
There seem to be two work items involved, the flip one and unpin one. Provided that there's no ordering requirement between the two, can't we just flush them individually?
There is an ordering requirement between the two queues, but it's enforced by the driver (by only queuing the unpin work once a flip has completed, which only happens after the corresponding flip work has run).
Not being very familiar with the workqueue APIs, I'll describe how it's supposed to work from a driver POV, which will hopefully help you guys decide on the most appropriate alloc_workqueue parameters.
There is one flip work queue for each hardware CRTC. At most one radeon_flip_work_func item can be queued for any of them at any time. When a radeon_flip_work_func item is queued, it should be executed ASAP (so WQ_HIGHPRI might be appropriate?).
In contrast, the radeon_unpin_work_func items aren't particularly urgent, and it's okay for several of them to be queued up. So I guess it would actually make sense to use a different workqueue for them, maybe even the default one?
Since there are only a fixed number of work items, explicit concurrency limit is unnecessary here.
What are the involved work items?
drivers/gpu/drm/radeon/radeon_display.c:radeon_flip_work_func()
Is it safe to run them concurrently?
Concurrently with what exactly?
The flip and unpin work items.
Yes, it's safe to run those concurrently.