Message ID | 20170817142118.28295-1-Jerry.Zuo@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Aug 17, 2017 at 10:21:18AM -0400, Jerry Zuo wrote: > During page flip atomic_check and atomic_commit can return > -ERESTARTSYS to restart the ioctl. When this happens we fail to > put the commit object leading to a memory leak. > > v2: Changed subject tag to drm/atomic > > Signed-off-by: Jerry Zuo <Jerry.Zuo@amd.com> When resubmitting pls cc: everyone involved and cc'ed in the old discussion. Still looking for that testcase, please have a chat with Maarten over irc or so. -Daniel > --- > drivers/gpu/drm/drm_atomic.c | 25 +++++++++++++++++++++++-- > 1 file changed, 23 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index f32506a7c1d6..f2f623dacf90 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -1642,14 +1642,35 @@ int drm_atomic_nonblocking_commit(struct drm_atomic_state *state) > { > struct drm_mode_config *config = &state->dev->mode_config; > int ret; > + int i; > + struct drm_crtc *crtc; > + struct drm_crtc_state *crtc_state; > > ret = drm_atomic_check_only(state); > - if (ret) > + if (ret) { > + if (ret == -ERESTARTSYS) > + goto fail; > + > return ret; > + } > > DRM_DEBUG_ATOMIC("commiting %p nonblocking\n", state); > > - return config->funcs->atomic_commit(state->dev, state, true); > + ret = config->funcs->atomic_commit(state->dev, state, true); > + if (ret == -ERESTARTSYS) > + goto fail; > + > + return ret; > + > + /* cleanup commit object if commit fails with ERESTARTSYS */ > +fail: > + for_each_crtc_in_state(state, crtc, crtc_state, i) { > + if (state->crtcs[i].commit) { > + drm_crtc_commit_put(state->crtcs[i].commit); > + } > + } > + > + return ret; > } > EXPORT_SYMBOL(drm_atomic_nonblocking_commit); > > -- > 2.11.0 >
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index f32506a7c1d6..f2f623dacf90 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -1642,14 +1642,35 @@ int drm_atomic_nonblocking_commit(struct drm_atomic_state *state) { struct drm_mode_config *config = &state->dev->mode_config; int ret; + int i; + struct drm_crtc *crtc; + struct drm_crtc_state *crtc_state; ret = drm_atomic_check_only(state); - if (ret) + if (ret) { + if (ret == -ERESTARTSYS) + goto fail; + return ret; + } DRM_DEBUG_ATOMIC("commiting %p nonblocking\n", state); - return config->funcs->atomic_commit(state->dev, state, true); + ret = config->funcs->atomic_commit(state->dev, state, true); + if (ret == -ERESTARTSYS) + goto fail; + + return ret; + + /* cleanup commit object if commit fails with ERESTARTSYS */ +fail: + for_each_crtc_in_state(state, crtc, crtc_state, i) { + if (state->crtcs[i].commit) { + drm_crtc_commit_put(state->crtcs[i].commit); + } + } + + return ret; } EXPORT_SYMBOL(drm_atomic_nonblocking_commit);
During page flip atomic_check and atomic_commit can return -ERESTARTSYS to restart the ioctl. When this happens we fail to put the commit object leading to a memory leak. v2: Changed subject tag to drm/atomic Signed-off-by: Jerry Zuo <Jerry.Zuo@amd.com> --- drivers/gpu/drm/drm_atomic.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-)