mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
drm/v3d: Introduce gemfs
Create a separate "tmpfs" kernel mount for V3D. This will allow us to move away from the shmemfs `shm_mnt` and gives the flexibility to do things like set our own mount options. Here, the interest is to use "huge=", which should allow us to enable the use of THP for our shmem-backed objects. Signed-off-by: Maíra Canal <mcanal@igalia.com> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240923141348.2422499-6-mcanal@igalia.com
This commit is contained in:
parent
0992b2541e
commit
eb8d395f68
4 changed files with 60 additions and 1 deletions
|
|
@ -13,7 +13,8 @@ v3d-y := \
|
|||
v3d_trace_points.o \
|
||||
v3d_sched.o \
|
||||
v3d_sysfs.o \
|
||||
v3d_submit.o
|
||||
v3d_submit.o \
|
||||
v3d_gemfs.o
|
||||
|
||||
v3d-$(CONFIG_DEBUG_FS) += v3d_debugfs.o
|
||||
|
||||
|
|
|
|||
|
|
@ -137,6 +137,11 @@ 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_bin_job *bin_job;
|
||||
|
|
@ -534,6 +539,10 @@ 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 */
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -288,6 +288,8 @@ v3d_gem_init(struct drm_device *dev)
|
|||
v3d_init_hw_state(v3d);
|
||||
v3d_mmu_set_page_table(v3d);
|
||||
|
||||
v3d_gemfs_init(v3d);
|
||||
|
||||
ret = v3d_sched_init(v3d);
|
||||
if (ret) {
|
||||
drm_mm_takedown(&v3d->mm);
|
||||
|
|
@ -305,6 +307,7 @@ v3d_gem_destroy(struct drm_device *dev)
|
|||
struct v3d_dev *v3d = to_v3d_dev(dev);
|
||||
|
||||
v3d_sched_fini(v3d);
|
||||
v3d_gemfs_fini(v3d);
|
||||
|
||||
/* Waiting for jobs to finish would need to be done before
|
||||
* unregistering V3D.
|
||||
|
|
|
|||
46
drivers/gpu/drm/v3d/v3d_gemfs.c
Normal file
46
drivers/gpu/drm/v3d/v3d_gemfs.c
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/* Copyright (C) 2024 Raspberry Pi */
|
||||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/mount.h>
|
||||
|
||||
#include "v3d_drv.h"
|
||||
|
||||
void v3d_gemfs_init(struct v3d_dev *v3d)
|
||||
{
|
||||
char huge_opt[] = "huge=within_size";
|
||||
struct file_system_type *type;
|
||||
struct vfsmount *gemfs;
|
||||
|
||||
/*
|
||||
* 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;
|
||||
|
||||
type = get_fs_type("tmpfs");
|
||||
if (!type)
|
||||
goto err;
|
||||
|
||||
gemfs = vfs_kern_mount(type, SB_KERNMOUNT, type->name, huge_opt);
|
||||
if (IS_ERR(gemfs))
|
||||
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);
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue