Hi Maira,

On 11/03/2024 10:05, Maíra Canal wrote:
For some applications, such as using huge pages, we might want to have a
different mountpoint, for which we pass in mount flags that better match
our usecase.

Therefore, add a new parameter to drm_gem_object_init() that allow us to
define the tmpfs mountpoint where the GEM object will be created. If
this parameter is NULL, then we fallback to shmem_file_setup().

One strategy for reducing churn, and so the number of drivers this patch touches, could be to add a lower level drm_gem_object_init() (which takes vfsmount, call it __drm_gem_object_init(), or drm__gem_object_init_mnt(), and make drm_gem_object_init() call that one with a NULL argument.

Regards,

Tvrtko


Cc: Russell King <li...@armlinux.org.uk>
Cc: Lucas Stach <l.st...@pengutronix.de>
Cc: Christian Gmeiner <christian.gmei...@gmail.com>
Cc: Inki Dae <inki....@samsung.com>
Cc: Seung-Woo Kim <sw0312....@samsung.com>
Cc: Kyungmin Park <kyungmin.p...@samsung.com>
Cc: Krzysztof Kozlowski <krzysztof.kozlow...@linaro.org>
Cc: Alim Akhtar <alim.akh...@samsung.com>
Cc: Patrik Jakobsson <patrik.r.jakobs...@gmail.com>
Cc: Sui Jingfeng <suijingf...@loongson.cn>
Cc: Chun-Kuang Hu <chunkuang...@kernel.org>
Cc: Philipp Zabel <p.za...@pengutronix.de>
Cc: Matthias Brugger <matthias....@gmail.com>
Cc: AngeloGioacchino Del Regno <angelogioacchino.delre...@collabora.com>
Cc: Rob Clark <robdcl...@gmail.com>
Cc: Abhinav Kumar <quic_abhin...@quicinc.com>
Cc: Dmitry Baryshkov <dmitry.barysh...@linaro.org>
Cc: Sean Paul <s...@poorly.run>
Cc: Marijn Suijten <marijn.suij...@somainline.org>
Cc: Karol Herbst <kher...@redhat.com>
Cc: Lyude Paul <ly...@redhat.com>
Cc: Danilo Krummrich <d...@redhat.com>
Cc: Tomi Valkeinen <tomi.valkei...@ideasonboard.com>
Cc: Gerd Hoffmann <kra...@redhat.com>
Cc: Sandy Huang <h...@rock-chips.com>
Cc: "Heiko Stübner" <he...@sntech.de>
Cc: Andy Yan <andy....@rock-chips.com>
Cc: Thierry Reding <thierry.red...@gmail.com>
Cc: Mikko Perttunen <mperttu...@nvidia.com>
Cc: Jonathan Hunter <jonath...@nvidia.com>
Cc: Christian König <christian.koe...@amd.com>
Cc: Huang Rui <ray.hu...@amd.com>
Cc: Oleksandr Andrushchenko <oleksandr_andrushche...@epam.com>
Cc: Karolina Stolarek <karolina.stola...@intel.com>
Cc: Andi Shyti <andi.sh...@linux.intel.com>
Signed-off-by: Maíra Canal <mca...@igalia.com>
---
  drivers/gpu/drm/armada/armada_gem.c           |  2 +-
  drivers/gpu/drm/drm_gem.c                     | 12 ++++++++++--
  drivers/gpu/drm/drm_gem_dma_helper.c          |  2 +-
  drivers/gpu/drm/drm_gem_shmem_helper.c        |  2 +-
  drivers/gpu/drm/drm_gem_vram_helper.c         |  2 +-
  drivers/gpu/drm/etnaviv/etnaviv_gem.c         |  2 +-
  drivers/gpu/drm/exynos/exynos_drm_gem.c       |  2 +-
  drivers/gpu/drm/gma500/gem.c                  |  2 +-
  drivers/gpu/drm/loongson/lsdc_ttm.c           |  2 +-
  drivers/gpu/drm/mediatek/mtk_drm_gem.c        |  2 +-
  drivers/gpu/drm/msm/msm_gem.c                 |  2 +-
  drivers/gpu/drm/nouveau/nouveau_gem.c         |  2 +-
  drivers/gpu/drm/nouveau/nouveau_prime.c       |  2 +-
  drivers/gpu/drm/omapdrm/omap_gem.c            |  2 +-
  drivers/gpu/drm/qxl/qxl_object.c              |  2 +-
  drivers/gpu/drm/rockchip/rockchip_drm_gem.c   |  2 +-
  drivers/gpu/drm/tegra/gem.c                   |  2 +-
  drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.c |  2 +-
  drivers/gpu/drm/xen/xen_drm_front_gem.c       |  2 +-
  include/drm/drm_gem.h                         |  3 ++-
  20 files changed, 30 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/armada/armada_gem.c 
b/drivers/gpu/drm/armada/armada_gem.c
index 26d10065d534..36a25e667341 100644
--- a/drivers/gpu/drm/armada/armada_gem.c
+++ b/drivers/gpu/drm/armada/armada_gem.c
@@ -226,7 +226,7 @@ static struct armada_gem_object 
*armada_gem_alloc_object(struct drm_device *dev,

        obj->obj.funcs = &armada_gem_object_funcs;

-       if (drm_gem_object_init(dev, &obj->obj, size)) {
+       if (drm_gem_object_init(dev, &obj->obj, size, NULL)) {
                kfree(obj);
                return NULL;
        }
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 44a948b80ee1..ddd8777fcda5 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -118,18 +118,26 @@ drm_gem_init(struct drm_device *dev)
   * @dev: drm_device the object should be initialized for
   * @obj: drm_gem_object to initialize
   * @size: object size
+ * @gemfs: tmpfs mount where the GEM object will be created. If NULL, use
+ * the usual tmpfs mountpoint (`shm_mnt`).
   *
   * Initialize an already allocated GEM object of the specified size with
   * shmfs backing store.
   */
  int drm_gem_object_init(struct drm_device *dev,
-                       struct drm_gem_object *obj, size_t size)
+                       struct drm_gem_object *obj, size_t size,
+                       struct vfsmount *gemfs)
  {
        struct file *filp;

        drm_gem_private_object_init(dev, obj, size);

-       filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
+       if (gemfs)
+               filp = shmem_file_setup_with_mnt(gemfs, "drm mm object", size,
+                                                VM_NORESERVE);
+       else
+               filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
+
        if (IS_ERR(filp))
                return PTR_ERR(filp);

diff --git a/drivers/gpu/drm/drm_gem_dma_helper.c 
b/drivers/gpu/drm/drm_gem_dma_helper.c
index 870b90b78bc4..9ada5ac85dd6 100644
--- a/drivers/gpu/drm/drm_gem_dma_helper.c
+++ b/drivers/gpu/drm/drm_gem_dma_helper.c
@@ -95,7 +95,7 @@ __drm_gem_dma_create(struct drm_device *drm, size_t size, 
bool private)
                /* Always use writecombine for dma-buf mappings */
                dma_obj->map_noncoherent = false;
        } else {
-               ret = drm_gem_object_init(drm, gem_obj, size);
+               ret = drm_gem_object_init(drm, gem_obj, size, NULL);
        }
        if (ret)
                goto error;
diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c 
b/drivers/gpu/drm/drm_gem_shmem_helper.c
index e435f986cd13..15635b330ca8 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -77,7 +77,7 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, 
bool private)
                drm_gem_private_object_init(dev, obj, size);
                shmem->map_wc = false; /* dma-buf mappings use always 
writecombine */
        } else {
-               ret = drm_gem_object_init(dev, obj, size);
+               ret = drm_gem_object_init(dev, obj, size, NULL);
        }
        if (ret) {
                drm_gem_private_object_fini(obj);
diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c 
b/drivers/gpu/drm/drm_gem_vram_helper.c
index 75f2eaf0d5b6..90649899dbef 100644
--- a/drivers/gpu/drm/drm_gem_vram_helper.c
+++ b/drivers/gpu/drm/drm_gem_vram_helper.c
@@ -210,7 +210,7 @@ struct drm_gem_vram_object *drm_gem_vram_create(struct 
drm_device *dev,
        if (!gem->funcs)
                gem->funcs = &drm_gem_vram_object_funcs;

-       ret = drm_gem_object_init(dev, gem, size);
+       ret = drm_gem_object_init(dev, gem, size, NULL);
        if (ret) {
                kfree(gbo);
                return ERR_PTR(ret);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c 
b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index 71a6d2b1c80f..aa4b61c48b7f 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -596,7 +596,7 @@ int etnaviv_gem_new_handle(struct drm_device *dev, struct 
drm_file *file,

        lockdep_set_class(&to_etnaviv_bo(obj)->lock, &etnaviv_shm_lock_class);

-       ret = drm_gem_object_init(dev, obj, size);
+       ret = drm_gem_object_init(dev, obj, size, NULL);
        if (ret)
                goto fail;

diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c 
b/drivers/gpu/drm/exynos/exynos_drm_gem.c
index 638ca96830e9..c50c0d12246e 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gem.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c
@@ -160,7 +160,7 @@ static struct exynos_drm_gem *exynos_drm_gem_init(struct 
drm_device *dev,

        obj->funcs = &exynos_drm_gem_object_funcs;

-       ret = drm_gem_object_init(dev, obj, size);
+       ret = drm_gem_object_init(dev, obj, size, NULL);
        if (ret < 0) {
                DRM_DEV_ERROR(dev->dev, "failed to initialize gem object\n");
                kfree(exynos_gem);
diff --git a/drivers/gpu/drm/gma500/gem.c b/drivers/gpu/drm/gma500/gem.c
index 4b7627a72637..315e085dc9ee 100644
--- a/drivers/gpu/drm/gma500/gem.c
+++ b/drivers/gpu/drm/gma500/gem.c
@@ -169,7 +169,7 @@ psb_gem_create(struct drm_device *dev, u64 size, const char 
*name, bool stolen,
        if (stolen) {
                drm_gem_private_object_init(dev, obj, size);
        } else {
-               ret = drm_gem_object_init(dev, obj, size);
+               ret = drm_gem_object_init(dev, obj, size, NULL);
                if (ret)
                        goto err_release_resource;

diff --git a/drivers/gpu/drm/loongson/lsdc_ttm.c 
b/drivers/gpu/drm/loongson/lsdc_ttm.c
index 465f622ac05d..d392ea66d72e 100644
--- a/drivers/gpu/drm/loongson/lsdc_ttm.c
+++ b/drivers/gpu/drm/loongson/lsdc_ttm.c
@@ -458,7 +458,7 @@ struct lsdc_bo *lsdc_bo_create(struct drm_device *ddev,

        size = ALIGN(size, PAGE_SIZE);

-       ret = drm_gem_object_init(ddev, &tbo->base, size);
+       ret = drm_gem_object_init(ddev, &tbo->base, size, NULL);
        if (ret) {
                kfree(lbo);
                return ERR_PTR(ret);
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_gem.c 
b/drivers/gpu/drm/mediatek/mtk_drm_gem.c
index 4f2e3feabc0f..261d386921dc 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_gem.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_gem.c
@@ -44,7 +44,7 @@ static struct mtk_drm_gem_obj *mtk_drm_gem_init(struct 
drm_device *dev,

        mtk_gem_obj->base.funcs = &mtk_drm_gem_object_funcs;

-       ret = drm_gem_object_init(dev, &mtk_gem_obj->base, size);
+       ret = drm_gem_object_init(dev, &mtk_gem_obj->base, size, NULL);
        if (ret < 0) {
                DRM_ERROR("failed to initialize gem object\n");
                kfree(mtk_gem_obj);
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index 175ee4ab8a6f..6fe17cf28ef6 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -1222,7 +1222,7 @@ struct drm_gem_object *msm_gem_new(struct drm_device 
*dev, uint32_t size, uint32

                vma->iova = physaddr(obj);
        } else {
-               ret = drm_gem_object_init(dev, obj, size);
+               ret = drm_gem_object_init(dev, obj, size, NULL);
                if (ret)
                        goto fail;
                /*
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c 
b/drivers/gpu/drm/nouveau/nouveau_gem.c
index 49c2bcbef129..434325fa8752 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -262,7 +262,7 @@ nouveau_gem_new(struct nouveau_cli *cli, u64 size, int 
align, uint32_t domain,

        /* Initialize the embedded gem-object. We return a single gem-reference
         * to the caller, instead of a normal nouveau_bo ttm reference. */
-       ret = drm_gem_object_init(drm->dev, &nvbo->bo.base, size);
+       ret = drm_gem_object_init(drm->dev, &nvbo->bo.base, size, NULL);
        if (ret) {
                drm_gem_object_release(&nvbo->bo.base);
                kfree(nvbo);
diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c 
b/drivers/gpu/drm/nouveau/nouveau_prime.c
index 1b2ff0c40fc1..c9b3572df555 100644
--- a/drivers/gpu/drm/nouveau/nouveau_prime.c
+++ b/drivers/gpu/drm/nouveau/nouveau_prime.c
@@ -62,7 +62,7 @@ struct drm_gem_object 
*nouveau_gem_prime_import_sg_table(struct drm_device *dev,

        /* Initialize the embedded gem-object. We return a single gem-reference
         * to the caller, instead of a normal nouveau_bo ttm reference. */
-       ret = drm_gem_object_init(dev, &nvbo->bo.base, size);
+       ret = drm_gem_object_init(dev, &nvbo->bo.base, size, NULL);
        if (ret) {
                nouveau_bo_ref(NULL, &nvbo);
                obj = ERR_PTR(-ENOMEM);
diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c 
b/drivers/gpu/drm/omapdrm/omap_gem.c
index 3421e8389222..53b4ec64c7b0 100644
--- a/drivers/gpu/drm/omapdrm/omap_gem.c
+++ b/drivers/gpu/drm/omapdrm/omap_gem.c
@@ -1352,7 +1352,7 @@ struct drm_gem_object *omap_gem_new(struct drm_device 
*dev,
        if (!(flags & OMAP_BO_MEM_SHMEM)) {
                drm_gem_private_object_init(dev, obj, size);
        } else {
-               ret = drm_gem_object_init(dev, obj, size);
+               ret = drm_gem_object_init(dev, obj, size, NULL);
                if (ret)
                        goto err_free;

diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c
index 1e46b0a6e478..45d7abe26ebd 100644
--- a/drivers/gpu/drm/qxl/qxl_object.c
+++ b/drivers/gpu/drm/qxl/qxl_object.c
@@ -123,7 +123,7 @@ int qxl_bo_create(struct qxl_device *qdev, unsigned long 
size,
        if (bo == NULL)
                return -ENOMEM;
        size = roundup(size, PAGE_SIZE);
-       r = drm_gem_object_init(&qdev->ddev, &bo->tbo.base, size);
+       r = drm_gem_object_init(&qdev->ddev, &bo->tbo.base, size, NULL);
        if (unlikely(r)) {
                kfree(bo);
                return r;
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c 
b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index 93ed841f5dce..daba285bd78f 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -295,7 +295,7 @@ static struct rockchip_gem_object *

        obj->funcs = &rockchip_gem_object_funcs;

-       drm_gem_object_init(drm, obj, size);
+       drm_gem_object_init(drm, obj, size, NULL);

        return rk_obj;
  }
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c
index b4eb030ea961..63f10d5a57ba 100644
--- a/drivers/gpu/drm/tegra/gem.c
+++ b/drivers/gpu/drm/tegra/gem.c
@@ -311,7 +311,7 @@ static struct tegra_bo *tegra_bo_alloc_object(struct 
drm_device *drm,
        host1x_bo_init(&bo->base, &tegra_bo_ops);
        size = round_up(size, PAGE_SIZE);

-       err = drm_gem_object_init(drm, &bo->gem, size);
+       err = drm_gem_object_init(drm, &bo->gem, size, NULL);
        if (err < 0)
                goto free;

diff --git a/drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.c 
b/drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.c
index 7b7c1fa805fc..a9bf7d5a887c 100644
--- a/drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.c
+++ b/drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.c
@@ -61,7 +61,7 @@ struct ttm_buffer_object *ttm_bo_kunit_init(struct kunit 
*test,
        KUNIT_ASSERT_NOT_NULL(test, bo);

        bo->base = gem_obj;
-       err = drm_gem_object_init(devs->drm, &bo->base, size);
+       err = drm_gem_object_init(devs->drm, &bo->base, size, NULL);
        KUNIT_ASSERT_EQ(test, err, 0);

        bo->bdev = devs->ttm_dev;
diff --git a/drivers/gpu/drm/xen/xen_drm_front_gem.c 
b/drivers/gpu/drm/xen/xen_drm_front_gem.c
index 3ad2b4cfd1f0..1b36c958340b 100644
--- a/drivers/gpu/drm/xen/xen_drm_front_gem.c
+++ b/drivers/gpu/drm/xen/xen_drm_front_gem.c
@@ -122,7 +122,7 @@ static struct xen_gem_object *gem_create_obj(struct 
drm_device *dev,

        xen_obj->base.funcs = &xen_drm_front_gem_object_funcs;

-       ret = drm_gem_object_init(dev, &xen_obj->base, size);
+       ret = drm_gem_object_init(dev, &xen_obj->base, size, NULL);
        if (ret < 0) {
                kfree(xen_obj);
                return ERR_PTR(ret);
diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
index 2ebec3984cd4..c75611ae8f93 100644
--- a/include/drm/drm_gem.h
+++ b/include/drm/drm_gem.h
@@ -471,7 +471,8 @@ struct drm_gem_object {
  void drm_gem_object_release(struct drm_gem_object *obj);
  void drm_gem_object_free(struct kref *kref);
  int drm_gem_object_init(struct drm_device *dev,
-                       struct drm_gem_object *obj, size_t size);
+                       struct drm_gem_object *obj, size_t size,
+                       struct vfsmount *gemfs);
  void drm_gem_private_object_init(struct drm_device *dev,
                                 struct drm_gem_object *obj, size_t size);
  void drm_gem_private_object_fini(struct drm_gem_object *obj);
--
2.43.0


Reply via email to