[PATCH] drm/amd/display: put commit when -ERESTARTSYS received
Harry Wentland
harry.wentland at amd.com
Wed Aug 16 17:40:04 UTC 2017
On 2017-08-16 01:22 PM, Daniel Vetter wrote:
> On Wed, Aug 16, 2017 at 7:12 PM, Alex Deucher <alexdeucher at gmail.com> wrote:
>> On Wed, Aug 16, 2017 at 10:22 AM, Jerry Zuo <Jerry.Zuo at amd.com> 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.
>>>
>>> Signed-off-by: Jerry Zuo <Jerry.Zuo at amd.com>
>>
>> The subject should be:
>> drm/atomic: put commit when -ERESTARTSYS received
>> Since the change is in the core atomic code.
>
> Do we have an igt testcase to exercise this? This is the kind of error
> case handling igt really is made for, and igt has ready-made helpers
> to interrupt ioctls. I think Maarten was even working on such a
> testcase, adding him.
I'm not aware of an IGT test for this. We triggered this scenario when
running mode changes while glxgears is running. We observed no
user-visible issue, only a memory leak. Is IGT able to capture those
(semi-)reliably?
I agree that it would be great to have an IGT test for these corner cases.
Harry
> -Daniel
> >>
>> Alex
>>
>>> ---
>>> 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
>>>
>>> _______________________________________________
>>> dri-devel mailing list
>>> dri-devel at lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/dri-devel
>
>
>
More information about the dri-devel
mailing list