| // 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; |
| |
| /* The user doesn't want to enable Super Pages */ |
| if (!super_pages) |
| 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); |
| } |