[AMD Official Use Only - General] Good catch on dropping return values Regards, Ramesh -----Original Message----- From: Kuehling, Felix <Felix.Kuehling@xxxxxxx> Sent: Thursday, May 2, 2024 12:30 AM To: Errabolu, Ramesh <Ramesh.Errabolu@xxxxxxx>; amd-gfx@xxxxxxxxxxxxxxxxxxxxx Subject: Re: [PATCH] drm/amd/amdkfd: Fix a resource leak in svm_range_validate_and_map() On 2024-05-01 14:34, Felix Kuehling wrote: > > > On 2024-04-30 19:29, Ramesh Errabolu wrote: >> Analysis of code by Coverity, a static code analyser, has identified >> a resource leak in the symbol hmm_range. This leak occurs when one of >> the prior steps before it is released encounters an error. >> >> Signed-off-by: Ramesh Errabolu <Ramesh.Errabolu@xxxxxxx> >> --- >> drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 6 ++++-- >> 1 file changed, 4 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c >> b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c >> index 386875e6eb96..dcb1d5d3f860 100644 >> --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c >> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c >> @@ -1658,7 +1658,7 @@ static int svm_range_validate_and_map(struct >> mm_struct *mm, >> start = map_start << PAGE_SHIFT; >> end = (map_last + 1) << PAGE_SHIFT; >> for (addr = start; !r && addr < end; ) { >> - struct hmm_range *hmm_range; >> + struct hmm_range *hmm_range = NULL; >> unsigned long map_start_vma; >> unsigned long map_last_vma; >> struct vm_area_struct *vma; @@ -1696,7 +1696,9 @@ static >> int svm_range_validate_and_map(struct mm_struct *mm, >> } >> svm_range_lock(prange); >> - if (!r && amdgpu_hmm_range_get_pages_done(hmm_range)) { >> + >> + // Free backing memory of hmm_range if it was initialized >> + if (hmm_range && amdgpu_hmm_range_get_pages_done(hmm_range)) >> +{ >> pr_debug("hmm update the range, need validate >> again\n"); >> r = -EAGAIN; > > Nack! This can now override other error codes that aren't meant to be > overridden with -EAGAIN. > > I think a better solution would be to just revserse this condition to > ensure that amdgpu_hmm_range_get_pages_done is always called: > > if (amdgpu_hmm_range_get_pages_done(hmm_range) && !r) { Correction: You still need the NULL check: if (hmm_range && amdgpu_hmm_range_get_pages_done(hmm_range) && !r) { ... } Regards, Felix > ... > r = -EAGAIN; > } > > Regards, > Felix > >> }