On 2017-09-12 12:10 PM, Darren Salt wrote:
> Noticed while playing “Valley”, which was causing some 8MB of leakage per
> second. kmemleak listed many entries looking like this:
> 
>     unreferenced object 0xffff8802c2951800 (size 1024):
>       comm "Xorg", pid 2982, jiffies 4297410155 (age 392.787s)
>       hex dump (first 32 bytes):
>         00 50 f9 0c 04 88 ff ff 98 08 00 00 00 00 00 00  .P..............
>         80 07 00 00 00 00 00 00 58 00 00 00 2c 00 00 00  ........X...,...
>       backtrace:
>         [<ffffffff810cd4c3>] create_object+0x13c/0x261
>         [<ffffffff815abdc2>] kmemleak_alloc+0x20/0x3c
>         [<ffffffff810cad1d>] slab_post_alloc_hook+0x42/0x52
>         [<ffffffff810cb8e0>] kmem_cache_alloc+0x67/0x76
>         [<ffffffff813bbb54>] dc_create_stream_for_sink+0x24/0x1cf
>         [<ffffffff81373aaa>] create_stream_for_sink+0x6f/0x295
>         [<ffffffff81373dc2>] dm_update_crtcs_state+0xa6/0x268
>         [<ffffffff8137401e>] amdgpu_dm_atomic_check+0x9a/0x314
>         [<ffffffff812ac3dd>] drm_atomic_check_only+0x17a/0x42d
>         [<ffffffff812ac6a3>] drm_atomic_commit+0x13/0x4b
>         [<ffffffff812ad1a5>] drm_atomic_connector_commit_dpms+0xcb/0xe8
>         [<ffffffff812b1238>] drm_mode_obj_set_property_ioctl+0xe6/0x1e3
>         [<ffffffff812b027b>] drm_mode_connector_property_set_ioctl+0x2b/0x2d
>         [<ffffffff8129f427>] drm_ioctl_kernel+0x64/0x9d
>         [<ffffffff8129f6a2>] drm_ioctl+0x230/0x316
>         [<ffffffff812ca4d3>] amdgpu_drm_ioctl+0x4b/0x7d
> 
> v2: also handle break statements.
> 

Thanks for the patch. We really should've caught that earlier.

Reviewed-by: Harry Wentland <harry.wentl...@amd.com>

Harry

> Signed-off-by: Darren Salt <devs...@moreofthesa.me.uk>
> ---
>  drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 19 +++++++++++++------
>  1 file changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 32c75867eaa7..14f1a4bcf2e9 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -4466,6 +4466,7 @@ static int dm_update_crtcs_state(
>       int i;
>       struct dm_crtc_state *old_acrtc_state, *new_acrtc_state;
>       struct dm_atomic_state *dm_state = to_dm_atomic_state(state);
> +     struct dc_stream_state *new_stream;
>       int ret = 0;
>  
>       /*TODO Move this code into dm_crtc_atomic_check once we get rid of 
> dc_validation_set */
> @@ -4473,10 +4474,10 @@ static int dm_update_crtcs_state(
>       for_each_crtc_in_state(state, crtc, crtc_state, i) {
>               struct amdgpu_crtc *acrtc = NULL;
>               struct amdgpu_connector *aconnector = NULL;
> -             struct dc_stream_state *new_stream = NULL;
>               struct drm_connector_state *conn_state = NULL;
>               struct dm_connector_state *dm_conn_state = NULL;
>  
> +             new_stream = NULL;
>  
>               old_acrtc_state = to_dm_crtc_state(crtc->state);
>               new_acrtc_state = to_dm_crtc_state(crtc_state);
> @@ -4525,7 +4526,7 @@ static int dm_update_crtcs_state(
>  
>  
>               if (!drm_atomic_crtc_needs_modeset(crtc_state))
> -                             continue;
> +                     goto next_crtc;
>  
>               DRM_DEBUG_KMS(
>                       "amdgpu_crtc id:%d crtc_state_flags: enable:%d, 
> active:%d, "
> @@ -4543,7 +4544,7 @@ static int dm_update_crtcs_state(
>               if (!enable) {
>  
>                       if (!old_acrtc_state->stream)
> -                             continue;
> +                             goto next_crtc;
>  
>                       DRM_DEBUG_KMS("Disabling DRM crtc: %d\n",
>                                       crtc->base.id);
> @@ -4554,7 +4555,7 @@ static int dm_update_crtcs_state(
>                                       dm_state->context,
>                                       old_acrtc_state->stream)) {
>                               ret = -EINVAL;
> -                             break;
> +                             goto fail;
>                       }
>  
>                       dc_stream_release(old_acrtc_state->stream);
> @@ -4565,7 +4566,7 @@ static int dm_update_crtcs_state(
>               } else {/* Add stream for any updated/enabled CRTC */
>  
>                       if (modereset_required(crtc_state))
> -                             continue;
> +                             goto next_crtc;
>  
>                       if (modeset_required(crtc_state, new_stream,
>                                            old_acrtc_state->stream)) {
> @@ -4583,19 +4584,25 @@ static int dm_update_crtcs_state(
>                                               dm_state->context,
>                                               new_acrtc_state->stream)) {
>                                       ret = -EINVAL;
> -                                     break;
> +                                     goto fail;
>                               }
>  
>                               *lock_and_validation_needed = true;
>                       }
>               }
>  
> +next_crtc:
>               /* Release extra reference */
>               if (new_stream)
>                        dc_stream_release(new_stream);
>       }
>  
>       return ret;
> +
> +fail:
> +     if (new_stream)
> +             dc_stream_release(new_stream);
> +     return ret;
>  }
>  
>  static int dm_update_planes_state(
> 
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to