<div dir="ltr"><div>Thanks for looking at this Christian.  Let me know if there's anything I can do to help.<br></div><div><br></div><div>In the meantime, is there a workaround to avoid the memory leak other than using a kernel from before the HMM change?</div><div><br></div><div>Thanks,</div><div>-Joe<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 4, 2019 at 8:02 AM Koenig, Christian <<a href="mailto:Christian.Koenig@amd.com">Christian.Koenig@amd.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Philip,<br>
<br>
Am 04.10.19 um 15:40 schrieb Yang, Philip:<br>
> Thanks Joe for the test, I will add your Tested-by.<br>
><br>
> Hi Christian,<br>
><br>
> May you help review? The change removes the get user pages from<br>
> gem_userptr_ioctl, this was done if flags AMDGPU_GEM_USERPTR_VALIDATE is<br>
> set, and delay the get user pages to amdgpu_cs_parser_bos, and check if<br>
> user pages are invalidated when amdgpu_cs_submit. I don't find issue for<br>
> overnight test, but not sure if there is potential side effect.<br>
<br>
Yeah, seen that.<br>
<br>
The AMDGPU_GEM_USERPTR_VALIDATE was explicitly added to cause a <br>
validation during BO creation because of some very stupid applications.<br>
<br>
I didn't wanted to reject that without offering an alternative, but we <br>
seriously can't do this or it would break Vulkan/OpenGL.<br>
<br>
I need more time to take a closer look,<br>
Christian.<br>
<br>
><br>
> Thanks,<br>
> Philip<br>
><br>
> On 2019-10-03 3:44 p.m., Yang, Philip wrote:<br>
>> user_pages array should always be freed after validation regardless if<br>
>> user pages are changed after bo is created because with HMM change parse<br>
>> bo always allocate user pages array to get user pages for userptr bo.<br>
>><br>
>> Don't need to get user pages while creating uerptr bo because user pages<br>
>> will only be used while validating after parsing userptr bo.<br>
>><br>
>> Bugzilla: <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1844962" rel="noreferrer" target="_blank">https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1844962</a><br>
>><br>
>> v2: remove unused local variable and amend commit<br>
>><br>
>> Signed-off-by: Philip Yang <<a href="mailto:Philip.Yang@amd.com" target="_blank">Philip.Yang@amd.com</a>><br>
>> ---<br>
>>    drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c  |  4 +---<br>
>>    drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 23 +----------------------<br>
>>    2 files changed, 2 insertions(+), 25 deletions(-)<br>
>><br>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c<br>
>> index 49b767b7238f..961186e7113e 100644<br>
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c<br>
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c<br>
>> @@ -474,7 +474,6 @@ static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,<br>
>>    <br>
>>      list_for_each_entry(lobj, validated, tv.head) {<br>
>>              struct amdgpu_bo *bo = ttm_to_amdgpu_bo(lobj-><a href="http://tv.bo" rel="noreferrer" target="_blank">tv.bo</a>);<br>
>> -            bool binding_userptr = false;<br>
>>              struct mm_struct *usermm;<br>
>>    <br>
>>              usermm = amdgpu_ttm_tt_get_usermm(bo->tbo.ttm);<br>
>> @@ -491,14 +490,13 @@ static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,<br>
>>    <br>
>>                      amdgpu_ttm_tt_set_user_pages(bo->tbo.ttm,<br>
>>                                                   lobj->user_pages);<br>
>> -                    binding_userptr = true;<br>
>>              }<br>
>>    <br>
>>              r = amdgpu_cs_validate(p, bo);<br>
>>              if (r)<br>
>>                      return r;<br>
>>    <br>
>> -            if (binding_userptr) {<br>
>> +            if (lobj->user_pages) {<br>
>>                      kvfree(lobj->user_pages);<br>
>>                      lobj->user_pages = NULL;<br>
>>              }<br>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c<br>
>> index a828e3d0bfbd..3ccd61d69964 100644<br>
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c<br>
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c<br>
>> @@ -283,7 +283,6 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,<br>
>>    int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,<br>
>>                           struct drm_file *filp)<br>
>>    {<br>
>> -    struct ttm_operation_ctx ctx = { true, false };<br>
>>      struct amdgpu_device *adev = dev->dev_private;<br>
>>      struct drm_amdgpu_gem_userptr *args = data;<br>
>>      struct drm_gem_object *gobj;<br>
>> @@ -326,32 +325,12 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,<br>
>>                      goto release_object;<br>
>>      }<br>
>>    <br>
>> -    if (args->flags & AMDGPU_GEM_USERPTR_VALIDATE) {<br>
>> -            r = amdgpu_ttm_tt_get_user_pages(bo, bo->tbo.ttm->pages);<br>
>> -            if (r)<br>
>> -                    goto release_object;<br>
>> -<br>
>> -            r = amdgpu_bo_reserve(bo, true);<br>
>> -            if (r)<br>
>> -                    goto user_pages_done;<br>
>> -<br>
>> -            amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_GTT);<br>
>> -            r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);<br>
>> -            amdgpu_bo_unreserve(bo);<br>
>> -            if (r)<br>
>> -                    goto user_pages_done;<br>
>> -    }<br>
>> -<br>
>>      r = drm_gem_handle_create(filp, gobj, &handle);<br>
>>      if (r)<br>
>> -            goto user_pages_done;<br>
>> +            goto release_object;<br>
>>    <br>
>>      args->handle = handle;<br>
>>    <br>
>> -user_pages_done:<br>
>> -    if (args->flags & AMDGPU_GEM_USERPTR_VALIDATE)<br>
>> -            amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm);<br>
>> -<br>
>>    release_object:<br>
>>      drm_gem_object_put_unlocked(gobj);<br>
>>    <br>
>><br>
<br>
</blockquote></div>