Re: [PATCH v16 02/20] drm/shmem-helper: Use flag for tracking page count bumped by get_pages_sgt()

From: Boris Brezillon
Date: Tue Sep 12 2023 - 03:07:20 EST


On Tue, 12 Sep 2023 02:41:58 +0300
Dmitry Osipenko <dmitry.osipenko@xxxxxxxxxxxxx> wrote:

> On 9/5/23 10:40, Boris Brezillon wrote:
> > On Sun, 3 Sep 2023 20:07:18 +0300
> > Dmitry Osipenko <dmitry.osipenko@xxxxxxxxxxxxx> wrote:
> >
> >> Use separate flag for tracking page count bumped by shmem->sgt to avoid
> >> imbalanced page counter during of drm_gem_shmem_free() time. It's fragile
> >> to assume that populated shmem->pages at a freeing time means that the
> >> count was bumped by drm_gem_shmem_get_pages_sgt(), using a flag removes
> >> the ambiguity.
> >>
> >> Signed-off-by: Dmitry Osipenko <dmitry.osipenko@xxxxxxxxxxxxx>
> >> ---
> >> drivers/gpu/drm/drm_gem_shmem_helper.c | 11 ++++++++++-
> >> drivers/gpu/drm/lima/lima_gem.c | 1 +
> >> include/drm/drm_gem_shmem_helper.h | 7 +++++++
> >> 3 files changed, 18 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
> >> index 6693d4061ca1..848435e08eb2 100644
> >> --- a/drivers/gpu/drm/drm_gem_shmem_helper.c
> >> +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
> >> @@ -152,8 +152,10 @@ void drm_gem_shmem_free(struct drm_gem_shmem_object *shmem)
> >> sg_free_table(shmem->sgt);
> >> kfree(shmem->sgt);
> >> }
> >> - if (shmem->pages)
> >> + if (shmem->pages) {
> >> drm_gem_shmem_put_pages(shmem);
> >> + drm_WARN_ON(obj->dev, !shmem->got_pages_sgt);
> >> + }
> >
> > Already mentioned in v15, but I keep thinking the following:
> >
> > if (shmem->sgt) {
> > // existing code in the preceding
> > // if (shmem->sgt) branch
> > ...
> >
> > /*
> > * Release the implicit pages ref taken in
> > * drm_gem_shmem_get_pages_sgt_locked().
> > */
> > drm_gem_shmem_put_pages(shmem);
> > }
> >
> > does exactly the same without requiring the addition of a new field.
>
> I'll factor out these "flag" patches into separate patchset since they
> cause too many questions.

So patch 1 and 2 in this series right?

> This is a fix for a minor bug that existed for
> many years

I'm not denying the fact there's a bug, but I'm convinced this can be
fixed without adding new flags. If there's something wrong with the
suggested solution, I'd be interested to hear more about it.

> and is difficult to trigger in practice, it can wait.

Triggering it with a real fault is hard, but you can manually fake
errors at any point in the initialization process and check what
happens.

>
> For now will be better to focus on finishing and landing the refcnt and
> shrinker patches, the rest of drm-shmem core improvements can be done
> afterwards.
>

Sounds good to me.