On 09/17, Iago Toral wrote: > Reviewed-by: Iago Toral Quiroga <[email protected]> > > With that said, I don't like how we are doing error handling here, I > think we want to simplify this and try to make it so we centralize > error handling in one place instead of having multiple error exits > paths, each one trying to do the right thing at that point. This is > error prone, as this patch is showing. > > Here is a proposal to make this better: > > Make job memory allocation part of v3d_job_init. v3d_job init already > handles error conditions nicely. If we do this, we no longer need to > handle allocation errors in ioctls one by one and for any job we only > have two scenarios: v3d_job_init was successul or it failed (in which > case we know it already cleaned up after itself and we should have a > NULL job as a result). If v3d_job_init failed, then we *always* jump to > the fail tag and there we call v3d_job_cleanup for all jobs that can be > created in that ioctl. If a job is NULL then v3d_job_cleanup returns > early, otherwise, we know it is a fully initialized job, so it does > drm_sched_job_cleanup + v3d_job_put. > > I think that should make error handling in these functions a lot > easier.
Hi,
yes, sounds good. I can include this refactoring in the v2 of the
multisync patchset, since there is a prep work there (first patch).
Thanks for reviewing both,
Melissa
>
> Iago
>
>
> On Thu, 2021-09-16 at 22:27 +0100, Melissa Wen wrote:
> > In a cl submission, when bin job initialization fails, sched job
> > resources
> > were already allocated for the render job. At this point,
> > drm_sched_job_init(render) was done in v3d_job_init but the render
> > job is
> > aborted before drm_sched_job_arm (in v3d_job_push) happens;
> > therefore, not
> > only v3d_job_put but also drm_sched_job_cleanup should be called (by
> > v3d_job_cleanup). A similar issue is addressed for csd and tfu
> > submissions.
> >
> > The issue was noticed from a review by Iago Toral in a patch that
> > touches
> > the same part of the code.
> >
> > Fixes: 916044fac8623 ("drm/v3d: Move drm_sched_job_init to
> > v3d_job_init")
> > Signed-off-by: Melissa Wen <[email protected]>
> > ---
> > drivers/gpu/drm/v3d/v3d_gem.c | 11 +++++------
> > 1 file changed, 5 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/v3d/v3d_gem.c
> > b/drivers/gpu/drm/v3d/v3d_gem.c
> > index 1953706bdaeb..ead0be8d48a7 100644
> > --- a/drivers/gpu/drm/v3d/v3d_gem.c
> > +++ b/drivers/gpu/drm/v3d/v3d_gem.c
> > @@ -567,14 +567,14 @@ v3d_submit_cl_ioctl(struct drm_device *dev,
> > void *data,
> > if (args->bcl_start != args->bcl_end) {
> > bin = kcalloc(1, sizeof(*bin), GFP_KERNEL);
> > if (!bin) {
> > - v3d_job_put(&render->base);
> > + v3d_job_cleanup(&render->base);
> >
> > > return -ENOMEM;
> > }
> >
> > ret = v3d_job_init(v3d, file_priv, &bin->base,
> > v3d_job_free, args->in_sync_bcl,
> > V3D_BIN);
> > if (ret) {
> > - v3d_job_put(&render->base);
> > + v3d_job_cleanup(&render->base);
> > kfree(bin);
> > return ret;
> > }
> > @@ -716,7 +716,7 @@ v3d_submit_tfu_ioctl(struct drm_device *dev, void
> > *data,
> > job->base.bo = kcalloc(ARRAY_SIZE(args->bo_handles),
> > sizeof(*job->base.bo), GFP_KERNEL);
> > if (!job->base.bo) {
> > - v3d_job_put(&job->base);
> > + v3d_job_cleanup(&job->base);
> > return -ENOMEM;
> > }
> >
> > @@ -810,14 +810,13 @@ v3d_submit_csd_ioctl(struct drm_device *dev,
> > void *data,
> >
> > clean_job = kcalloc(1, sizeof(*clean_job), GFP_KERNEL);
> > if (!clean_job) {
> > - v3d_job_put(&job->base);
> > - kfree(job);
> > + v3d_job_cleanup(&job->base);
> > return -ENOMEM;
> > }
> >
> > ret = v3d_job_init(v3d, file_priv, clean_job, v3d_job_free, 0,
> > V3D_CACHE_CLEAN);
> > if (ret) {
> > - v3d_job_put(&job->base);
> > + v3d_job_cleanup(&job->base);
> > kfree(clean_job);
> > return ret;
> > }
>
signature.asc
Description: PGP signature
