[PATCH 2/3] drm/atomic: Use kthread worker for nonblocking commits
Hillf Danton
hdanton at sina.com
Sun Sep 20 01:58:58 UTC 2020
Sat, 19 Sep 2020 12:37:25 -0700 Rob Clark wrote:
>
> @@ -1797,6 +1797,7 @@ int drm_atomic_helper_commit(struct drm_device *dev,
> struct drm_atomic_state *state,
> bool nonblock)
> {
> + struct kthread_worker *worker = NULL;
> int ret;
>
> if (state->async_update) {
> @@ -1814,7 +1815,7 @@ int drm_atomic_helper_commit(struct drm_device *dev,
> if (ret)
> return ret;
>
> - INIT_WORK(&state->commit_work, commit_work);
> + kthread_init_work(&state->commit_kwork, commit_work);
>
> ret = drm_atomic_helper_prepare_planes(dev, state);
> if (ret)
> @@ -1857,8 +1858,12 @@ int drm_atomic_helper_commit(struct drm_device *dev,
> */
>
> drm_atomic_state_get(state);
> +
> if (nonblock)
> - queue_work(system_unbound_wq, &state->commit_work);
> + worker = drm_atomic_pick_worker(state);
> +
> + if (worker)
> + kthread_queue_work(worker, &state->commit_kwork);
> else
> commit_tail(state);
A minor change in behavior: commit_tail() would have nothing to do with
either worker or work, rather than the fallback in case no worker is
available.
More information about the dri-devel
mailing list