From nobody Sun Feb 8 15:57:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C20AC001B0 for ; Sat, 22 Jul 2023 23:53:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229881AbjGVXx5 (ORCPT ); Sat, 22 Jul 2023 19:53:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60578 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229936AbjGVXxd (ORCPT ); Sat, 22 Jul 2023 19:53:33 -0400 Received: from madras.collabora.co.uk (madras.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e5ab]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6CB2D2D50 for ; Sat, 22 Jul 2023 16:53:19 -0700 (PDT) Received: from workpc.. (109-252-150-127.dynamic.spd-mgts.ru [109.252.150.127]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: dmitry.osipenko) by madras.collabora.co.uk (Postfix) with ESMTPSA id 3B5C166070F6; Sun, 23 Jul 2023 00:53:16 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1690069997; bh=MM5hOaImEnpU80xbO+7OJdi5fnMYE6YvufN14idB8CY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=j3BkL+p2J7mqw8As7kDCmb/96PY0RI/o0QcTzXJdNTKwxDhHTxaSlEJl4hgTD9s6i MKCQhgVKe1+XdprvO6OlRy9mTEseeQzcF+TAZ+SE5xECBZk5AFHyMTn19w7txXNUOx IhDdoJchAokl5JbXPL9TCG/ZWF5U33klDL/PPoaX95FJnUXV3vrZL7/sZiTwi5cu7U q0LkXsI/rUbKMksQta/lf0Xhson9BfPrHQvzcmjryI53QELdGLu0bbyMG8Je/UgtJ6 f68FGH7TbCMEaUgqh5IxkxMUTdS1k1QPdiBKe9KNa79fB2SlZ8eD50XBPLQu48RyfB Ek8PDT/E7MW3w== From: Dmitry Osipenko To: David Airlie , Gerd Hoffmann , Gurchetan Singh , Chia-I Wu , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , =?UTF-8?q?Christian=20K=C3=B6nig?= , Qiang Yu , Steven Price , Boris Brezillon , Emma Anholt , Melissa Wen Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, kernel@collabora.com, virtualization@lists.linux-foundation.org Subject: [PATCH v14 10/12] drm/shmem-helper: Refactor locked/unlocked functions Date: Sun, 23 Jul 2023 02:47:44 +0300 Message-ID: <20230722234746.205949-11-dmitry.osipenko@collabora.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230722234746.205949-1-dmitry.osipenko@collabora.com> References: <20230722234746.205949-1-dmitry.osipenko@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add locked/unlocked postfixes to drm-shmem function names to make clear where reservation lock is taken and where not. Add more common helpers to drm_gem_shmem_helper.h Suggested-by: Boris Brezillon Signed-off-by: Dmitry Osipenko --- drivers/gpu/drm/drm_gem_shmem_helper.c | 172 +++++++++--------------- drivers/gpu/drm/lima/lima_gem.c | 10 +- drivers/gpu/drm/panfrost/panfrost_drv.c | 2 +- drivers/gpu/drm/panfrost/panfrost_gem.c | 12 +- drivers/gpu/drm/panfrost/panfrost_mmu.c | 2 +- drivers/gpu/drm/v3d/v3d_bo.c | 10 +- drivers/gpu/drm/virtio/virtgpu_gem.c | 4 +- drivers/gpu/drm/virtio/virtgpu_object.c | 16 +-- include/drm/drm_gem_shmem_helper.h | 133 +++++++++--------- 9 files changed, 166 insertions(+), 195 deletions(-) diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_g= em_shmem_helper.c index 87cef8e91fad..3dd4da18eedf 100644 --- a/drivers/gpu/drm/drm_gem_shmem_helper.c +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c @@ -41,12 +41,12 @@ MODULE_IMPORT_NS(DMA_BUF); static const struct drm_gem_object_funcs drm_gem_shmem_funcs =3D { .free =3D drm_gem_shmem_object_free, .print_info =3D drm_gem_shmem_object_print_info, - .pin =3D drm_gem_shmem_object_pin, - .unpin =3D drm_gem_shmem_object_unpin, + .pin =3D drm_gem_shmem_object_pin_unlocked, + .unpin =3D drm_gem_shmem_object_unpin_unlocked, .get_sg_table =3D drm_gem_shmem_object_get_sg_table, - .vmap =3D drm_gem_shmem_object_vmap, - .vunmap =3D drm_gem_shmem_object_vunmap, - .mmap =3D drm_gem_shmem_object_mmap, + .vmap =3D drm_gem_shmem_object_vmap_locked, + .vunmap =3D drm_gem_shmem_object_vunmap_locked, + .mmap =3D drm_gem_shmem_object_mmap_unlocked, .vm_ops =3D &drm_gem_shmem_vm_ops, }; =20 @@ -155,7 +155,7 @@ static bool drm_gem_shmem_is_evictable(struct drm_gem_s= hmem_object *shmem) } =20 static void -drm_gem_shmem_update_pages_state(struct drm_gem_shmem_object *shmem) +drm_gem_shmem_update_pages_state_locked(struct drm_gem_shmem_object *shmem) { struct drm_gem_object *obj =3D &shmem->base; struct drm_gem_shmem *shmem_mm =3D obj->dev->shmem_mm; @@ -193,7 +193,7 @@ void drm_gem_shmem_free(struct drm_gem_shmem_object *sh= mem) drm_prime_gem_destroy(obj, shmem->sgt); } else { /* take out shmem GEM object from the memory shrinker */ - drm_gem_shmem_madvise(shmem, -1); + drm_gem_shmem_madvise_locked(shmem, -1); =20 drm_WARN_ON(obj->dev, shmem->vmap_use_count); =20 @@ -204,7 +204,7 @@ void drm_gem_shmem_free(struct drm_gem_shmem_object *sh= mem) kfree(shmem->sgt); } if (shmem->pages_use_count) - drm_gem_shmem_put_pages(shmem); + drm_gem_shmem_put_pages_locked(shmem); =20 drm_WARN_ON(obj->dev, shmem->pages_use_count); } @@ -267,7 +267,7 @@ static int drm_gem_shmem_get_pages(struct drm_gem_shmem= _object *shmem) return -ENOMEM; =20 if (shmem->pages_use_count++ > 0) { - err =3D drm_gem_shmem_swapin(shmem); + err =3D drm_gem_shmem_swapin_locked(shmem); if (err) goto err_zero_use; =20 @@ -278,7 +278,7 @@ static int drm_gem_shmem_get_pages(struct drm_gem_shmem= _object *shmem) if (err) goto err_zero_use; =20 - drm_gem_shmem_update_pages_state(shmem); + drm_gem_shmem_update_pages_state_locked(shmem); =20 return 0; =20 @@ -289,7 +289,7 @@ static int drm_gem_shmem_get_pages(struct drm_gem_shmem= _object *shmem) } =20 static void -drm_gem_shmem_release_pages(struct drm_gem_shmem_object *shmem) +drm_gem_shmem_release_pages_locked(struct drm_gem_shmem_object *shmem) { struct drm_gem_object *obj =3D &shmem->base; =20 @@ -312,12 +312,12 @@ drm_gem_shmem_release_pages(struct drm_gem_shmem_obje= ct *shmem) } =20 /* - * drm_gem_shmem_put_pages - Decrease use count on the backing pages for a= shmem GEM object + * drm_gem_shmem_put_pages_locked - Decrease use count on the backing page= s for a shmem GEM object * @shmem: shmem GEM object * * This function decreases the use count and puts the backing pages when u= se drops to zero. */ -void drm_gem_shmem_put_pages(struct drm_gem_shmem_object *shmem) +void drm_gem_shmem_put_pages_locked(struct drm_gem_shmem_object *shmem) { struct drm_gem_object *obj =3D &shmem->base; =20 @@ -329,16 +329,19 @@ void drm_gem_shmem_put_pages(struct drm_gem_shmem_obj= ect *shmem) if (--shmem->pages_use_count > 0) return; =20 - drm_gem_shmem_release_pages(shmem); + drm_gem_shmem_release_pages_locked(shmem); =20 - drm_gem_shmem_update_pages_state(shmem); + drm_gem_shmem_update_pages_state_locked(shmem); } -EXPORT_SYMBOL(drm_gem_shmem_put_pages); +EXPORT_SYMBOL_GPL(drm_gem_shmem_put_pages_locked); =20 -static int drm_gem_shmem_pin_locked(struct drm_gem_shmem_object *shmem) +int drm_gem_shmem_pin_locked(struct drm_gem_shmem_object *shmem) { + struct drm_gem_object *obj =3D &shmem->base; int ret; =20 + drm_WARN_ON(obj->dev, obj->import_attach); + dma_resv_assert_held(shmem->base.resv); =20 ret =3D drm_gem_shmem_get_pages(shmem); @@ -347,8 +350,9 @@ static int drm_gem_shmem_pin_locked(struct drm_gem_shme= m_object *shmem) =20 return ret; } +EXPORT_SYMBOL_GPL(drm_gem_shmem_pin_locked); =20 -static void drm_gem_shmem_unpin_locked(struct drm_gem_shmem_object *shmem) +void drm_gem_shmem_unpin_locked(struct drm_gem_shmem_object *shmem) { struct drm_gem_object *obj =3D &shmem->base; =20 @@ -357,59 +361,14 @@ static void drm_gem_shmem_unpin_locked(struct drm_gem= _shmem_object *shmem) if (drm_WARN_ON_ONCE(obj->dev, !shmem->pages_pin_count)) return; =20 - drm_gem_shmem_put_pages(shmem); + drm_gem_shmem_put_pages_locked(shmem); =20 shmem->pages_pin_count--; } - -/** - * drm_gem_shmem_pin - Pin backing pages for a shmem GEM object - * @shmem: shmem GEM object - * - * This function makes sure the backing pages are pinned in memory while t= he - * buffer is exported. - * - * Returns: - * 0 on success or a negative error code on failure. - */ -int drm_gem_shmem_pin(struct drm_gem_shmem_object *shmem) -{ - struct drm_gem_object *obj =3D &shmem->base; - int ret; - - drm_WARN_ON(obj->dev, obj->import_attach); - - ret =3D dma_resv_lock_interruptible(shmem->base.resv, NULL); - if (ret) - return ret; - ret =3D drm_gem_shmem_pin_locked(shmem); - dma_resv_unlock(shmem->base.resv); - - return ret; -} -EXPORT_SYMBOL(drm_gem_shmem_pin); - -/** - * drm_gem_shmem_unpin - Unpin backing pages for a shmem GEM object - * @shmem: shmem GEM object - * - * This function removes the requirement that the backing pages are pinned= in - * memory. - */ -void drm_gem_shmem_unpin(struct drm_gem_shmem_object *shmem) -{ - struct drm_gem_object *obj =3D &shmem->base; - - drm_WARN_ON(obj->dev, obj->import_attach); - - dma_resv_lock(shmem->base.resv, NULL); - drm_gem_shmem_unpin_locked(shmem); - dma_resv_unlock(shmem->base.resv); -} -EXPORT_SYMBOL(drm_gem_shmem_unpin); +EXPORT_SYMBOL_GPL(drm_gem_shmem_unpin_locked); =20 /* - * drm_gem_shmem_vmap - Create a virtual mapping for a shmem GEM object + * drm_gem_shmem_vmap_locked - Create a virtual mapping for a shmem GEM ob= ject * @shmem: shmem GEM object * @map: Returns the kernel virtual address of the SHMEM GEM object's back= ing * store. @@ -418,13 +377,13 @@ EXPORT_SYMBOL(drm_gem_shmem_unpin); * exists for the buffer backing the shmem GEM object. It hides the differ= ences * between dma-buf imported and natively allocated objects. * - * Acquired mappings should be cleaned up by calling drm_gem_shmem_vunmap(= ). + * Acquired mappings should be cleaned up by calling drm_gem_shmem_vunmap_= locked(). * * Returns: * 0 on success or a negative error code on failure. */ -int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, - struct iosys_map *map) +int drm_gem_shmem_vmap_locked(struct drm_gem_shmem_object *shmem, + struct iosys_map *map) { struct drm_gem_object *obj =3D &shmem->base; int ret =3D 0; @@ -470,22 +429,22 @@ int drm_gem_shmem_vmap(struct drm_gem_shmem_object *s= hmem, =20 return ret; } -EXPORT_SYMBOL(drm_gem_shmem_vmap); +EXPORT_SYMBOL_GPL(drm_gem_shmem_vmap_locked); =20 /* - * drm_gem_shmem_vunmap - Unmap a virtual mapping for a shmem GEM object + * drm_gem_shmem_vunmap_locked - Unmap a virtual mapping for a shmem GEM o= bject * @shmem: shmem GEM object * @map: Kernel virtual address where the SHMEM GEM object was mapped * * This function cleans up a kernel virtual address mapping acquired by - * drm_gem_shmem_vmap(). The mapping is only removed when the use count dr= ops to - * zero. + * drm_gem_shmem_vmap_locked(). The mapping is only removed when the use c= ount + * drops to zero. * * This function hides the differences between dma-buf imported and native= ly * allocated objects. */ -void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, - struct iosys_map *map) +void drm_gem_shmem_vunmap_locked(struct drm_gem_shmem_object *shmem, + struct iosys_map *map) { struct drm_gem_object *obj =3D &shmem->base; =20 @@ -506,7 +465,7 @@ void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *= shmem, =20 shmem->vaddr =3D NULL; } -EXPORT_SYMBOL(drm_gem_shmem_vunmap); +EXPORT_SYMBOL_GPL(drm_gem_shmem_vunmap_locked); =20 static int drm_gem_shmem_create_with_handle(struct drm_file *file_priv, @@ -534,7 +493,7 @@ drm_gem_shmem_create_with_handle(struct drm_file *file_= priv, /* Update madvise status, returns true if not purged, else * false or -errno. */ -int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv) +int drm_gem_shmem_madvise_locked(struct drm_gem_shmem_object *shmem, int m= adv) { drm_gem_shmem_resv_assert_held(shmem); =20 @@ -543,13 +502,13 @@ int drm_gem_shmem_madvise(struct drm_gem_shmem_object= *shmem, int madv) =20 madv =3D shmem->madv; =20 - drm_gem_shmem_update_pages_state(shmem); + drm_gem_shmem_update_pages_state_locked(shmem); =20 return (madv >=3D 0); } -EXPORT_SYMBOL(drm_gem_shmem_madvise); +EXPORT_SYMBOL_GPL(drm_gem_shmem_madvise_locked); =20 -static void drm_gem_shmem_unpin_pages(struct drm_gem_shmem_object *shmem) +static void drm_gem_shmem_unpin_pages_locked(struct drm_gem_shmem_object *= shmem) { struct drm_gem_object *obj =3D &shmem->base; struct drm_device *dev =3D obj->dev; @@ -560,7 +519,7 @@ static void drm_gem_shmem_unpin_pages(struct drm_gem_sh= mem_object *shmem) return; =20 dma_unmap_sgtable(dev->dev, shmem->sgt, DMA_BIDIRECTIONAL, 0); - drm_gem_shmem_release_pages(shmem); + drm_gem_shmem_release_pages_locked(shmem); drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping); =20 sg_free_table(shmem->sgt); @@ -568,13 +527,13 @@ static void drm_gem_shmem_unpin_pages(struct drm_gem_= shmem_object *shmem) shmem->sgt =3D NULL; } =20 -void drm_gem_shmem_purge(struct drm_gem_shmem_object *shmem) +void drm_gem_shmem_purge_locked(struct drm_gem_shmem_object *shmem) { struct drm_gem_object *obj =3D &shmem->base; =20 drm_WARN_ON(obj->dev, !drm_gem_shmem_is_purgeable(shmem)); =20 - drm_gem_shmem_unpin_pages(shmem); + drm_gem_shmem_unpin_pages_locked(shmem); drm_gem_free_mmap_offset(obj); =20 /* Our goal here is to return as much of the memory as @@ -588,13 +547,13 @@ void drm_gem_shmem_purge(struct drm_gem_shmem_object = *shmem) =20 shmem->madv =3D -1; shmem->evicted =3D false; - drm_gem_shmem_update_pages_state(shmem); + drm_gem_shmem_update_pages_state_locked(shmem); } -EXPORT_SYMBOL(drm_gem_shmem_purge); +EXPORT_SYMBOL_GPL(drm_gem_shmem_purge_locked); =20 /** - * drm_gem_shmem_swapin() - Moves shmem GEM back to memory and enables - * hardware access to the memory. + * drm_gem_shmem_swapin_locked() - Moves shmem GEM back to memory and enab= les + * hardware access to the memory. * @shmem: shmem GEM object * * This function moves shmem GEM back to memory if it was previously evict= ed @@ -603,7 +562,7 @@ EXPORT_SYMBOL(drm_gem_shmem_purge); * Returns: * 0 on success or a negative error code on failure. */ -int drm_gem_shmem_swapin(struct drm_gem_shmem_object *shmem) +int drm_gem_shmem_swapin_locked(struct drm_gem_shmem_object *shmem) { struct drm_gem_object *obj =3D &shmem->base; struct sg_table *sgt; @@ -631,7 +590,7 @@ int drm_gem_shmem_swapin(struct drm_gem_shmem_object *s= hmem) shmem->sgt =3D sgt; shmem->evicted =3D false; =20 - drm_gem_shmem_update_pages_state(shmem); + drm_gem_shmem_update_pages_state_locked(shmem); } =20 if (!shmem->pages) @@ -639,7 +598,7 @@ int drm_gem_shmem_swapin(struct drm_gem_shmem_object *s= hmem) =20 return 0; } -EXPORT_SYMBOL_GPL(drm_gem_shmem_swapin); +EXPORT_SYMBOL_GPL(drm_gem_shmem_swapin_locked); =20 /** * drm_gem_shmem_dumb_create - Create a dumb shmem buffer object @@ -702,7 +661,7 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *= vmf) if (page_offset >=3D num_pages || (!shmem->pages && !shmem->evicted)) { ret =3D VM_FAULT_SIGBUS; } else { - err =3D drm_gem_shmem_swapin(shmem); + err =3D drm_gem_shmem_swapin_locked(shmem); if (err) { ret =3D VM_FAULT_OOM; goto unlock; @@ -736,7 +695,7 @@ static void drm_gem_shmem_vm_open(struct vm_area_struct= *vma) if (!drm_WARN_ON_ONCE(obj->dev, !shmem->pages_use_count)) shmem->pages_use_count++; =20 - drm_gem_shmem_update_pages_state(shmem); + drm_gem_shmem_update_pages_state_locked(shmem); dma_resv_unlock(shmem->base.resv); =20 drm_gem_vm_open(vma); @@ -748,7 +707,7 @@ static void drm_gem_shmem_vm_close(struct vm_area_struc= t *vma) struct drm_gem_shmem_object *shmem =3D to_drm_gem_shmem_obj(obj); =20 dma_resv_lock(shmem->base.resv, NULL); - drm_gem_shmem_put_pages(shmem); + drm_gem_shmem_put_pages_locked(shmem); dma_resv_unlock(shmem->base.resv); =20 drm_gem_vm_close(vma); @@ -762,7 +721,7 @@ const struct vm_operations_struct drm_gem_shmem_vm_ops = =3D { EXPORT_SYMBOL_GPL(drm_gem_shmem_vm_ops); =20 /** - * drm_gem_shmem_mmap - Memory-map a shmem GEM object + * drm_gem_shmem_mmap_unlocked - Memory-map a shmem GEM object * @shmem: shmem GEM object * @vma: VMA for the area to be mapped * @@ -772,7 +731,8 @@ EXPORT_SYMBOL_GPL(drm_gem_shmem_vm_ops); * Returns: * 0 on success or a negative error code on failure. */ -int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_= struct *vma) +int drm_gem_shmem_mmap_unlocked(struct drm_gem_shmem_object *shmem, + struct vm_area_struct *vma) { struct drm_gem_object *obj =3D &shmem->base; int ret; @@ -802,7 +762,7 @@ int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shm= em, struct vm_area_struct =20 return 0; } -EXPORT_SYMBOL_GPL(drm_gem_shmem_mmap); +EXPORT_SYMBOL_GPL(drm_gem_shmem_mmap_unlocked); =20 /** * drm_gem_shmem_print_info() - Print &drm_gem_shmem_object info for debug= fs @@ -875,7 +835,7 @@ struct sg_table *drm_gem_shmem_get_pages_sgt_locked(str= uct drm_gem_shmem_object =20 shmem->sgt =3D sgt; =20 - drm_gem_shmem_update_pages_state(shmem); + drm_gem_shmem_update_pages_state_locked(shmem); =20 return sgt; =20 @@ -883,7 +843,7 @@ struct sg_table *drm_gem_shmem_get_pages_sgt_locked(str= uct drm_gem_shmem_object sg_free_table(sgt); kfree(sgt); err_put_pages: - drm_gem_shmem_put_pages(shmem); + drm_gem_shmem_put_pages_locked(shmem); return ERR_PTR(ret); } EXPORT_SYMBOL_GPL(drm_gem_shmem_get_pages_sgt_locked); @@ -974,21 +934,21 @@ drm_gem_shmem_shrinker_count_objects(struct shrinker = *shrinker, return count ?: SHRINK_EMPTY; } =20 -void drm_gem_shmem_evict(struct drm_gem_shmem_object *shmem) +void drm_gem_shmem_evict_locked(struct drm_gem_shmem_object *shmem) { struct drm_gem_object *obj =3D &shmem->base; =20 drm_WARN_ON(obj->dev, !drm_gem_shmem_is_evictable(shmem)); drm_WARN_ON(obj->dev, shmem->evicted); =20 - drm_gem_shmem_unpin_pages(shmem); + drm_gem_shmem_unpin_pages_locked(shmem); =20 shmem->evicted =3D true; - drm_gem_shmem_update_pages_state(shmem); + drm_gem_shmem_update_pages_state_locked(shmem); } -EXPORT_SYMBOL_GPL(drm_gem_shmem_evict); +EXPORT_SYMBOL_GPL(drm_gem_shmem_evict_locked); =20 -static bool drm_gem_shmem_shrinker_evict(struct drm_gem_object *obj) +static bool drm_gem_shmem_shrinker_evict_locked(struct drm_gem_object *obj) { struct drm_gem_shmem_object *shmem =3D to_drm_gem_shmem_obj(obj); int err; @@ -1004,7 +964,7 @@ static bool drm_gem_shmem_shrinker_evict(struct drm_ge= m_object *obj) return true; } =20 -static bool drm_gem_shmem_shrinker_purge(struct drm_gem_object *obj) +static bool drm_gem_shmem_shrinker_purge_locked(struct drm_gem_object *obj) { struct drm_gem_shmem_object *shmem =3D to_drm_gem_shmem_obj(obj); int err; @@ -1033,13 +993,13 @@ drm_gem_shmem_shrinker_scan_objects(struct shrinker = *shrinker, /* purge as many objects as we can */ freed +=3D drm_gem_lru_scan(&shmem_shrinker->lru_evictable, nr_to_scan, &remaining, - drm_gem_shmem_shrinker_purge); + drm_gem_shmem_shrinker_purge_locked); =20 /* evict as many objects as we can */ if (freed < nr_to_scan) freed +=3D drm_gem_lru_scan(&shmem_shrinker->lru_evictable, nr_to_scan - freed, &remaining, - drm_gem_shmem_shrinker_evict); + drm_gem_shmem_shrinker_evict_locked); =20 return (freed > 0 && remaining > 0) ? freed : SHRINK_STOP; } diff --git a/drivers/gpu/drm/lima/lima_gem.c b/drivers/gpu/drm/lima/lima_ge= m.c index 4f9736e5f929..492e5cf739bb 100644 --- a/drivers/gpu/drm/lima/lima_gem.c +++ b/drivers/gpu/drm/lima/lima_gem.c @@ -180,7 +180,7 @@ static int lima_gem_pin(struct drm_gem_object *obj) if (bo->heap_size) return -EINVAL; =20 - return drm_gem_shmem_pin(&bo->base); + return drm_gem_shmem_object_pin_unlocked(obj); } =20 static int lima_gem_vmap(struct drm_gem_object *obj, struct iosys_map *map) @@ -190,7 +190,7 @@ static int lima_gem_vmap(struct drm_gem_object *obj, st= ruct iosys_map *map) if (bo->heap_size) return -EINVAL; =20 - return drm_gem_shmem_vmap(&bo->base, map); + return drm_gem_shmem_object_vmap_locked(obj, map); } =20 static int lima_gem_mmap(struct drm_gem_object *obj, struct vm_area_struct= *vma) @@ -200,7 +200,7 @@ static int lima_gem_mmap(struct drm_gem_object *obj, st= ruct vm_area_struct *vma) if (bo->heap_size) return -EINVAL; =20 - return drm_gem_shmem_mmap(&bo->base, vma); + return drm_gem_shmem_object_mmap_unlocked(obj, vma); } =20 static const struct drm_gem_object_funcs lima_gem_funcs =3D { @@ -209,10 +209,10 @@ static const struct drm_gem_object_funcs lima_gem_fun= cs =3D { .close =3D lima_gem_object_close, .print_info =3D drm_gem_shmem_object_print_info, .pin =3D lima_gem_pin, - .unpin =3D drm_gem_shmem_object_unpin, + .unpin =3D drm_gem_shmem_object_unpin_unlocked, .get_sg_table =3D drm_gem_shmem_object_get_sg_table, .vmap =3D lima_gem_vmap, - .vunmap =3D drm_gem_shmem_object_vunmap, + .vunmap =3D drm_gem_shmem_object_vunmap_locked, .mmap =3D lima_gem_mmap, .vm_ops =3D &drm_gem_shmem_vm_ops, }; diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panf= rost/panfrost_drv.c index d1b2bd6db443..74d802e5b1a6 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -437,7 +437,7 @@ static int panfrost_ioctl_madvise(struct drm_device *de= v, void *data, } } =20 - args->retained =3D drm_gem_shmem_madvise(&bo->base, args->madv); + args->retained =3D drm_gem_shmem_madvise_locked(&bo->base, args->madv); =20 out_unlock_mappings: mutex_unlock(&bo->mappings.lock); diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panf= rost/panfrost_gem.c index 08d795c28b4e..6dcf8368d184 100644 --- a/drivers/gpu/drm/panfrost/panfrost_gem.c +++ b/drivers/gpu/drm/panfrost/panfrost_gem.c @@ -182,7 +182,7 @@ static int panfrost_gem_pin(struct drm_gem_object *obj) if (bo->is_heap) return -EINVAL; =20 - return drm_gem_shmem_pin(&bo->base); + return drm_gem_shmem_object_pin_unlocked(obj); } =20 static int panfrost_shmem_evict(struct drm_gem_object *obj) @@ -197,7 +197,7 @@ static int panfrost_shmem_evict(struct drm_gem_object *= obj) =20 panfrost_gem_teardown_mappings_locked(bo); =20 - drm_gem_shmem_purge(&bo->base); + drm_gem_shmem_purge_locked(&bo->base); =20 mutex_unlock(&bo->mappings.lock); =20 @@ -210,11 +210,11 @@ static const struct drm_gem_object_funcs panfrost_gem= _funcs =3D { .close =3D panfrost_gem_close, .print_info =3D drm_gem_shmem_object_print_info, .pin =3D panfrost_gem_pin, - .unpin =3D drm_gem_shmem_object_unpin, + .unpin =3D drm_gem_shmem_object_unpin_unlocked, .get_sg_table =3D drm_gem_shmem_object_get_sg_table, - .vmap =3D drm_gem_shmem_object_vmap, - .vunmap =3D drm_gem_shmem_object_vunmap, - .mmap =3D drm_gem_shmem_object_mmap, + .vmap =3D drm_gem_shmem_object_vmap_locked, + .vunmap =3D drm_gem_shmem_object_vunmap_locked, + .mmap =3D drm_gem_shmem_object_mmap_unlocked, .vm_ops =3D &drm_gem_shmem_vm_ops, .evict =3D panfrost_shmem_evict, }; diff --git a/drivers/gpu/drm/panfrost/panfrost_mmu.c b/drivers/gpu/drm/panf= rost/panfrost_mmu.c index c0123d09f699..7771769f0ce0 100644 --- a/drivers/gpu/drm/panfrost/panfrost_mmu.c +++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c @@ -535,7 +535,7 @@ static int panfrost_mmu_map_fault_addr(struct panfrost_= device *pfdev, int as, err_map: sg_free_table(sgt); err_pages: - drm_gem_shmem_put_pages(&bo->base); + drm_gem_shmem_put_pages_locked(&bo->base); err_unlock: dma_resv_unlock(obj->resv); err_bo: diff --git a/drivers/gpu/drm/v3d/v3d_bo.c b/drivers/gpu/drm/v3d/v3d_bo.c index 8b3229a37c6d..ad83a3043d02 100644 --- a/drivers/gpu/drm/v3d/v3d_bo.c +++ b/drivers/gpu/drm/v3d/v3d_bo.c @@ -53,12 +53,12 @@ void v3d_free_object(struct drm_gem_object *obj) static const struct drm_gem_object_funcs v3d_gem_funcs =3D { .free =3D v3d_free_object, .print_info =3D drm_gem_shmem_object_print_info, - .pin =3D drm_gem_shmem_object_pin, - .unpin =3D drm_gem_shmem_object_unpin, + .pin =3D drm_gem_shmem_object_pin_unlocked, + .unpin =3D drm_gem_shmem_object_unpin_unlocked, .get_sg_table =3D drm_gem_shmem_object_get_sg_table, - .vmap =3D drm_gem_shmem_object_vmap, - .vunmap =3D drm_gem_shmem_object_vunmap, - .mmap =3D drm_gem_shmem_object_mmap, + .vmap =3D drm_gem_shmem_object_vmap_locked, + .vunmap =3D drm_gem_shmem_object_vunmap_locked, + .mmap =3D drm_gem_shmem_object_mmap_unlocked, .vm_ops =3D &drm_gem_shmem_vm_ops, }; =20 diff --git a/drivers/gpu/drm/virtio/virtgpu_gem.c b/drivers/gpu/drm/virtio/= virtgpu_gem.c index b9ceb0602fd5..aea15548ba9e 100644 --- a/drivers/gpu/drm/virtio/virtgpu_gem.c +++ b/drivers/gpu/drm/virtio/virtgpu_gem.c @@ -356,7 +356,7 @@ int virtio_gpu_gem_pin(struct virtio_gpu_object *bo) int ret =3D 0; =20 if (virtio_gpu_is_shmem(bo)) - ret =3D drm_gem_shmem_object_pin(&bo->base.base); + ret =3D drm_gem_shmem_object_pin_unlocked(&bo->base.base); =20 return ret; } @@ -364,5 +364,5 @@ int virtio_gpu_gem_pin(struct virtio_gpu_object *bo) void virtio_gpu_gem_unpin(struct virtio_gpu_object *bo) { if (virtio_gpu_is_shmem(bo)) - drm_gem_shmem_object_unpin(&bo->base.base); + drm_gem_shmem_object_unpin_unlocked(&bo->base.base); } diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virt= io/virtgpu_object.c index 70dcd19266dc..6cd64eac555f 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c @@ -139,9 +139,9 @@ static int virtio_gpu_shmem_evict(struct drm_gem_object= *obj) return err; } =20 - drm_gem_shmem_purge(&bo->base); + drm_gem_shmem_purge_locked(&bo->base); } else { - drm_gem_shmem_evict(&bo->base); + drm_gem_shmem_evict_locked(&bo->base); } =20 return 0; @@ -198,7 +198,7 @@ int virtio_gpu_reattach_shmem_object(struct virtio_gpu_= object *bo) unsigned int nents; int err; =20 - err =3D drm_gem_shmem_swapin(&bo->base); + err =3D drm_gem_shmem_swapin_locked(&bo->base); if (err) return err; =20 @@ -220,12 +220,12 @@ static const struct drm_gem_object_funcs virtio_gpu_s= hmem_funcs =3D { .close =3D virtio_gpu_gem_object_close, .print_info =3D drm_gem_shmem_object_print_info, .export =3D virtgpu_gem_prime_export, - .pin =3D drm_gem_shmem_object_pin, - .unpin =3D drm_gem_shmem_object_unpin, + .pin =3D drm_gem_shmem_object_pin_unlocked, + .unpin =3D drm_gem_shmem_object_unpin_unlocked, .get_sg_table =3D drm_gem_shmem_object_get_sg_table, - .vmap =3D drm_gem_shmem_object_vmap, - .vunmap =3D drm_gem_shmem_object_vunmap, - .mmap =3D drm_gem_shmem_object_mmap, + .vmap =3D drm_gem_shmem_object_vmap_locked, + .vunmap =3D drm_gem_shmem_object_vunmap_locked, + .mmap =3D drm_gem_shmem_object_mmap_unlocked, .vm_ops =3D &drm_gem_shmem_vm_ops, .evict =3D virtio_gpu_shmem_evict, }; diff --git a/include/drm/drm_gem_shmem_helper.h b/include/drm/drm_gem_shmem= _helper.h index 55f5ff387bbc..73cfca5853fd 100644 --- a/include/drm/drm_gem_shmem_helper.h +++ b/include/drm/drm_gem_shmem_helper.h @@ -109,16 +109,17 @@ struct drm_gem_shmem_object { struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, = size_t size); void drm_gem_shmem_free(struct drm_gem_shmem_object *shmem); =20 -void drm_gem_shmem_put_pages(struct drm_gem_shmem_object *shmem); -int drm_gem_shmem_pin(struct drm_gem_shmem_object *shmem); -void drm_gem_shmem_unpin(struct drm_gem_shmem_object *shmem); -int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, - struct iosys_map *map); -void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, - struct iosys_map *map); -int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_= struct *vma); - -int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv); +void drm_gem_shmem_put_pages_locked(struct drm_gem_shmem_object *shmem); +int drm_gem_shmem_vmap_locked(struct drm_gem_shmem_object *shmem, + struct iosys_map *map); +void drm_gem_shmem_vunmap_locked(struct drm_gem_shmem_object *shmem, + struct iosys_map *map); +int drm_gem_shmem_mmap_unlocked(struct drm_gem_shmem_object *shmem, + struct vm_area_struct *vma); +int drm_gem_shmem_pin_locked(struct drm_gem_shmem_object *shmem); +void drm_gem_shmem_unpin_locked(struct drm_gem_shmem_object *shmem); + +int drm_gem_shmem_madvise_locked(struct drm_gem_shmem_object *shmem, int m= adv); =20 static inline bool drm_gem_shmem_is_purgeable(struct drm_gem_shmem_object = *shmem) { @@ -130,10 +131,10 @@ static inline bool drm_gem_shmem_is_purgeable(struct = drm_gem_shmem_object *shmem (shmem->sgt || shmem->evicted); } =20 -int drm_gem_shmem_swapin(struct drm_gem_shmem_object *shmem); +int drm_gem_shmem_swapin_locked(struct drm_gem_shmem_object *shmem); =20 -void drm_gem_shmem_evict(struct drm_gem_shmem_object *shmem); -void drm_gem_shmem_purge(struct drm_gem_shmem_object *shmem); +void drm_gem_shmem_evict_locked(struct drm_gem_shmem_object *shmem); +void drm_gem_shmem_purge_locked(struct drm_gem_shmem_object *shmem); =20 struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_shmem_object *s= hmem); struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_shmem_object *= shmem); @@ -179,34 +180,6 @@ static inline void drm_gem_shmem_object_print_info(str= uct drm_printer *p, unsign drm_gem_shmem_print_info(shmem, p, indent); } =20 -/** - * drm_gem_shmem_object_pin - GEM object function for drm_gem_shmem_pin() - * @obj: GEM object - * - * This function wraps drm_gem_shmem_pin(). Drivers that employ the shmem = helpers should - * use it as their &drm_gem_object_funcs.pin handler. - */ -static inline int drm_gem_shmem_object_pin(struct drm_gem_object *obj) -{ - struct drm_gem_shmem_object *shmem =3D to_drm_gem_shmem_obj(obj); - - return drm_gem_shmem_pin(shmem); -} - -/** - * drm_gem_shmem_object_unpin - GEM object function for drm_gem_shmem_unpi= n() - * @obj: GEM object - * - * This function wraps drm_gem_shmem_unpin(). Drivers that employ the shme= m helpers should - * use it as their &drm_gem_object_funcs.unpin handler. - */ -static inline void drm_gem_shmem_object_unpin(struct drm_gem_object *obj) -{ - struct drm_gem_shmem_object *shmem =3D to_drm_gem_shmem_obj(obj); - - drm_gem_shmem_unpin(shmem); -} - /** * drm_gem_shmem_object_get_sg_table - GEM object function for drm_gem_shm= em_get_sg_table() * @obj: GEM object @@ -225,64 +198,102 @@ static inline struct sg_table *drm_gem_shmem_object_= get_sg_table(struct drm_gem_ } =20 /* - * drm_gem_shmem_object_vmap - GEM object function for drm_gem_shmem_vmap() + * drm_gem_shmem_object_vmap_locked - GEM object function for drm_gem_shme= m_vmap_locked() * @obj: GEM object * @map: Returns the kernel virtual address of the SHMEM GEM object's back= ing store. * - * This function wraps drm_gem_shmem_vmap(). Drivers that employ the shmem= helpers should - * use it as their &drm_gem_object_funcs.vmap handler. + * This function wraps drm_gem_shmem_vmap_locked(). Drivers that employ th= e shmem + * helpers should use it as their &drm_gem_object_funcs.vmap handler. * * Returns: * 0 on success or a negative error code on failure. */ -static inline int drm_gem_shmem_object_vmap(struct drm_gem_object *obj, - struct iosys_map *map) +static inline int drm_gem_shmem_object_vmap_locked(struct drm_gem_object *= obj, + struct iosys_map *map) { struct drm_gem_shmem_object *shmem =3D to_drm_gem_shmem_obj(obj); =20 - return drm_gem_shmem_vmap(shmem, map); + return drm_gem_shmem_vmap_locked(shmem, map); } =20 /* - * drm_gem_shmem_object_vunmap - GEM object function for drm_gem_shmem_vun= map() + * drm_gem_shmem_object_vunmap_locked - GEM object function for drm_gem_sh= mem_vunmap_locked() * @obj: GEM object * @map: Kernel virtual address where the SHMEM GEM object was mapped * - * This function wraps drm_gem_shmem_vunmap(). Drivers that employ the shm= em helpers should - * use it as their &drm_gem_object_funcs.vunmap handler. + * This function wraps drm_gem_shmem_vunmap_locked(). Drivers that employ = the shmem + * helpers should use it as their &drm_gem_object_funcs.vunmap handler. */ -static inline void drm_gem_shmem_object_vunmap(struct drm_gem_object *obj, - struct iosys_map *map) +static inline void drm_gem_shmem_object_vunmap_locked(struct drm_gem_objec= t *obj, + struct iosys_map *map) { struct drm_gem_shmem_object *shmem =3D to_drm_gem_shmem_obj(obj); =20 - drm_gem_shmem_vunmap(shmem, map); + drm_gem_shmem_vunmap_locked(shmem, map); } =20 /** - * drm_gem_shmem_object_mmap - GEM object function for drm_gem_shmem_mmap() + * drm_gem_shmem_object_mmap_unlocked - GEM object function for drm_gem_sh= mem_mmap_unlocked() * @obj: GEM object * @vma: VMA for the area to be mapped * - * This function wraps drm_gem_shmem_mmap(). Drivers that employ the shmem= helpers should - * use it as their &drm_gem_object_funcs.mmap handler. + * This function wraps drm_gem_shmem_mmap_unlocked(). Drivers that employ = the shmem + * helpers should use it as their &drm_gem_object_funcs.mmap handler. * * Returns: * 0 on success or a negative error code on failure. */ -static inline int drm_gem_shmem_object_mmap(struct drm_gem_object *obj, st= ruct vm_area_struct *vma) +static inline int drm_gem_shmem_object_mmap_unlocked(struct drm_gem_object= *obj, + struct vm_area_struct *vma) { struct drm_gem_shmem_object *shmem =3D to_drm_gem_shmem_obj(obj); =20 - return drm_gem_shmem_mmap(shmem, vma); + return drm_gem_shmem_mmap_unlocked(shmem, vma); +} + +/** + * drm_gem_shmem_object_pin_unlocked - unlocked GEM object function for dr= m_gem_shmem_pin_locked() + * @obj: GEM object + * + * This function wraps drm_gem_shmem_pin_locked(). Drivers that employ the= shmem + * helpers should use it as their &drm_gem_object_funcs.pin handler. + */ +static inline int drm_gem_shmem_object_pin_unlocked(struct drm_gem_object = *obj) +{ + struct drm_gem_shmem_object *shmem =3D to_drm_gem_shmem_obj(obj); + int ret; + + ret =3D dma_resv_lock_interruptible(obj->resv, NULL); + if (ret) + return ret; + ret =3D drm_gem_shmem_pin_locked(shmem); + dma_resv_unlock(obj->resv); + + return ret; +} + +/** + * drm_gem_shmem_object_unpin_unlocked - unlocked GEM object function for = drm_gem_shmem_unpin_locked() + * @obj: GEM object + * + * This function wraps drm_gem_shmem_unpin_locked(). Drivers that employ t= he shmem + * helpers should use it as their &drm_gem_object_funcs.unpin handler. + */ +static inline void drm_gem_shmem_object_unpin_unlocked(struct drm_gem_obje= ct *obj) +{ + struct drm_gem_shmem_object *shmem =3D to_drm_gem_shmem_obj(obj); + + dma_resv_lock(obj->resv, NULL); + drm_gem_shmem_unpin_locked(shmem); + dma_resv_unlock(obj->resv); } =20 /** - * drm_gem_shmem_object_madvise_unlocked - unlocked GEM object function fo= r drm_gem_shmem_madvise() + * drm_gem_shmem_object_madvise_unlocked - unlocked GEM object function fo= r drm_gem_shmem_madvise_locked() * @obj: GEM object * @madv: Madvise value * - * This function wraps drm_gem_shmem_madvise(), providing unlocked variant. + * This function wraps drm_gem_shmem_madvise_locked(), providing unlocked = variant. * * Returns: * 0 on success or a negative error code on failure. @@ -295,7 +306,7 @@ static inline int drm_gem_shmem_object_madvise_unlocked= (struct drm_gem_object *o ret =3D dma_resv_lock_interruptible(obj->resv, NULL); if (ret) return ret; - ret =3D drm_gem_shmem_madvise(shmem, madv); + ret =3D drm_gem_shmem_madvise_locked(shmem, madv); dma_resv_unlock(obj->resv); =20 return ret; --=20 2.41.0