On Wed, Jun 14, 2017 at 08:11:18PM +0200, Maarten Lankhorst wrote: > Op 14-06-17 om 16:52 schreef Ville Syrjälä: > > On Wed, Jun 14, 2017 at 11:08:41AM +0200, Maarten Lankhorst wrote: > >> Moving the wait to a helper allows callers outside of the core to > >> wait for pending updates to complete. > >> > >> This can be used to prevent races against nonblocking modesets. > >> Only the hw_done call in swap_state is moved to a helper, doing > >> it for the other callers requires too many changes and I think this > >> is the only useful one to export. > >> > >> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> > >> --- > >> drivers/gpu/drm/drm_atomic_helper.c | 51 +++++++++++++++++++++++++++---------- > >> include/drm/drm_atomic_helper.h | 1 + > >> 2 files changed, 38 insertions(+), 14 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c > >> index 86d3093c6c9b..1b068ce1aea9 100644 > >> --- a/drivers/gpu/drm/drm_atomic_helper.c > >> +++ b/drivers/gpu/drm/drm_atomic_helper.c > >> @@ -2067,6 +2067,41 @@ void drm_atomic_helper_cleanup_planes(struct drm_device *dev, > >> EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes); > >> > >> /** > >> + * drm_atomic_helper_wait_for_hw_done - wait for all previous hw updates to complete. > >> + * @crtc: crtc to wait on. > >> + * > >> + * This function waits for all previous hardware updates queued on @crtc > >> + * to complete. > >> + * > >> + * Returns: > >> + * 0 on success, negative error code on failure. > >> + */ > >> +int drm_atomic_helper_wait_for_hw_done(struct drm_crtc *crtc) > >> +{ > >> + struct drm_crtc_commit *commit; > >> + long ret; > >> + > >> + spin_lock(&crtc->commit_lock); > >> + commit = list_first_entry_or_null(&crtc->commit_list, > >> + struct drm_crtc_commit, commit_entry); > >> + if (commit) > >> + drm_crtc_commit_get(commit); > >> + spin_unlock(&crtc->commit_lock); > >> + > >> + if (!commit) > >> + return 0; > >> + > >> + ret = wait_for_completion_timeout(&commit->hw_done, 10 * HZ); > >> + drm_crtc_commit_put(commit); > >> + > >> + if (ret == 0) > >> + return -EBUSY; > > -ETIMEDOUT ? > ETIMEDOUT -> /* Connection timed out */ It's the standard "something timed out" errno. Used all over drm. > > No I don't think that would match. -- Ville Syrjälä Intel OTC _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel