virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@collabora.com>
To: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Cc: "David Airlie" <airlied@gmail.com>,
	"Gerd Hoffmann" <kraxel@redhat.com>,
	"Gurchetan Singh" <gurchetansingh@chromium.org>,
	"Chia-I Wu" <olvaffe@gmail.com>,
	"Daniel Vetter" <daniel@ffwll.ch>,
	"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"Christian König" <christian.koenig@amd.com>,
	"Qiang Yu" <yuq825@gmail.com>,
	"Steven Price" <steven.price@arm.com>,
	"Emma Anholt" <emma@anholt.net>, "Melissa Wen" <mwen@igalia.com>,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	kernel@collabora.com, virtualization@lists.linux-foundation.org
Subject: Re: [PATCH v18 18/26] drm/shmem-helper: Change sgt allocation policy
Date: Fri, 10 Nov 2023 12:15:37 +0100	[thread overview]
Message-ID: <20231110121537.6f37c5a0@collabora.com> (raw)
In-Reply-To: <20231029230205.93277-19-dmitry.osipenko@collabora.com>

On Mon, 30 Oct 2023 02:01:57 +0300
Dmitry Osipenko <dmitry.osipenko@collabora.com> wrote:

> In a preparation to addition of drm-shmem memory shrinker support, change
> the SGT allocation policy in this way:
> 
> 1. SGT can be allocated only if shmem pages are pinned at the
> time of allocation, otherwise allocation fails.
> 
> 2. Drivers must ensure that pages are pinned during the time of SGT usage
> and should get new SGT if pages were unpinned.

In general, I would discourage drivers from caching the sgt returned by
drm_gem_shmem_get_pages_sgt[_locked](), since the GEM SHMEM layer does
the caching already, so calling drm_gem_shmem_get_pages_sgt_locked()
should be pretty cheap. What this implies is that any portion of the
code using an sgt returned by drm_gem_shmem_get_pages_sgt_locked() must
be surrounded by get/pin_pages()/put/unpin_pages() calls unless the
pages are known to be pinned for the whole BO lifetime. And of course,
as soon as an MMU mapping is created, and even if the sgt is no longer
accessed, the pages must remain pinned until the MMU mapping is torn
down.

> 
> This new policy is required by the shrinker because it will move pages
> to/from SWAP unless pages are pinned, invalidating SGT pointer once pages
> are relocated.
> 
> Previous patches prepared drivers to the new policy.
> 
> Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>

> ---
>  drivers/gpu/drm/drm_gem_shmem_helper.c | 51 +++++++++++++-------------
>  1 file changed, 26 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
> index f371ebc6f85c..1420d2166b76 100644
> --- a/drivers/gpu/drm/drm_gem_shmem_helper.c
> +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
> @@ -133,6 +133,14 @@ drm_gem_shmem_free_pages(struct drm_gem_shmem_object *shmem)
>  {
>  	struct drm_gem_object *obj = &shmem->base;
>  
> +	if (shmem->sgt) {
> +		dma_unmap_sgtable(obj->dev->dev, shmem->sgt,
> +				  DMA_BIDIRECTIONAL, 0);
> +		sg_free_table(shmem->sgt);
> +		kfree(shmem->sgt);
> +		shmem->sgt = NULL;
> +	}
> +
>  #ifdef CONFIG_X86
>  	if (shmem->map_wc)
>  		set_pages_array_wb(shmem->pages, obj->size >> PAGE_SHIFT);
> @@ -155,23 +163,12 @@ void drm_gem_shmem_free(struct drm_gem_shmem_object *shmem)
>  {
>  	struct drm_gem_object *obj = &shmem->base;
>  
> -	if (obj->import_attach) {
> +	if (obj->import_attach)
>  		drm_prime_gem_destroy(obj, shmem->sgt);
> -	} else {
> -		drm_WARN_ON(obj->dev, refcount_read(&shmem->vmap_use_count));
> -
> -		if (shmem->sgt) {
> -			dma_unmap_sgtable(obj->dev->dev, shmem->sgt,
> -					  DMA_BIDIRECTIONAL, 0);
> -			sg_free_table(shmem->sgt);
> -			kfree(shmem->sgt);
> -		}
> -		if (shmem->pages)
> -			drm_gem_shmem_put_pages_locked(shmem);
>  
> -		drm_WARN_ON(obj->dev, refcount_read(&shmem->pages_use_count));
> -		drm_WARN_ON(obj->dev, refcount_read(&shmem->pages_pin_count));
> -	}
> +	drm_WARN_ON(obj->dev, refcount_read(&shmem->vmap_use_count));
> +	drm_WARN_ON(obj->dev, refcount_read(&shmem->pages_use_count));
> +	drm_WARN_ON(obj->dev, refcount_read(&shmem->pages_pin_count));
>  
>  	drm_gem_object_release(obj);
>  	kfree(shmem);
> @@ -705,6 +702,9 @@ struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_shmem_object *shmem)
>  
>  	drm_WARN_ON(obj->dev, obj->import_attach);
>  
> +	if (drm_WARN_ON(obj->dev, !shmem->pages))
> +		return ERR_PTR(-ENOMEM);
> +
>  	return drm_prime_pages_to_sg(obj->dev, shmem->pages, obj->size >> PAGE_SHIFT);
>  }
>  EXPORT_SYMBOL_GPL(drm_gem_shmem_get_sg_table);
> @@ -720,15 +720,10 @@ static struct sg_table *drm_gem_shmem_get_pages_sgt_locked(struct drm_gem_shmem_
>  
>  	drm_WARN_ON(obj->dev, obj->import_attach);
>  
> -	ret = drm_gem_shmem_get_pages_locked(shmem);
> -	if (ret)
> -		return ERR_PTR(ret);
> -
>  	sgt = drm_gem_shmem_get_sg_table(shmem);
> -	if (IS_ERR(sgt)) {
> -		ret = PTR_ERR(sgt);
> -		goto err_put_pages;
> -	}
> +	if (IS_ERR(sgt))
> +		return sgt;
> +
>  	/* Map the pages for use by the h/w. */
>  	ret = dma_map_sgtable(obj->dev->dev, sgt, DMA_BIDIRECTIONAL, 0);
>  	if (ret)
> @@ -741,8 +736,6 @@ static struct sg_table *drm_gem_shmem_get_pages_sgt_locked(struct drm_gem_shmem_
>  err_free_sgt:
>  	sg_free_table(sgt);
>  	kfree(sgt);
> -err_put_pages:
> -	drm_gem_shmem_put_pages_locked(shmem);
>  	return ERR_PTR(ret);
>  }
>  
> @@ -759,6 +752,14 @@ static struct sg_table *drm_gem_shmem_get_pages_sgt_locked(struct drm_gem_shmem_
>   * and difference between dma-buf imported and natively allocated objects.
>   * drm_gem_shmem_get_sg_table() should not be directly called by drivers.
>   *
> + * Drivers should adhere to these SGT usage rules:
> + *
> + * 1. SGT should be allocated only if shmem pages are pinned at the
> + *    time of allocation, otherwise allocation will fail.
> + *
> + * 2. Drivers should ensure that pages are pinned during the time of
> + *    SGT usage and should get new SGT if pages were unpinned.
> + *
>   * Returns:
>   * A pointer to the scatter/gather table of pinned pages or errno on failure.
>   */


  parent reply	other threads:[~2023-11-10 11:15 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20231029230205.93277-1-dmitry.osipenko@collabora.com>
     [not found] ` <20231029230205.93277-26-dmitry.osipenko@collabora.com>
2023-11-03 22:55   ` [PATCH v18 25/26] drm/virtio: Support shmem shrinking Gurchetan Singh
     [not found] ` <20231029230205.93277-6-dmitry.osipenko@collabora.com>
2023-11-10 10:08   ` [PATCH v18 05/26] drm/shmem-helper: Remove obsoleted is_iomem test Boris Brezillon
2023-11-24 10:40   ` Maxime Ripard
     [not found] ` <20231029230205.93277-12-dmitry.osipenko@collabora.com>
2023-11-10 10:16   ` [PATCH v18 11/26] drm/shmem-helper: Prepare drm_gem_shmem_free() to shrinker addition Boris Brezillon
2023-11-20 11:02     ` Dmitry Osipenko
2023-11-20 11:19       ` Boris Brezillon
2023-11-20 11:38         ` Dmitry Osipenko
     [not found] ` <20231029230205.93277-13-dmitry.osipenko@collabora.com>
2023-11-10 10:17   ` [PATCH v18 12/26] drm/shmem-helper: Make drm_gem_shmem_get_pages() public Boris Brezillon
     [not found] ` <20231029230205.93277-15-dmitry.osipenko@collabora.com>
2023-11-10 10:30   ` [PATCH v18 14/26] drm/lima: Explicitly get and put drm-shmem pages Boris Brezillon
     [not found] ` <20231029230205.93277-16-dmitry.osipenko@collabora.com>
2023-11-10 10:53   ` [PATCH v18 15/26] drm/panfrost: " Boris Brezillon
2023-11-22 22:04     ` Dmitry Osipenko
2023-11-23  9:05       ` Boris Brezillon
2023-11-23 12:24         ` Dmitry Osipenko
2023-11-23 14:33           ` Boris Brezillon
2023-11-23 14:48   ` Boris Brezillon
2023-11-24  9:40     ` Boris Brezillon
     [not found] ` <20231029230205.93277-17-dmitry.osipenko@collabora.com>
2023-11-10 10:59   ` [PATCH v18 16/26] drm/virtio: " Boris Brezillon
     [not found] ` <20231029230205.93277-18-dmitry.osipenko@collabora.com>
2023-11-10 11:01   ` [PATCH v18 17/26] drm/v3d: " Boris Brezillon
     [not found] ` <20231029230205.93277-19-dmitry.osipenko@collabora.com>
2023-11-10 11:15   ` Boris Brezillon [this message]
     [not found] ` <20231029230205.93277-20-dmitry.osipenko@collabora.com>
2023-11-10 14:58   ` [PATCH v18 19/26] drm/shmem-helper: Add common memory shrinker Boris Brezillon
2023-11-13  9:35     ` Boris Brezillon
     [not found] ` <20231029230205.93277-22-dmitry.osipenko@collabora.com>
2023-11-13  9:49   ` [PATCH v18 21/26] drm/shmem-helper: Optimize unlocked get_pages_sgt() Boris Brezillon
     [not found] ` <20231029230205.93277-23-dmitry.osipenko@collabora.com>
2023-11-13  9:54   ` [PATCH v18 22/26] drm/shmem-helper: Don't free refcounted GEM Boris Brezillon
2023-11-22 22:30     ` Dmitry Osipenko
2023-11-23  9:08       ` Boris Brezillon
2023-11-23 12:36         ` Dmitry Osipenko
     [not found] ` <20231029230205.93277-25-dmitry.osipenko@collabora.com>
2023-11-13  9:57   ` [PATCH v18 24/26] drm/virtio: Attach shmem BOs dynamically Boris Brezillon
2023-11-22 22:37     ` Dmitry Osipenko
2023-11-22 22:41       ` Dmitry Osipenko
     [not found] ` <20231029230205.93277-27-dmitry.osipenko@collabora.com>
2023-11-24 10:04   ` [PATCH v18 26/26] drm/panfrost: Switch to generic memory shrinker Boris Brezillon
     [not found] ` <20231029230205.93277-5-dmitry.osipenko@collabora.com>
2023-11-24 10:40   ` [PATCH v18 04/26] drm/shmem-helper: Refactor locked/unlocked functions Maxime Ripard
2023-11-24 10:44     ` Boris Brezillon
2023-11-24 10:59     ` Boris Brezillon
2023-11-28 11:14       ` Maxime Ripard
2023-11-28 12:37         ` Boris Brezillon
2023-11-28 22:05           ` Dmitry Osipenko
2023-11-29  7:53             ` Boris Brezillon
2023-11-29 10:47               ` Dmitry Osipenko
2023-11-29 10:57                 ` Boris Brezillon
2023-11-29 13:09               ` Maxime Ripard
2023-11-29 13:46                 ` Boris Brezillon
2023-11-29 15:15                   ` Maxime Ripard
2023-11-29 15:47                     ` Boris Brezillon
2023-12-04 12:55                       ` Maxime Ripard
2023-12-05 11:43                         ` Dmitry Osipenko
2023-12-14 18:16                           ` Maxime Ripard
2023-12-15  0:42                             ` Dmitry Osipenko
     [not found] ` <20231029230205.93277-9-dmitry.osipenko@collabora.com>
2023-11-24 10:47   ` [PATCH v18 08/26] drm/shmem-helper: Add and use lockless drm_gem_shmem_get_pages() Maxime Ripard
2023-11-24 11:20     ` Boris Brezillon
     [not found] ` <20231029230205.93277-10-dmitry.osipenko@collabora.com>
2023-11-24 10:48   ` [PATCH v18 09/26] drm/shmem-helper: Switch drm_gem_shmem_vmap/vunmap to use pin/unpin Maxime Ripard

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=20231110121537.6f37c5a0@collabora.com \
    --to=boris.brezillon@collabora.com \
    --cc=airlied@gmail.com \
    --cc=christian.koenig@amd.com \
    --cc=daniel@ffwll.ch \
    --cc=dmitry.osipenko@collabora.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=emma@anholt.net \
    --cc=gurchetansingh@chromium.org \
    --cc=kernel@collabora.com \
    --cc=kraxel@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=mwen@igalia.com \
    --cc=olvaffe@gmail.com \
    --cc=steven.price@arm.com \
    --cc=tzimmermann@suse.de \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=yuq825@gmail.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).