[PATCH 1/5] drm/panfrost: Restructure the GEM object creation

Rob Herring robh at kernel.org
Fri Jul 19 22:22:01 UTC 2019


On Thu, Jul 18, 2019 at 9:03 AM Steven Price <steven.price at arm.com> wrote:
>
> On 17/07/2019 19:33, Rob Herring wrote:
> > Setting the GPU VA when creating the GEM object doesn't allow for any
> > conditional adjustments. In preparation to support adjusting the
> > mapping, restructure the GEM object creation to map the GEM object after
> > we've created the base shmem object.
> >
> > Cc: Tomeu Vizoso <tomeu.vizoso at collabora.com>
> > Cc: Boris Brezillon <boris.brezillon at collabora.com>
> > Cc: Robin Murphy <robin.murphy at arm.com>
> > Cc: Steven Price <steven.price at arm.com>
> > Cc: Alyssa Rosenzweig <alyssa at rosenzweig.io>
> > Signed-off-by: Rob Herring <robh at kernel.org>
>
> Hi Rob,
>
> I couldn't work out what base this series should be applied to, but I've
> tried manually applying it against Linus' tree and run a few tests.

It's drm-misc-next plus some fixes in drm-misc-fixes that haven't been
merged into drm-misc-next yet. I'll post a git branch on the next
version.

> PANFROST_BO_NOEXEC works as expected, but PANFROST_BO_HEAP seems to
> cause a memory leak.
>
> > ---
> >  drivers/gpu/drm/panfrost/panfrost_drv.c | 21 +++------
> >  drivers/gpu/drm/panfrost/panfrost_gem.c | 58 ++++++++++++++++++++-----
> >  drivers/gpu/drm/panfrost/panfrost_gem.h |  5 +++
> >  3 files changed, 59 insertions(+), 25 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
> > index cb43ff4ebf4a..d354b92964d5 100644
> > --- a/drivers/gpu/drm/panfrost/panfrost_drv.c
> > +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
> > @@ -46,29 +46,20 @@ static int panfrost_ioctl_get_param(struct drm_device *ddev, void *data, struct
> >  static int panfrost_ioctl_create_bo(struct drm_device *dev, void *data,
> >               struct drm_file *file)
> >  {
> > -     int ret;
> > -     struct drm_gem_shmem_object *shmem;
> > +     struct panfrost_gem_object *bo;
> >       struct drm_panfrost_create_bo *args = data;
> >
> >       if (!args->size || args->flags || args->pad)
> >               return -EINVAL;
> >
> > -     shmem = drm_gem_shmem_create_with_handle(file, dev, args->size,
> > -                                              &args->handle);
> > -     if (IS_ERR(shmem))
> > -             return PTR_ERR(shmem);
> > -
> > -     ret = panfrost_mmu_map(to_panfrost_bo(&shmem->base));
> > -     if (ret)
> > -             goto err_free;
> > +     bo = panfrost_gem_create_with_handle(file, dev, args->size, args->flags,
> > +                                          &args->handle);
> > +     if (IS_ERR(bo))
> > +             return PTR_ERR(bo);
> >
> > -     args->offset = to_panfrost_bo(&shmem->base)->node.start << PAGE_SHIFT;
> > +     args->offset = bo->node.start << PAGE_SHIFT;
> >
> >       return 0;
> > -
> > -err_free:
> > -     drm_gem_handle_delete(file, args->handle);
> > -     return ret;
> >  }
> >
> >  /**
> > diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c
> > index 543ab1b81bd5..df70dcf3cb2f 100644
> > --- a/drivers/gpu/drm/panfrost/panfrost_gem.c
> > +++ b/drivers/gpu/drm/panfrost/panfrost_gem.c
> > @@ -23,7 +23,8 @@ static void panfrost_gem_free_object(struct drm_gem_object *obj)
> >               panfrost_mmu_unmap(bo);
> >
> >       spin_lock(&pfdev->mm_lock);
> > -     drm_mm_remove_node(&bo->node);
> > +     if (drm_mm_node_allocated(&bo->node))
> > +             drm_mm_remove_node(&bo->node);
>
> I'm not sure this change should be here - it looks more like it was
> meant as part of patch 4.

It's needed here because because we do the mapping later instead of
the .gem_create_object() hook. So when we free the object in case of
errors, the mapping may or may not have been created.

Rob


More information about the dri-devel mailing list