mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-04 17:05:12 -04:00
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>
This commit is contained in:
committed by
Boris Brezillon
parent
a8a9a59022
commit
f19f99bbaf
@@ -13,8 +13,7 @@ v3d-y := \
|
||||
v3d_trace_points.o \
|
||||
v3d_sched.o \
|
||||
v3d_sysfs.o \
|
||||
v3d_submit.o \
|
||||
v3d_gemfs.o
|
||||
v3d_submit.o
|
||||
|
||||
v3d-$(CONFIG_DEBUG_FS) += v3d_debugfs.o
|
||||
|
||||
|
||||
@@ -114,7 +114,7 @@ v3d_bo_create_finish(struct drm_gem_object *obj)
|
||||
if (IS_ERR(sgt))
|
||||
return PTR_ERR(sgt);
|
||||
|
||||
if (!v3d->gemfs)
|
||||
if (!drm_gem_get_huge_mnt(obj->dev))
|
||||
align = SZ_4K;
|
||||
else if (obj->size >= SZ_1M)
|
||||
align = SZ_1M;
|
||||
@@ -150,12 +150,11 @@ struct v3d_bo *v3d_bo_create(struct drm_device *dev, struct drm_file *file_priv,
|
||||
size_t unaligned_size)
|
||||
{
|
||||
struct drm_gem_shmem_object *shmem_obj;
|
||||
struct v3d_dev *v3d = to_v3d_dev(dev);
|
||||
struct v3d_bo *bo;
|
||||
int ret;
|
||||
|
||||
shmem_obj = drm_gem_shmem_create_with_mnt(dev, unaligned_size,
|
||||
v3d->gemfs);
|
||||
drm_gem_get_huge_mnt(dev));
|
||||
if (IS_ERR(shmem_obj))
|
||||
return ERR_CAST(shmem_obj);
|
||||
bo = to_v3d_bo(&shmem_obj->base);
|
||||
|
||||
@@ -107,7 +107,7 @@ static int v3d_get_param_ioctl(struct drm_device *dev, void *data,
|
||||
args->value = v3d->perfmon_info.max_counters;
|
||||
return 0;
|
||||
case DRM_V3D_PARAM_SUPPORTS_SUPER_PAGES:
|
||||
args->value = !!v3d->gemfs;
|
||||
args->value = !!drm_gem_get_huge_mnt(dev);
|
||||
return 0;
|
||||
case DRM_V3D_PARAM_GLOBAL_RESET_COUNTER:
|
||||
mutex_lock(&v3d->reset_lock);
|
||||
|
||||
@@ -158,11 +158,6 @@ struct v3d_dev {
|
||||
struct drm_mm mm;
|
||||
spinlock_t mm_lock;
|
||||
|
||||
/*
|
||||
* tmpfs instance used for shmem backed objects
|
||||
*/
|
||||
struct vfsmount *gemfs;
|
||||
|
||||
struct work_struct overflow_mem_work;
|
||||
|
||||
struct v3d_queue_state queue[V3D_MAX_QUEUES];
|
||||
@@ -569,6 +564,7 @@ extern const struct dma_fence_ops v3d_fence_ops;
|
||||
struct dma_fence *v3d_fence_create(struct v3d_dev *v3d, enum v3d_queue q);
|
||||
|
||||
/* v3d_gem.c */
|
||||
extern bool super_pages;
|
||||
int v3d_gem_init(struct drm_device *dev);
|
||||
void v3d_gem_destroy(struct drm_device *dev);
|
||||
void v3d_reset_sms(struct v3d_dev *v3d);
|
||||
@@ -576,11 +572,6 @@ void v3d_reset(struct v3d_dev *v3d);
|
||||
void v3d_invalidate_caches(struct v3d_dev *v3d);
|
||||
void v3d_clean_caches(struct v3d_dev *v3d);
|
||||
|
||||
/* v3d_gemfs.c */
|
||||
extern bool super_pages;
|
||||
void v3d_gemfs_init(struct v3d_dev *v3d);
|
||||
void v3d_gemfs_fini(struct v3d_dev *v3d);
|
||||
|
||||
/* v3d_submit.c */
|
||||
void v3d_job_cleanup(struct v3d_job *job);
|
||||
void v3d_job_put(struct v3d_job *job);
|
||||
|
||||
@@ -259,6 +259,24 @@ v3d_invalidate_caches(struct v3d_dev *v3d)
|
||||
v3d_invalidate_slices(v3d, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
v3d_huge_mnt_init(struct v3d_dev *v3d)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && super_pages)
|
||||
err = drm_gem_huge_mnt_create(&v3d->drm, "within_size");
|
||||
|
||||
if (drm_gem_get_huge_mnt(&v3d->drm))
|
||||
drm_info(&v3d->drm, "Using Transparent Hugepages\n");
|
||||
else if (err)
|
||||
drm_warn(&v3d->drm, "Can't use Transparent Hugepages (%d)\n",
|
||||
err);
|
||||
else
|
||||
drm_notice(&v3d->drm,
|
||||
"Transparent Hugepage support is recommended for optimal performance on this platform!\n");
|
||||
}
|
||||
|
||||
int
|
||||
v3d_gem_init(struct drm_device *dev)
|
||||
{
|
||||
@@ -310,7 +328,7 @@ v3d_gem_init(struct drm_device *dev)
|
||||
v3d_init_hw_state(v3d);
|
||||
v3d_mmu_set_page_table(v3d);
|
||||
|
||||
v3d_gemfs_init(v3d);
|
||||
v3d_huge_mnt_init(v3d);
|
||||
|
||||
ret = v3d_sched_init(v3d);
|
||||
if (ret) {
|
||||
@@ -330,7 +348,6 @@ v3d_gem_destroy(struct drm_device *dev)
|
||||
enum v3d_queue q;
|
||||
|
||||
v3d_sched_fini(v3d);
|
||||
v3d_gemfs_fini(v3d);
|
||||
|
||||
/* Waiting for jobs to finish would need to be done before
|
||||
* unregistering V3D.
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/* Copyright (C) 2024 Raspberry Pi */
|
||||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/fs_context.h>
|
||||
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
#include "v3d_drv.h"
|
||||
|
||||
void v3d_gemfs_init(struct v3d_dev *v3d)
|
||||
{
|
||||
struct file_system_type *type;
|
||||
struct fs_context *fc;
|
||||
struct vfsmount *gemfs;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* By creating our own shmemfs mountpoint, we can pass in
|
||||
* mount flags that better match our usecase. However, we
|
||||
* only do so on platforms which benefit from it.
|
||||
*/
|
||||
if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE))
|
||||
goto err;
|
||||
|
||||
/* The user doesn't want to enable Super Pages */
|
||||
if (!super_pages)
|
||||
goto err;
|
||||
|
||||
type = get_fs_type("tmpfs");
|
||||
if (!type)
|
||||
goto err;
|
||||
|
||||
fc = fs_context_for_mount(type, SB_KERNMOUNT);
|
||||
if (IS_ERR(fc))
|
||||
goto err;
|
||||
ret = vfs_parse_fs_string(fc, "source", "tmpfs");
|
||||
if (!ret)
|
||||
ret = vfs_parse_fs_string(fc, "huge", "within_size");
|
||||
if (!ret)
|
||||
gemfs = fc_mount_longterm(fc);
|
||||
put_fs_context(fc);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
v3d->gemfs = gemfs;
|
||||
drm_info(&v3d->drm, "Using Transparent Hugepages\n");
|
||||
|
||||
return;
|
||||
|
||||
err:
|
||||
v3d->gemfs = NULL;
|
||||
drm_notice(&v3d->drm,
|
||||
"Transparent Hugepage support is recommended for optimal performance on this platform!\n");
|
||||
}
|
||||
|
||||
void v3d_gemfs_fini(struct v3d_dev *v3d)
|
||||
{
|
||||
if (v3d->gemfs)
|
||||
kern_unmount(v3d->gemfs);
|
||||
}
|
||||
Reference in New Issue
Block a user