Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/v3d: Use huge tmpfs mountpoint helpers

Make use of the new drm_gem_huge_mnt_create() and
drm_gem_get_huge_mnt() helpers to avoid code duplication. Now that
it's just a few lines long, the single function in v3d_gemfs.c is
moved into v3d_gem.c.

v3:
- use huge tmpfs mountpoint in drm_device
- move v3d_gemfs.c into v3d_gem.c

v4:
- clean up mountpoint creation error handling

v5:
- fix CONFIG_TRANSPARENT_HUGEPAGE check
- use drm_gem_has_huge_mnt() helper

v8:
- don't access huge_mnt field with CONFIG_TRANSPARENT_HUGEPAGE=n

v9:
- replace drm_gem_has_huge_mnt() by drm_gem_get_huge_mnt()

v10:
- get rid of CONFIG_TRANSPARENT_HUGEPAGE ifdefs

v11:
- remove superfluous comment
- add Maíra and Boris R-bs

Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
Reviewed-by: Maíra Canal <mcanal@igalia.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Link: https://patch.msgid.link/20251205182231.194072-7-loic.molinari@collabora.com
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>

authored by

Loïc Molinari and committed by
Boris Brezillon
f19f99bb a8a9a590

+24 -80
+1 -2
drivers/gpu/drm/v3d/Makefile
··· 13 13 v3d_trace_points.o \ 14 14 v3d_sched.o \ 15 15 v3d_sysfs.o \ 16 - v3d_submit.o \ 17 - v3d_gemfs.o 16 + v3d_submit.o 18 17 19 18 v3d-$(CONFIG_DEBUG_FS) += v3d_debugfs.o 20 19
+2 -3
drivers/gpu/drm/v3d/v3d_bo.c
··· 114 114 if (IS_ERR(sgt)) 115 115 return PTR_ERR(sgt); 116 116 117 - if (!v3d->gemfs) 117 + if (!drm_gem_get_huge_mnt(obj->dev)) 118 118 align = SZ_4K; 119 119 else if (obj->size >= SZ_1M) 120 120 align = SZ_1M; ··· 150 150 size_t unaligned_size) 151 151 { 152 152 struct drm_gem_shmem_object *shmem_obj; 153 - struct v3d_dev *v3d = to_v3d_dev(dev); 154 153 struct v3d_bo *bo; 155 154 int ret; 156 155 157 156 shmem_obj = drm_gem_shmem_create_with_mnt(dev, unaligned_size, 158 - v3d->gemfs); 157 + drm_gem_get_huge_mnt(dev)); 159 158 if (IS_ERR(shmem_obj)) 160 159 return ERR_CAST(shmem_obj); 161 160 bo = to_v3d_bo(&shmem_obj->base);
+1 -1
drivers/gpu/drm/v3d/v3d_drv.c
··· 107 107 args->value = v3d->perfmon_info.max_counters; 108 108 return 0; 109 109 case DRM_V3D_PARAM_SUPPORTS_SUPER_PAGES: 110 - args->value = !!v3d->gemfs; 110 + args->value = !!drm_gem_get_huge_mnt(dev); 111 111 return 0; 112 112 case DRM_V3D_PARAM_GLOBAL_RESET_COUNTER: 113 113 mutex_lock(&v3d->reset_lock);
+1 -10
drivers/gpu/drm/v3d/v3d_drv.h
··· 158 158 struct drm_mm mm; 159 159 spinlock_t mm_lock; 160 160 161 - /* 162 - * tmpfs instance used for shmem backed objects 163 - */ 164 - struct vfsmount *gemfs; 165 - 166 161 struct work_struct overflow_mem_work; 167 162 168 163 struct v3d_queue_state queue[V3D_MAX_QUEUES]; ··· 564 569 struct dma_fence *v3d_fence_create(struct v3d_dev *v3d, enum v3d_queue q); 565 570 566 571 /* v3d_gem.c */ 572 + extern bool super_pages; 567 573 int v3d_gem_init(struct drm_device *dev); 568 574 void v3d_gem_destroy(struct drm_device *dev); 569 575 void v3d_reset_sms(struct v3d_dev *v3d); 570 576 void v3d_reset(struct v3d_dev *v3d); 571 577 void v3d_invalidate_caches(struct v3d_dev *v3d); 572 578 void v3d_clean_caches(struct v3d_dev *v3d); 573 - 574 - /* v3d_gemfs.c */ 575 - extern bool super_pages; 576 - void v3d_gemfs_init(struct v3d_dev *v3d); 577 - void v3d_gemfs_fini(struct v3d_dev *v3d); 578 579 579 580 /* v3d_submit.c */ 580 581 void v3d_job_cleanup(struct v3d_job *job);
+19 -2
drivers/gpu/drm/v3d/v3d_gem.c
··· 259 259 v3d_invalidate_slices(v3d, 0); 260 260 } 261 261 262 + static void 263 + v3d_huge_mnt_init(struct v3d_dev *v3d) 264 + { 265 + int err = 0; 266 + 267 + if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && super_pages) 268 + err = drm_gem_huge_mnt_create(&v3d->drm, "within_size"); 269 + 270 + if (drm_gem_get_huge_mnt(&v3d->drm)) 271 + drm_info(&v3d->drm, "Using Transparent Hugepages\n"); 272 + else if (err) 273 + drm_warn(&v3d->drm, "Can't use Transparent Hugepages (%d)\n", 274 + err); 275 + else 276 + drm_notice(&v3d->drm, 277 + "Transparent Hugepage support is recommended for optimal performance on this platform!\n"); 278 + } 279 + 262 280 int 263 281 v3d_gem_init(struct drm_device *dev) 264 282 { ··· 328 310 v3d_init_hw_state(v3d); 329 311 v3d_mmu_set_page_table(v3d); 330 312 331 - v3d_gemfs_init(v3d); 313 + v3d_huge_mnt_init(v3d); 332 314 333 315 ret = v3d_sched_init(v3d); 334 316 if (ret) { ··· 348 330 enum v3d_queue q; 349 331 350 332 v3d_sched_fini(v3d); 351 - v3d_gemfs_fini(v3d); 352 333 353 334 /* Waiting for jobs to finish would need to be done before 354 335 * unregistering V3D.
-62
drivers/gpu/drm/v3d/v3d_gemfs.c
··· 1 - // SPDX-License-Identifier: GPL-2.0+ 2 - /* Copyright (C) 2024 Raspberry Pi */ 3 - 4 - #include <linux/fs.h> 5 - #include <linux/mount.h> 6 - #include <linux/fs_context.h> 7 - 8 - #include <drm/drm_print.h> 9 - 10 - #include "v3d_drv.h" 11 - 12 - void v3d_gemfs_init(struct v3d_dev *v3d) 13 - { 14 - struct file_system_type *type; 15 - struct fs_context *fc; 16 - struct vfsmount *gemfs; 17 - int ret; 18 - 19 - /* 20 - * By creating our own shmemfs mountpoint, we can pass in 21 - * mount flags that better match our usecase. However, we 22 - * only do so on platforms which benefit from it. 23 - */ 24 - if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) 25 - goto err; 26 - 27 - /* The user doesn't want to enable Super Pages */ 28 - if (!super_pages) 29 - goto err; 30 - 31 - type = get_fs_type("tmpfs"); 32 - if (!type) 33 - goto err; 34 - 35 - fc = fs_context_for_mount(type, SB_KERNMOUNT); 36 - if (IS_ERR(fc)) 37 - goto err; 38 - ret = vfs_parse_fs_string(fc, "source", "tmpfs"); 39 - if (!ret) 40 - ret = vfs_parse_fs_string(fc, "huge", "within_size"); 41 - if (!ret) 42 - gemfs = fc_mount_longterm(fc); 43 - put_fs_context(fc); 44 - if (ret) 45 - goto err; 46 - 47 - v3d->gemfs = gemfs; 48 - drm_info(&v3d->drm, "Using Transparent Hugepages\n"); 49 - 50 - return; 51 - 52 - err: 53 - v3d->gemfs = NULL; 54 - drm_notice(&v3d->drm, 55 - "Transparent Hugepage support is recommended for optimal performance on this platform!\n"); 56 - } 57 - 58 - void v3d_gemfs_fini(struct v3d_dev *v3d) 59 - { 60 - if (v3d->gemfs) 61 - kern_unmount(v3d->gemfs); 62 - }