diff mbox series

[v3,10/17] drm/v3d: Detach the CSD job BO setup

Message ID 20231127185723.10348-12-mcanal@igalia.com (mailing list archive)
State New, archived
Headers show
Series drm/v3d: Introduce CPU jobs | expand

Commit Message

Maíra Canal Nov. 27, 2023, 6:48 p.m. UTC
From: Melissa Wen <mwen@igalia.com>

Detach CSD job setup from CSD submission ioctl to reuse it in CPU
submission ioctl for indirect CSD job.

Signed-off-by: Melissa Wen <mwen@igalia.com>
Co-developed-by: Maíra Canal <mcanal@igalia.com>
Signed-off-by: Maíra Canal <mcanal@igalia.com>
---
 drivers/gpu/drm/v3d/v3d_submit.c | 68 ++++++++++++++++++++------------
 1 file changed, 42 insertions(+), 26 deletions(-)

Comments

Iago Toral Nov. 28, 2023, 8:42 a.m. UTC | #1
El lun, 27-11-2023 a las 15:48 -0300, Maíra Canal escribió:
> From: Melissa Wen <mwen@igalia.com>
> 
> Detach CSD job setup from CSD submission ioctl to reuse it in CPU
> submission ioctl for indirect CSD job.
> 
> Signed-off-by: Melissa Wen <mwen@igalia.com>
> Co-developed-by: Maíra Canal <mcanal@igalia.com>
> Signed-off-by: Maíra Canal <mcanal@igalia.com>
> ---
>  drivers/gpu/drm/v3d/v3d_submit.c | 68 ++++++++++++++++++++----------
> --
>  1 file changed, 42 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/gpu/drm/v3d/v3d_submit.c
> b/drivers/gpu/drm/v3d/v3d_submit.c
> index c134b113b181..eb26fe1e27e3 100644
> --- a/drivers/gpu/drm/v3d/v3d_submit.c
> +++ b/drivers/gpu/drm/v3d/v3d_submit.c
> @@ -256,6 +256,45 @@ v3d_attach_fences_and_unlock_reservation(struct
> drm_file *file_priv,
>         }
>  }
>  
> +static int
> +v3d_setup_csd_jobs_and_bos(struct drm_file *file_priv,
> +                          struct v3d_dev *v3d,
> +                          struct drm_v3d_submit_csd *args,
> +                          struct v3d_csd_job **job,
> +                          struct v3d_job **clean_job,
> +                          struct v3d_submit_ext *se,
> +                          struct ww_acquire_ctx *acquire_ctx)
> +{
> +       int ret;
> +
> +       ret = v3d_job_allocate((void *)job, sizeof(**job));
> +       if (ret)
> +               return ret;
> +
> +       ret = v3d_job_init(v3d, file_priv, &(*job)->base,
> +                          v3d_job_free, args->in_sync, se, V3D_CSD);
> +       if (ret)


We should free the job here.

> +               return ret;
> +
> +       ret = v3d_job_allocate((void *)clean_job,
> sizeof(**clean_job));
> +       if (ret)
> +               return ret;
> +
> +       ret = v3d_job_init(v3d, file_priv, *clean_job,
> +                          v3d_job_free, 0, NULL, V3D_CACHE_CLEAN);
> +       if (ret)

We should free job and clean_job here.

> +               return ret;
> +
> +       (*job)->args = *args;
> +
> +       ret = v3d_lookup_bos(&v3d->drm, file_priv, *clean_job,
> +                            args->bo_handles, args-
> >bo_handle_count);
> +       if (ret)

Same here.

I think we probably want to have a fail label where we do this and just
jump there from all the paths I mentioned above.

> +               return ret;
> +
> +       return v3d_lock_bo_reservations(*clean_job, acquire_ctx);
> +}
> +
>  static void
>  v3d_put_multisync_post_deps(struct v3d_submit_ext *se)
>  {
> @@ -700,32 +739,9 @@ v3d_submit_csd_ioctl(struct drm_device *dev,
> void *data,
>                 }
>         }
>  
> -       ret = v3d_job_allocate((void *)&job, sizeof(*job));
> -       if (ret)
> -               return ret;
> -
> -       ret = v3d_job_init(v3d, file_priv, &job->base,
> -                          v3d_job_free, args->in_sync, &se,
> V3D_CSD);
> -       if (ret)
> -               goto fail;
> -
> -       ret = v3d_job_allocate((void *)&clean_job,
> sizeof(*clean_job));
> -       if (ret)
> -               goto fail;
> -
> -       ret = v3d_job_init(v3d, file_priv, clean_job,
> -                          v3d_job_free, 0, NULL, V3D_CACHE_CLEAN);
> -       if (ret)
> -               goto fail;
> -
> -       job->args = *args;
> -
> -       ret = v3d_lookup_bos(dev, file_priv, clean_job,
> -                            args->bo_handles, args-
> >bo_handle_count);
> -       if (ret)
> -               goto fail;
> -
> -       ret = v3d_lock_bo_reservations(clean_job, &acquire_ctx);
> +       ret = v3d_setup_csd_jobs_and_bos(file_priv, v3d, args,
> +                                        &job, &clean_job, &se,
> +                                        &acquire_ctx);
>         if (ret)
>                 goto fail;
>
Maíra Canal Nov. 28, 2023, 10:47 a.m. UTC | #2
Hi Iago,

On 11/28/23 05:42, Iago Toral wrote:
> El lun, 27-11-2023 a las 15:48 -0300, Maíra Canal escribió:
>> From: Melissa Wen <mwen@igalia.com>
>>
>> Detach CSD job setup from CSD submission ioctl to reuse it in CPU
>> submission ioctl for indirect CSD job.
>>
>> Signed-off-by: Melissa Wen <mwen@igalia.com>
>> Co-developed-by: Maíra Canal <mcanal@igalia.com>
>> Signed-off-by: Maíra Canal <mcanal@igalia.com>
>> ---
>>   drivers/gpu/drm/v3d/v3d_submit.c | 68 ++++++++++++++++++++----------
>> --
>>   1 file changed, 42 insertions(+), 26 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/v3d/v3d_submit.c
>> b/drivers/gpu/drm/v3d/v3d_submit.c
>> index c134b113b181..eb26fe1e27e3 100644
>> --- a/drivers/gpu/drm/v3d/v3d_submit.c
>> +++ b/drivers/gpu/drm/v3d/v3d_submit.c
>> @@ -256,6 +256,45 @@ v3d_attach_fences_and_unlock_reservation(struct
>> drm_file *file_priv,
>>          }
>>   }
>>   
>> +static int
>> +v3d_setup_csd_jobs_and_bos(struct drm_file *file_priv,
>> +                          struct v3d_dev *v3d,
>> +                          struct drm_v3d_submit_csd *args,
>> +                          struct v3d_csd_job **job,
>> +                          struct v3d_job **clean_job,
>> +                          struct v3d_submit_ext *se,
>> +                          struct ww_acquire_ctx *acquire_ctx)
>> +{
>> +       int ret;
>> +
>> +       ret = v3d_job_allocate((void *)job, sizeof(**job));
>> +       if (ret)
>> +               return ret;
>> +
>> +       ret = v3d_job_init(v3d, file_priv, &(*job)->base,
>> +                          v3d_job_free, args->in_sync, se, V3D_CSD);
>> +       if (ret)
> 
> 
> We should free the job here.
> 
>> +               return ret;
>> +
>> +       ret = v3d_job_allocate((void *)clean_job,
>> sizeof(**clean_job));
>> +       if (ret)
>> +               return ret;
>> +
>> +       ret = v3d_job_init(v3d, file_priv, *clean_job,
>> +                          v3d_job_free, 0, NULL, V3D_CACHE_CLEAN);
>> +       if (ret)
> 
> We should free job and clean_job here.
> 
>> +               return ret;
>> +
>> +       (*job)->args = *args;
>> +
>> +       ret = v3d_lookup_bos(&v3d->drm, file_priv, *clean_job,
>> +                            args->bo_handles, args-
>>> bo_handle_count);
>> +       if (ret)
> 
> Same here.
> 
> I think we probably want to have a fail label where we do this and just
> jump there from all the paths I mentioned above.

Actually, we are freeing the job in `v3d_submit_csd_ioctl`. Take a look
here:

   48         ret = v3d_setup_csd_jobs_and_bos(file_priv, v3d, args,
   47                                          &job, &clean_job, &se,
   46                                          &acquire_ctx);
   45         if (ret)
   44                 goto fail;

If `v3d_setup_csd_jobs_and_bos` fails, we go to fail.

   43
   42         if (args->perfmon_id) {
   41                 job->base.perfmon = v3d_perfmon_find(v3d_priv,
   40 
args->perfmon_id);
   39                 if (!job->base.perfmon) {
   38                         ret = -ENOENT;
   37                         goto fail_perfmon;
   36                 }
   35         }
   34
   33         mutex_lock(&v3d->sched_lock);
   32         v3d_push_job(&job->base);
   31
   30         ret = drm_sched_job_add_dependency(&clean_job->base,
   29 
dma_fence_get(job->base.done_fence));
   28         if (ret)
   27                 goto fail_unreserve;
   26
   25         v3d_push_job(clean_job);
   24         mutex_unlock(&v3d->sched_lock);
   23
   22         v3d_attach_fences_and_unlock_reservation(file_priv,
   21                                                  clean_job,
   20                                                  &acquire_ctx,
   19                                                  args->out_sync,
   18                                                  &se,
   17 
clean_job->done_fence);
   16
   15         v3d_job_put(&job->base);
   14         v3d_job_put(clean_job);
   13
   12         return 0;
   11
   10 fail_unreserve:
    9         mutex_unlock(&v3d->sched_lock);
    8 fail_perfmon:
    7         drm_gem_unlock_reservations(clean_job->bo, 
clean_job->bo_count,
    6                                     &acquire_ctx);
    5 fail:
    4         v3d_job_cleanup((void *)job);
    3         v3d_job_cleanup(clean_job);

Here we cleanup `job` and `clean_job`. This will call `v3d_job_free` and
free the jobs.

Best Regards,
- Maíra

    2         v3d_put_multisync_post_deps(&se);
    1
1167         return ret;

> 
>> +               return ret;
>> +
>> +       return v3d_lock_bo_reservations(*clean_job, acquire_ctx);
>> +}
>> +
>>   static void
>>   v3d_put_multisync_post_deps(struct v3d_submit_ext *se)
>>   {
>> @@ -700,32 +739,9 @@ v3d_submit_csd_ioctl(struct drm_device *dev,
>> void *data,
>>                  }
>>          }
>>   
>> -       ret = v3d_job_allocate((void *)&job, sizeof(*job));
>> -       if (ret)
>> -               return ret;
>> -
>> -       ret = v3d_job_init(v3d, file_priv, &job->base,
>> -                          v3d_job_free, args->in_sync, &se,
>> V3D_CSD);
>> -       if (ret)
>> -               goto fail;
>> -
>> -       ret = v3d_job_allocate((void *)&clean_job,
>> sizeof(*clean_job));
>> -       if (ret)
>> -               goto fail;
>> -
>> -       ret = v3d_job_init(v3d, file_priv, clean_job,
>> -                          v3d_job_free, 0, NULL, V3D_CACHE_CLEAN);
>> -       if (ret)
>> -               goto fail;
>> -
>> -       job->args = *args;
>> -
>> -       ret = v3d_lookup_bos(dev, file_priv, clean_job,
>> -                            args->bo_handles, args-
>>> bo_handle_count);
>> -       if (ret)
>> -               goto fail;
>> -
>> -       ret = v3d_lock_bo_reservations(clean_job, &acquire_ctx);
>> +       ret = v3d_setup_csd_jobs_and_bos(file_priv, v3d, args,
>> +                                        &job, &clean_job, &se,
>> +                                        &acquire_ctx);
>>          if (ret)
>>                  goto fail;
>>   
>
Iago Toral Nov. 29, 2023, 6:57 a.m. UTC | #3
El mar, 28-11-2023 a las 07:47 -0300, Maira Canal escribió:
> Hi Iago,
> 
> On 11/28/23 05:42, Iago Toral wrote:
> > El lun, 27-11-2023 a las 15:48 -0300, Maíra Canal escribió:
> > > From: Melissa Wen <mwen@igalia.com>
> > > 
> > > Detach CSD job setup from CSD submission ioctl to reuse it in CPU
> > > submission ioctl for indirect CSD job.
> > > 
> > > Signed-off-by: Melissa Wen <mwen@igalia.com>
> > > Co-developed-by: Maíra Canal <mcanal@igalia.com>
> > > Signed-off-by: Maíra Canal <mcanal@igalia.com>
> > > ---
> > >   drivers/gpu/drm/v3d/v3d_submit.c | 68 ++++++++++++++++++++-----
> > > -----
> > > --
> > >   1 file changed, 42 insertions(+), 26 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/v3d/v3d_submit.c
> > > b/drivers/gpu/drm/v3d/v3d_submit.c
> > > index c134b113b181..eb26fe1e27e3 100644
> > > --- a/drivers/gpu/drm/v3d/v3d_submit.c
> > > +++ b/drivers/gpu/drm/v3d/v3d_submit.c
> > > @@ -256,6 +256,45 @@
> > > v3d_attach_fences_and_unlock_reservation(struct
> > > drm_file *file_priv,
> > >          }
> > >   }
> > >   
> > > +static int
> > > +v3d_setup_csd_jobs_and_bos(struct drm_file *file_priv,
> > > +                          struct v3d_dev *v3d,
> > > +                          struct drm_v3d_submit_csd *args,
> > > +                          struct v3d_csd_job **job,
> > > +                          struct v3d_job **clean_job,
> > > +                          struct v3d_submit_ext *se,
> > > +                          struct ww_acquire_ctx *acquire_ctx)
> > > +{
> > > +       int ret;
> > > +
> > > +       ret = v3d_job_allocate((void *)job, sizeof(**job));
> > > +       if (ret)
> > > +               return ret;
> > > +
> > > +       ret = v3d_job_init(v3d, file_priv, &(*job)->base,
> > > +                          v3d_job_free, args->in_sync, se,
> > > V3D_CSD);
> > > +       if (ret)
> > 
> > 
> > We should free the job here.
> > 
> > > +               return ret;
> > > +
> > > +       ret = v3d_job_allocate((void *)clean_job,
> > > sizeof(**clean_job));
> > > +       if (ret)
> > > +               return ret;
> > > +
> > > +       ret = v3d_job_init(v3d, file_priv, *clean_job,
> > > +                          v3d_job_free, 0, NULL,
> > > V3D_CACHE_CLEAN);
> > > +       if (ret)
> > 
> > We should free job and clean_job here.
> > 
> > > +               return ret;
> > > +
> > > +       (*job)->args = *args;
> > > +
> > > +       ret = v3d_lookup_bos(&v3d->drm, file_priv, *clean_job,
> > > +                            args->bo_handles, args-
> > > > bo_handle_count);
> > > +       if (ret)
> > 
> > Same here.
> > 
> > I think we probably want to have a fail label where we do this and
> > just
> > jump there from all the paths I mentioned above.
> 
> Actually, we are freeing the job in `v3d_submit_csd_ioctl`. Take a
> look
> here:
> 
>    48         ret = v3d_setup_csd_jobs_and_bos(file_priv, v3d, args,
>    47                                          &job, &clean_job, &se,
>    46                                          &acquire_ctx);
>    45         if (ret)
>    44                 goto fail;
> 
> If `v3d_setup_csd_jobs_and_bos` fails, we go to fail.
> 
>    43
>    42         if (args->perfmon_id) {
>    41                 job->base.perfmon = v3d_perfmon_find(v3d_priv,
>    40 
> args->perfmon_id);
>    39                 if (!job->base.perfmon) {
>    38                         ret = -ENOENT;
>    37                         goto fail_perfmon;
>    36                 }
>    35         }
>    34
>    33         mutex_lock(&v3d->sched_lock);
>    32         v3d_push_job(&job->base);
>    31
>    30         ret = drm_sched_job_add_dependency(&clean_job->base,
>    29 
> dma_fence_get(job->base.done_fence));
>    28         if (ret)
>    27                 goto fail_unreserve;
>    26
>    25         v3d_push_job(clean_job);
>    24         mutex_unlock(&v3d->sched_lock);
>    23
>    22         v3d_attach_fences_and_unlock_reservation(file_priv,
>    21                                                  clean_job,
>    20                                                  &acquire_ctx,
>    19                                                  args-
> >out_sync,
>    18                                                  &se,
>    17 
> clean_job->done_fence);
>    16
>    15         v3d_job_put(&job->base);
>    14         v3d_job_put(clean_job);
>    13
>    12         return 0;
>    11
>    10 fail_unreserve:
>     9         mutex_unlock(&v3d->sched_lock);
>     8 fail_perfmon:
>     7         drm_gem_unlock_reservations(clean_job->bo, 
> clean_job->bo_count,
>     6                                     &acquire_ctx);
>     5 fail:
>     4         v3d_job_cleanup((void *)job);
>     3         v3d_job_cleanup(clean_job);
> 
> Here we cleanup `job` and `clean_job`. This will call `v3d_job_free`
> and
> free the jobs.


Ah, yes, ignore my previous comment then.

Iago

> 
> Best Regards,
> - Maíra
> 
>     2         v3d_put_multisync_post_deps(&se);
>     1
> 1167         return ret;
> 
> > 
> > > +               return ret;
> > > +
> > > +       return v3d_lock_bo_reservations(*clean_job, acquire_ctx);
> > > +}
> > > +
> > >   static void
> > >   v3d_put_multisync_post_deps(struct v3d_submit_ext *se)
> > >   {
> > > @@ -700,32 +739,9 @@ v3d_submit_csd_ioctl(struct drm_device *dev,
> > > void *data,
> > >                  }
> > >          }
> > >   
> > > -       ret = v3d_job_allocate((void *)&job, sizeof(*job));
> > > -       if (ret)
> > > -               return ret;
> > > -
> > > -       ret = v3d_job_init(v3d, file_priv, &job->base,
> > > -                          v3d_job_free, args->in_sync, &se,
> > > V3D_CSD);
> > > -       if (ret)
> > > -               goto fail;
> > > -
> > > -       ret = v3d_job_allocate((void *)&clean_job,
> > > sizeof(*clean_job));
> > > -       if (ret)
> > > -               goto fail;
> > > -
> > > -       ret = v3d_job_init(v3d, file_priv, clean_job,
> > > -                          v3d_job_free, 0, NULL,
> > > V3D_CACHE_CLEAN);
> > > -       if (ret)
> > > -               goto fail;
> > > -
> > > -       job->args = *args;
> > > -
> > > -       ret = v3d_lookup_bos(dev, file_priv, clean_job,
> > > -                            args->bo_handles, args-
> > > > bo_handle_count);
> > > -       if (ret)
> > > -               goto fail;
> > > -
> > > -       ret = v3d_lock_bo_reservations(clean_job, &acquire_ctx);
> > > +       ret = v3d_setup_csd_jobs_and_bos(file_priv, v3d, args,
> > > +                                        &job, &clean_job, &se,
> > > +                                        &acquire_ctx);
> > >          if (ret)
> > >                  goto fail;
> > >   
> > 
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/v3d/v3d_submit.c b/drivers/gpu/drm/v3d/v3d_submit.c
index c134b113b181..eb26fe1e27e3 100644
--- a/drivers/gpu/drm/v3d/v3d_submit.c
+++ b/drivers/gpu/drm/v3d/v3d_submit.c
@@ -256,6 +256,45 @@  v3d_attach_fences_and_unlock_reservation(struct drm_file *file_priv,
 	}
 }
 
+static int
+v3d_setup_csd_jobs_and_bos(struct drm_file *file_priv,
+			   struct v3d_dev *v3d,
+			   struct drm_v3d_submit_csd *args,
+			   struct v3d_csd_job **job,
+			   struct v3d_job **clean_job,
+			   struct v3d_submit_ext *se,
+			   struct ww_acquire_ctx *acquire_ctx)
+{
+	int ret;
+
+	ret = v3d_job_allocate((void *)job, sizeof(**job));
+	if (ret)
+		return ret;
+
+	ret = v3d_job_init(v3d, file_priv, &(*job)->base,
+			   v3d_job_free, args->in_sync, se, V3D_CSD);
+	if (ret)
+		return ret;
+
+	ret = v3d_job_allocate((void *)clean_job, sizeof(**clean_job));
+	if (ret)
+		return ret;
+
+	ret = v3d_job_init(v3d, file_priv, *clean_job,
+			   v3d_job_free, 0, NULL, V3D_CACHE_CLEAN);
+	if (ret)
+		return ret;
+
+	(*job)->args = *args;
+
+	ret = v3d_lookup_bos(&v3d->drm, file_priv, *clean_job,
+			     args->bo_handles, args->bo_handle_count);
+	if (ret)
+		return ret;
+
+	return v3d_lock_bo_reservations(*clean_job, acquire_ctx);
+}
+
 static void
 v3d_put_multisync_post_deps(struct v3d_submit_ext *se)
 {
@@ -700,32 +739,9 @@  v3d_submit_csd_ioctl(struct drm_device *dev, void *data,
 		}
 	}
 
-	ret = v3d_job_allocate((void *)&job, sizeof(*job));
-	if (ret)
-		return ret;
-
-	ret = v3d_job_init(v3d, file_priv, &job->base,
-			   v3d_job_free, args->in_sync, &se, V3D_CSD);
-	if (ret)
-		goto fail;
-
-	ret = v3d_job_allocate((void *)&clean_job, sizeof(*clean_job));
-	if (ret)
-		goto fail;
-
-	ret = v3d_job_init(v3d, file_priv, clean_job,
-			   v3d_job_free, 0, NULL, V3D_CACHE_CLEAN);
-	if (ret)
-		goto fail;
-
-	job->args = *args;
-
-	ret = v3d_lookup_bos(dev, file_priv, clean_job,
-			     args->bo_handles, args->bo_handle_count);
-	if (ret)
-		goto fail;
-
-	ret = v3d_lock_bo_reservations(clean_job, &acquire_ctx);
+	ret = v3d_setup_csd_jobs_and_bos(file_priv, v3d, args,
+					 &job, &clean_job, &se,
+					 &acquire_ctx);
 	if (ret)
 		goto fail;