Commit ede039b6 authored by Kefeng Wang's avatar Kefeng Wang Committed by Kaixiong Yu
Browse files

tmpfs: don't enable large folios if not supported

mainline inclusion
from mainline-v6.13-rc1
commit 5a90c155defa684f3a21f68c3f8e40c056e6114c
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IBET92

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5a90c155defa684f3a21f68c3f8e40c056e6114c

--------------------------------

tmpfs can support large folios, but there are some configurable options
(mount options and runtime deny/force) to enable/disable large folio
allocation, so there is a performance issue when performing writes without
large folios.  The issue is similar to commit 4e527d5841e2 ("iomap: fault
in smaller chunks for non-large folio mappings").

Since 'deny' is for emergencies and 'force' is for testing, performance
issues should not be a problem in real production environments, so don't
call mapping_set_large_folios() in __shmem_get_inode() when large folio is
disabled with mount huge=never option (default policy).

Link: https://lkml.kernel.org/r/20241017141742.1169404-1-wangkefeng.wang@huawei.com


Fixes: 9aac777aaf94 ("filemap: Convert generic_perform_write() to support large folios")
Signed-off-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Christian Brauner <brauner@kernel.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Matthew Wilcox <willy@infradead.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarKaixiong Yu <yukaixiong@huawei.com>
parent d0c3b76f
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -2805,6 +2805,9 @@ static struct inode *__shmem_get_inode(struct mnt_idmap *idmap,
	cache_no_acl(inode);
	if (sbinfo->noswap)
		mapping_set_unevictable(inode->i_mapping);

	/* Don't consider 'deny' for emergencies and 'force' for testing */
	if (sbinfo->huge)
		mapping_set_large_folios(inode->i_mapping);

	switch (mode & S_IFMT) {