All of lore.kernel.org
 help / color / mirror / Atom feed
From: Melissa Wen <mwen@igalia.com>
To: Iago Toral <itoral@igalia.com>
Cc: dri-devel@lists.freedesktop.org, Emma Anholt <emma@anholt.net>,
	David Airlie <airlied@linux.ie>, Daniel Vetter <daniel@ffwll.ch>,
	Maxime Ripard <maxime@cerno.tech>,
	Boris Brezillon <boris.brezillon@collabora.com>
Subject: Re: [PATCH v2 2/4] drm/v3d: alloc and init job in one shot
Date: Thu, 30 Sep 2021 10:16:08 +0100	[thread overview]
Message-ID: <20210930091608.j56uqzumu3nt6zvx@mail.igalia.com> (raw)
In-Reply-To: <6307238d163737faf9e5c3591b1725497ce77945.camel@igalia.com>

[-- Attachment #1: Type: text/plain, Size: 4363 bytes --]

On 09/30, Iago Toral wrote:
> On Wed, 2021-09-29 at 10:43 +0100, Melissa Wen wrote:
> > Move job memory allocation to v3d_job_init function. This aim to
> > facilitate
> > error handling in job initialization, since cleanup steps are similar
> > for all
> > (struct v3d_job)-based types of job involved in a command submission.
> > To
> > generalize v3d_job_init(), this change takes into account that all
> > job structs
> > have the first element a struct v3d_job (bin, render, tfu, csd) or it
> > is a
> > v3d_job itself (clean_job) for pointer casting.
> > 
> > Suggested-by: Iago Toral <itoral@igalia.com>
> > Signed-off-by: Melissa Wen <mwen@igalia.com>
> > ---
> >  drivers/gpu/drm/v3d/v3d_gem.c | 115 +++++++++++++-------------------
> > --
> >  1 file changed, 42 insertions(+), 73 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/v3d/v3d_gem.c
> > b/drivers/gpu/drm/v3d/v3d_gem.c
> > index e60fbc28ef29..9cfa6f8d4357 100644
> > --- a/drivers/gpu/drm/v3d/v3d_gem.c
> > +++ b/drivers/gpu/drm/v3d/v3d_gem.c
> > @@ -392,6 +392,9 @@ v3d_render_job_free(struct kref *ref)
> >  
> >  void v3d_job_cleanup(struct v3d_job *job)
> >  {
> > +	if (!job)
> > +		return;
> > +
> >  	drm_sched_job_cleanup(&job->base);
> >  	v3d_job_put(job);
> >  }
> > @@ -450,12 +453,20 @@ v3d_job_add_deps(struct drm_file *file_priv,
> > struct v3d_job *job,
> >  
> >  static int
> >  v3d_job_init(struct v3d_dev *v3d, struct drm_file *file_priv,
> > -	     struct v3d_job *job, void (*free)(struct kref *ref),
> > +	     void **container, size_t size, void (*free)(struct kref
> > *ref),
> >  	     u32 in_sync, enum v3d_queue queue)
> >  {
> >  	struct v3d_file_priv *v3d_priv = file_priv->driver_priv;
> > +	struct v3d_job *job;
> >  	int ret;
> >  
> > +	*container = kcalloc(1, size, GFP_KERNEL);
> > +	if (!*container) {
> > +		DRM_ERROR("Cannot allocate memory for v3d job.");
> > +		return -ENOMEM;
> > +	}
> > +
> > +	job = *container;
> >  	job->v3d = v3d;
> >  	job->free = free;
> >  
> 
> Right below this hunk we have an early return that doesn't jump to
> fail:
> 
>         ret = pm_runtime_get_sync(v3d->drm.dev);
>         if (ret < 0)
>                 return ret;
> 
> 
> so we should kfree(*container) and set it to NULL there, right?
oh, yes. I missed it on porting downstream to upstream.
> 
> > @@ -479,6 +490,9 @@ v3d_job_init(struct v3d_dev *v3d, struct drm_file
> > *file_priv,
> >  	drm_sched_job_cleanup(&job->base);
> >  fail:
> >  	pm_runtime_put_autosuspend(v3d->drm.dev);
> > +	kfree(*container);
> > +	*container = NULL;
> > +
> >  	return ret;
> >  }
> > 
> 
> (...)
> 
> > @@ -806,29 +789,15 @@ v3d_submit_csd_ioctl(struct drm_device *dev,
> > void *data,
> >  		return -EINVAL;
> >  	}
> >  
> > -	job = kcalloc(1, sizeof(*job), GFP_KERNEL);
> > -	if (!job)
> > -		return -ENOMEM;
> > -
> > -	ret = v3d_job_init(v3d, file_priv, &job->base,
> > +	ret = v3d_job_init(v3d, file_priv, (void *)&job, sizeof(*job),
> >  			   v3d_job_free, args->in_sync, V3D_CSD);
> > -	if (ret) {
> > -		kfree(job);
> > -		return ret;
> > -	}
> > -
> > -	clean_job = kcalloc(1, sizeof(*clean_job), GFP_KERNEL);
> > -	if (!clean_job) {
> > -		v3d_job_cleanup(&job->base);
> > -		return -ENOMEM;
> > -	}
> > +	if (ret)
> > +		goto fail;
> > 
> 
> For this to work we need to explicitly initialize clean_job to NULL. 
> Notice that the same applies to the bin and clean jobs in the CL ioctl,
> but in that case we're already initializing them to NULL.
yes, thanks for pointing it out.

Melissa
> 
> > -	ret = v3d_job_init(v3d, file_priv, clean_job, v3d_job_free, 0,
> > V3D_CACHE_CLEAN);
> > -	if (ret) {
> > -		v3d_job_cleanup(&job->base);
> > -		kfree(clean_job);
> > -		return ret;
> > -	}
> > +	ret = v3d_job_init(v3d, file_priv, (void *)&clean_job,
> > sizeof(*clean_job),
> > +			   v3d_job_free, 0, V3D_CACHE_CLEAN);
> > +	if (ret)
> > +		goto fail;
> >  
> >  	job->args = *args;
> >  
> > @@ -877,7 +846,7 @@ v3d_submit_csd_ioctl(struct drm_device *dev, void
> > *data,
> >  	drm_gem_unlock_reservations(clean_job->bo, clean_job->bo_count,
> >  				    &acquire_ctx);
> >  fail:
> > -	v3d_job_cleanup(&job->base);
> > +	v3d_job_cleanup((void *)job);
> >  	v3d_job_cleanup(clean_job);
> >  
> >  	return ret;
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2021-09-30  9:16 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-29  9:41 [PATCH v2 0/4] drm/v3d: add multiple in/out syncobjs support Melissa Wen
2021-09-29  9:42 ` [PATCH v2 1/4] drm/v3d: decouple adding job dependencies steps from job init Melissa Wen
2021-09-29  9:43 ` [PATCH v2 2/4] drm/v3d: alloc and init job in one shot Melissa Wen
2021-09-30  8:44   ` Iago Toral
2021-09-30  9:16     ` Melissa Wen [this message]
2021-09-29  9:44 ` [PATCH v2 3/4] drm/v3d: add generic ioctl extension Melissa Wen
2021-09-30  9:11   ` Iago Toral
2021-09-30  9:22     ` Melissa Wen
2021-09-30  9:59       ` Iago Toral
2021-09-29  9:45 ` [PATCH v2 4/4] drm/v3d: add multiple syncobjs support Melissa Wen
2021-09-30  9:54   ` Iago Toral
2021-09-30 10:40     ` Melissa Wen
2021-09-30 16:26       ` Melissa Wen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210930091608.j56uqzumu3nt6zvx@mail.igalia.com \
    --to=mwen@igalia.com \
    --cc=airlied@linux.ie \
    --cc=boris.brezillon@collabora.com \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=emma@anholt.net \
    --cc=itoral@igalia.com \
    --cc=maxime@cerno.tech \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.