If i915 does not want to use huge pages there is a) no point in setting up the private mount and b) should former fail, it is misleading to log THP support is disabled in the caller, which does not even know if callee tried to enable it. Fix both by restructuring the flow in i915_gemfs_init and at the same time note the failure to set it up in all cases. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Matthew Auld <matthew.auld@intel.com> Cc: Eero Tamminen <eero.t.tamminen@intel.com> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220429100414.647857-2-tvrtko.ursulin@linux.intel.com
60 lines
1.5 KiB
C
60 lines
1.5 KiB
C
/*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
* Copyright © 2017 Intel Corporation
|
|
*/
|
|
|
|
#include <linux/fs.h>
|
|
#include <linux/mount.h>
|
|
|
|
#include "i915_drv.h"
|
|
#include "i915_gemfs.h"
|
|
#include "i915_utils.h"
|
|
|
|
void i915_gemfs_init(struct drm_i915_private *i915)
|
|
{
|
|
char huge_opt[] = "huge=within_size"; /* r/w */
|
|
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.
|
|
*
|
|
* One example, although it is probably better with a per-file
|
|
* control, is selecting huge page allocations ("huge=within_size").
|
|
* However, we only do so on platforms which benefit from it, or to
|
|
* offset the overhead of iommu lookups, where with latter it is a net
|
|
* win even on platforms which would otherwise see some performance
|
|
* regressions such a slow reads issue on Broadwell and Skylake.
|
|
*/
|
|
|
|
if (GRAPHICS_VER(i915) < 11 && !i915_vtd_active(i915))
|
|
return;
|
|
|
|
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;
|
|
|
|
i915->mm.gemfs = gemfs;
|
|
drm_info(&i915->drm, "Using Transparent Hugepages\n");
|
|
return;
|
|
|
|
err:
|
|
drm_notice(&i915->drm,
|
|
"Transparent Hugepage support is recommended for optimal performance%s\n",
|
|
GRAPHICS_VER(i915) >= 11 ? " on this platform!" :
|
|
" when IOMMU is enabled!");
|
|
}
|
|
|
|
void i915_gemfs_fini(struct drm_i915_private *i915)
|
|
{
|
|
kern_unmount(i915->mm.gemfs);
|
|
}
|