Message ID | 20210617080414.1940-1-tangchunyou@163.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/panfrost:modify 'break' to 'continue' to traverse the circulation | expand |
On 17/06/2021 09:04, ChunyouTang wrote: > From: ChunyouTang <tangchunyou@icubecorp.cn> > > The 'break' can cause 'Memory manager not clean during takedown' > > It cannot use break to finish the circulation,it should use > > continue to traverse the circulation.it should put every mapping > > which is not NULL. You don't appear to have answered my question about whether you've actually seen this happen (and ideally what circumstances). In my previous email[1] I explained why I don't think this is needed. You need to convince me that I've overlooked something. Thanks, Steve [1] https://lore.kernel.org/r/31644881-134a-2d6e-dddf-e658a3a8176b%40arm.com > Signed-off-by: ChunyouTang <tangchunyou@icubecorp.cn> > --- > drivers/gpu/drm/panfrost/panfrost_job.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c > index 6003cfeb1322..52bccc1d2d42 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_job.c > +++ b/drivers/gpu/drm/panfrost/panfrost_job.c > @@ -281,7 +281,7 @@ static void panfrost_job_cleanup(struct kref *ref) > if (job->mappings) { > for (i = 0; i < job->bo_count; i++) { > if (!job->mappings[i]) > - break; > + continue; > > atomic_dec(&job->mappings[i]->obj->gpu_usecount); > panfrost_gem_mapping_put(job->mappings[i]); >
Hi Steve, 1, from https://lore.kernel.org/lkml/31644881-134a-2d6e-dddf-e658a3a8176b@arm.com/ I can see what your sent,I used a wrong email address,Now it correct. 2, > >Unless I'm mistaken the situation where some mappings may be NULL is > >caused by the loop in panfrost_lookup_bos() not completing > >successfully > >(panfrost_gem_mapping_get() returning NULL). In this case if > >mappings[i] > >is NULL then all following mappings must also be NULL. So 'break' > >allows > >us to skip the later ones. Admittedly the performance here isn't > >important so I'm not sure it's worth the optimisation, but AIUI this > >code isn't actually wrong. from panfrost_lookup_bos(),you can see: for (i = 0; i < job->bo_count; i++) { struct panfrost_gem_mapping *mapping; bo = to_panfrost_bo(job->bos[i]); ICUBE_DEBUG_PRINTK("panfrost bo gem handle=0x%x is_dumb=%d\n", bo->gem_handle, bo->is_dumb); if (!bo->is_dumb) { mapping = panfrost_gem_mapping_get(bo, priv); if (!mapping) { ret = -EINVAL; break; } atomic_inc(&bo->gpu_usecount); job->mappings[i] = mapping; } else { atomic_inc(&bo->gpu_usecount); job->mappings[i] = NULL; } } if bo->is_dumb is TRUE,the job->mappings[i] will set to NULL,and the while will be continue,so if job->mappings[i] is NULL,the following can not be NULL. 3, I've had this problem in our project,the value of is_dumb like these: 0 0 0 1 0 0 0 so,when job->mappings[i] is NULL,we can not break the while in panfrost_job_cleanup(). thanks Chunyou 于 Fri, 18 Jun 2021 13:43:25 +0100 Steven Price <steven.price@arm.com> 写道: > On 17/06/2021 09:04, ChunyouTang wrote: > > From: ChunyouTang <tangchunyou@icubecorp.cn> > > > > The 'break' can cause 'Memory manager not clean during takedown' > > > > It cannot use break to finish the circulation,it should use > > > > continue to traverse the circulation.it should put every mapping > > > > which is not NULL. > > You don't appear to have answered my question about whether you've > actually seen this happen (and ideally what circumstances). In my > previous email[1] I explained why I don't think this is needed. You > need to convince me that I've overlooked something. > > Thanks, > > Steve > > [1] > https://lore.kernel.org/r/31644881-134a-2d6e-dddf-e658a3a8176b%40arm.com > > > Signed-off-by: ChunyouTang <tangchunyou@icubecorp.cn> > > --- > > drivers/gpu/drm/panfrost/panfrost_job.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c > > b/drivers/gpu/drm/panfrost/panfrost_job.c index > > 6003cfeb1322..52bccc1d2d42 100644 --- > > a/drivers/gpu/drm/panfrost/panfrost_job.c +++ > > b/drivers/gpu/drm/panfrost/panfrost_job.c @@ -281,7 +281,7 @@ > > static void panfrost_job_cleanup(struct kref *ref) if > > (job->mappings) { for (i = 0; i < job->bo_count; i++) { > > if (!job->mappings[i]) > > - break; > > + continue; > > > > atomic_dec(&job->mappings[i]->obj->gpu_usecount); > > panfrost_gem_mapping_put(job->mappings[i]); > >
On 19/06/2021 04:09, Chunyou Tang wrote: > Hi Steve, > 1, > from > https://lore.kernel.org/lkml/31644881-134a-2d6e-dddf-e658a3a8176b@arm.com/ > I can see what your sent,I used a wrong email address,Now it correct. > 2, >>> Unless I'm mistaken the situation where some mappings may be NULL is >>> caused by the loop in panfrost_lookup_bos() not completing >>> successfully >>> (panfrost_gem_mapping_get() returning NULL). In this case if >>> mappings[i] >>> is NULL then all following mappings must also be NULL. So 'break' >>> allows >>> us to skip the later ones. Admittedly the performance here isn't >>> important so I'm not sure it's worth the optimisation, but AIUI this >>> code isn't actually wrong. > > from panfrost_lookup_bos(),you can see: > for (i = 0; i < job->bo_count; i++) { > struct panfrost_gem_mapping *mapping; > > bo = to_panfrost_bo(job->bos[i]); > ICUBE_DEBUG_PRINTK("panfrost bo gem handle=0x%x > is_dumb=%d\n", bo->gem_handle, bo->is_dumb); > if (!bo->is_dumb) { > mapping = panfrost_gem_mapping_get(bo, priv); > if (!mapping) { > ret = -EINVAL; > break; > } > > atomic_inc(&bo->gpu_usecount); > job->mappings[i] = mapping; > } else { > atomic_inc(&bo->gpu_usecount); > job->mappings[i] = NULL; > } > } This code isn't upstream - in drm-misc/drm-misc-next (and all mainline kernels from what I can tell) this doesn't have any "is_dumb" test. Which branch are you using? > if bo->is_dumb is TRUE,the job->mappings[i] will set to NULL,and the > while will be continue,so if job->mappings[i] is NULL,the following > can not be NULL. I agree that with the above code the panfrost_job_cleanup() would need changing. But we don't (currently) have this code upstream, so this change doesn't make sense upstream. Thanks, Steve > 3, > I've had this problem in our project,the value of is_dumb like these: > 0 > 0 > 0 > 1 > 0 > 0 > 0 > so,when job->mappings[i] is NULL,we can not break the while in > panfrost_job_cleanup(). > > thanks > Chunyou > > 于 Fri, 18 Jun 2021 13:43:25 +0100 > Steven Price <steven.price@arm.com> 写道: > >> On 17/06/2021 09:04, ChunyouTang wrote: >>> From: ChunyouTang <tangchunyou@icubecorp.cn> >>> >>> The 'break' can cause 'Memory manager not clean during takedown' >>> >>> It cannot use break to finish the circulation,it should use >>> >>> continue to traverse the circulation.it should put every mapping >>> >>> which is not NULL. >> >> You don't appear to have answered my question about whether you've >> actually seen this happen (and ideally what circumstances). In my >> previous email[1] I explained why I don't think this is needed. You >> need to convince me that I've overlooked something. >> >> Thanks, >> >> Steve >> >> [1] >> https://lore.kernel.org/r/31644881-134a-2d6e-dddf-e658a3a8176b%40arm.com >> >>> Signed-off-by: ChunyouTang <tangchunyou@icubecorp.cn> >>> --- >>> drivers/gpu/drm/panfrost/panfrost_job.c | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> >>> diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c >>> b/drivers/gpu/drm/panfrost/panfrost_job.c index >>> 6003cfeb1322..52bccc1d2d42 100644 --- >>> a/drivers/gpu/drm/panfrost/panfrost_job.c +++ >>> b/drivers/gpu/drm/panfrost/panfrost_job.c @@ -281,7 +281,7 @@ >>> static void panfrost_job_cleanup(struct kref *ref) if >>> (job->mappings) { for (i = 0; i < job->bo_count; i++) { >>> if (!job->mappings[i]) >>> - break; >>> + continue; >>> >>> atomic_dec(&job->mappings[i]->obj->gpu_usecount); >>> panfrost_gem_mapping_put(job->mappings[i]); >>> > >
Hi Steve, I make a mistake about the code branch,I will test it later, thinks for your reply. Chunyou 于 Mon, 21 Jun 2021 11:45:18 +0100 Steven Price <steven.price@arm.com> 写道: > On 19/06/2021 04:09, Chunyou Tang wrote: > > Hi Steve, > > 1, > > from > > https://lore.kernel.org/lkml/31644881-134a-2d6e-dddf-e658a3a8176b@arm.com/ > > I can see what your sent,I used a wrong email address,Now it > > correct. 2, > >>> Unless I'm mistaken the situation where some mappings may be NULL > >>> is caused by the loop in panfrost_lookup_bos() not completing > >>> successfully > >>> (panfrost_gem_mapping_get() returning NULL). In this case if > >>> mappings[i] > >>> is NULL then all following mappings must also be NULL. So 'break' > >>> allows > >>> us to skip the later ones. Admittedly the performance here isn't > >>> important so I'm not sure it's worth the optimisation, but AIUI > >>> this code isn't actually wrong. > > > > from panfrost_lookup_bos(),you can see: > > for (i = 0; i < job->bo_count; i++) { > > struct panfrost_gem_mapping *mapping; > > > > bo = to_panfrost_bo(job->bos[i]); > > ICUBE_DEBUG_PRINTK("panfrost bo gem handle=0x%x > > is_dumb=%d\n", bo->gem_handle, bo->is_dumb); > > if (!bo->is_dumb) { > > mapping = panfrost_gem_mapping_get(bo, priv); > > if (!mapping) { > > ret = -EINVAL; > > break; > > } > > > > atomic_inc(&bo->gpu_usecount); > > job->mappings[i] = mapping; > > } else { > > atomic_inc(&bo->gpu_usecount); > > job->mappings[i] = NULL; > > } > > } > > This code isn't upstream - in drm-misc/drm-misc-next (and all mainline > kernels from what I can tell) this doesn't have any "is_dumb" test. > Which branch are you using? > > > if bo->is_dumb is TRUE,the job->mappings[i] will set to NULL,and the > > while will be continue,so if job->mappings[i] is NULL,the following > > can not be NULL. > > I agree that with the above code the panfrost_job_cleanup() would need > changing. But we don't (currently) have this code upstream, so this > change doesn't make sense upstream. > > Thanks, > > Steve > > > 3, > > I've had this problem in our project,the value of is_dumb like > > these: 0 > > 0 > > 0 > > 1 > > 0 > > 0 > > 0 > > so,when job->mappings[i] is NULL,we can not break the while in > > panfrost_job_cleanup(). > > > > thanks > > Chunyou > > > > 于 Fri, 18 Jun 2021 13:43:25 +0100 > > Steven Price <steven.price@arm.com> 写道: > > > >> On 17/06/2021 09:04, ChunyouTang wrote: > >>> From: ChunyouTang <tangchunyou@icubecorp.cn> > >>> > >>> The 'break' can cause 'Memory manager not clean during takedown' > >>> > >>> It cannot use break to finish the circulation,it should use > >>> > >>> continue to traverse the circulation.it should put every mapping > >>> > >>> which is not NULL. > >> > >> You don't appear to have answered my question about whether you've > >> actually seen this happen (and ideally what circumstances). In my > >> previous email[1] I explained why I don't think this is needed. You > >> need to convince me that I've overlooked something. > >> > >> Thanks, > >> > >> Steve > >> > >> [1] > >> https://lore.kernel.org/r/31644881-134a-2d6e-dddf-e658a3a8176b%40arm.com > >> > >>> Signed-off-by: ChunyouTang <tangchunyou@icubecorp.cn> > >>> --- > >>> drivers/gpu/drm/panfrost/panfrost_job.c | 2 +- > >>> 1 file changed, 1 insertion(+), 1 deletion(-) > >>> > >>> diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c > >>> b/drivers/gpu/drm/panfrost/panfrost_job.c index > >>> 6003cfeb1322..52bccc1d2d42 100644 --- > >>> a/drivers/gpu/drm/panfrost/panfrost_job.c +++ > >>> b/drivers/gpu/drm/panfrost/panfrost_job.c @@ -281,7 +281,7 @@ > >>> static void panfrost_job_cleanup(struct kref *ref) if > >>> (job->mappings) { for (i = 0; i < job->bo_count; i++) { > >>> if (!job->mappings[i]) > >>> - break; > >>> + continue; > >>> > >>> atomic_dec(&job->mappings[i]->obj->gpu_usecount); > >>> panfrost_gem_mapping_put(job->mappings[i]); > >>> > > > >
diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c index 6003cfeb1322..52bccc1d2d42 100644 --- a/drivers/gpu/drm/panfrost/panfrost_job.c +++ b/drivers/gpu/drm/panfrost/panfrost_job.c @@ -281,7 +281,7 @@ static void panfrost_job_cleanup(struct kref *ref) if (job->mappings) { for (i = 0; i < job->bo_count; i++) { if (!job->mappings[i]) - break; + continue; atomic_dec(&job->mappings[i]->obj->gpu_usecount); panfrost_gem_mapping_put(job->mappings[i]);