mirror of
https://github.com/torvalds/linux.git
synced 2026-09-14 16:10:02 +02:00
mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders()
Move shmem_huge_global_enabled() into shmem_allowable_huge_orders(), so that shmem_allowable_huge_orders() can also help to find the allowable huge orders for tmpfs. Moreover the shmem_huge_global_enabled() can become static. While we are at it, passing the vma instead of mm for shmem_huge_global_enabled() makes code cleaner. No functional changes. Link: https://lkml.kernel.org/r/8e825146bb29ee1a1c7bd64d2968ff3e19be7815.1721626645.git.baolin.wang@linux.alibaba.com Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com> Reviewed-by: Ryan Roberts <ryan.roberts@arm.com> Acked-by: David Hildenbrand <david@redhat.com> Cc: Barry Song <21cnbao@gmail.com> Cc: Hugh Dickins <hughd@google.com> Cc: Lance Yang <ioworker0@gmail.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Zi Yan <ziy@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
d58a2a581f
commit
6beeab870e
|
|
@ -111,21 +111,13 @@ extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end);
|
||||||
int shmem_unuse(unsigned int type);
|
int shmem_unuse(unsigned int type);
|
||||||
|
|
||||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||||
extern bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index, bool shmem_huge_force,
|
|
||||||
struct mm_struct *mm, unsigned long vm_flags);
|
|
||||||
unsigned long shmem_allowable_huge_orders(struct inode *inode,
|
unsigned long shmem_allowable_huge_orders(struct inode *inode,
|
||||||
struct vm_area_struct *vma, pgoff_t index,
|
struct vm_area_struct *vma, pgoff_t index,
|
||||||
bool global_huge);
|
bool shmem_huge_force);
|
||||||
#else
|
#else
|
||||||
static __always_inline bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
|
|
||||||
bool shmem_huge_force, struct mm_struct *mm,
|
|
||||||
unsigned long vm_flags)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
static inline unsigned long shmem_allowable_huge_orders(struct inode *inode,
|
static inline unsigned long shmem_allowable_huge_orders(struct inode *inode,
|
||||||
struct vm_area_struct *vma, pgoff_t index,
|
struct vm_area_struct *vma, pgoff_t index,
|
||||||
bool global_huge)
|
bool shmem_huge_force)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -159,16 +159,10 @@ unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma,
|
||||||
* Must be done before hugepage flags check since shmem has its
|
* Must be done before hugepage flags check since shmem has its
|
||||||
* own flags.
|
* own flags.
|
||||||
*/
|
*/
|
||||||
if (!in_pf && shmem_file(vma->vm_file)) {
|
if (!in_pf && shmem_file(vma->vm_file))
|
||||||
bool global_huge = shmem_huge_global_enabled(file_inode(vma->vm_file),
|
|
||||||
vma->vm_pgoff, !enforce_sysfs,
|
|
||||||
vma->vm_mm, vm_flags);
|
|
||||||
|
|
||||||
if (!vma_is_anon_shmem(vma))
|
|
||||||
return global_huge ? orders : 0;
|
|
||||||
return shmem_allowable_huge_orders(file_inode(vma->vm_file),
|
return shmem_allowable_huge_orders(file_inode(vma->vm_file),
|
||||||
vma, vma->vm_pgoff, global_huge);
|
vma, vma->vm_pgoff,
|
||||||
}
|
!enforce_sysfs);
|
||||||
|
|
||||||
if (!vma_is_anonymous(vma)) {
|
if (!vma_is_anonymous(vma)) {
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
47
mm/shmem.c
47
mm/shmem.c
|
|
@ -549,9 +549,10 @@ static bool shmem_confirm_swap(struct address_space *mapping,
|
||||||
static int shmem_huge __read_mostly = SHMEM_HUGE_NEVER;
|
static int shmem_huge __read_mostly = SHMEM_HUGE_NEVER;
|
||||||
|
|
||||||
static bool __shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
|
static bool __shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
|
||||||
bool shmem_huge_force, struct mm_struct *mm,
|
bool shmem_huge_force, struct vm_area_struct *vma,
|
||||||
unsigned long vm_flags)
|
unsigned long vm_flags)
|
||||||
{
|
{
|
||||||
|
struct mm_struct *mm = vma ? vma->vm_mm : NULL;
|
||||||
loff_t i_size;
|
loff_t i_size;
|
||||||
|
|
||||||
if (!S_ISREG(inode->i_mode))
|
if (!S_ISREG(inode->i_mode))
|
||||||
|
|
@ -581,15 +582,15 @@ static bool __shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
|
static bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
|
||||||
bool shmem_huge_force, struct mm_struct *mm,
|
bool shmem_huge_force, struct vm_area_struct *vma,
|
||||||
unsigned long vm_flags)
|
unsigned long vm_flags)
|
||||||
{
|
{
|
||||||
if (HPAGE_PMD_ORDER > MAX_PAGECACHE_ORDER)
|
if (HPAGE_PMD_ORDER > MAX_PAGECACHE_ORDER)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return __shmem_huge_global_enabled(inode, index, shmem_huge_force,
|
return __shmem_huge_global_enabled(inode, index, shmem_huge_force,
|
||||||
mm, vm_flags);
|
vma, vm_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_SYSFS)
|
#if defined(CONFIG_SYSFS)
|
||||||
|
|
@ -772,6 +773,13 @@ static unsigned long shmem_unused_huge_shrink(struct shmem_sb_info *sbinfo,
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
|
||||||
|
bool shmem_huge_force, struct vm_area_struct *vma,
|
||||||
|
unsigned long vm_flags)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1625,22 +1633,33 @@ static gfp_t limit_gfp_mask(gfp_t huge_gfp, gfp_t limit_gfp)
|
||||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||||
unsigned long shmem_allowable_huge_orders(struct inode *inode,
|
unsigned long shmem_allowable_huge_orders(struct inode *inode,
|
||||||
struct vm_area_struct *vma, pgoff_t index,
|
struct vm_area_struct *vma, pgoff_t index,
|
||||||
bool global_huge)
|
bool shmem_huge_force)
|
||||||
{
|
{
|
||||||
unsigned long mask = READ_ONCE(huge_shmem_orders_always);
|
unsigned long mask = READ_ONCE(huge_shmem_orders_always);
|
||||||
unsigned long within_size_orders = READ_ONCE(huge_shmem_orders_within_size);
|
unsigned long within_size_orders = READ_ONCE(huge_shmem_orders_within_size);
|
||||||
unsigned long vm_flags = vma->vm_flags;
|
unsigned long vm_flags = vma ? vma->vm_flags : 0;
|
||||||
|
bool global_huge;
|
||||||
loff_t i_size;
|
loff_t i_size;
|
||||||
int order;
|
int order;
|
||||||
|
|
||||||
if ((vm_flags & VM_NOHUGEPAGE) ||
|
if (vma && ((vm_flags & VM_NOHUGEPAGE) ||
|
||||||
test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags))
|
test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* If the hardware/firmware marked hugepage support disabled. */
|
/* If the hardware/firmware marked hugepage support disabled. */
|
||||||
if (transparent_hugepage_flags & (1 << TRANSPARENT_HUGEPAGE_UNSUPPORTED))
|
if (transparent_hugepage_flags & (1 << TRANSPARENT_HUGEPAGE_UNSUPPORTED))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
global_huge = shmem_huge_global_enabled(inode, index, shmem_huge_force,
|
||||||
|
vma, vm_flags);
|
||||||
|
if (!vma || !vma_is_anon_shmem(vma)) {
|
||||||
|
/*
|
||||||
|
* For tmpfs, we now only support PMD sized THP if huge page
|
||||||
|
* is enabled, otherwise fallback to order 0.
|
||||||
|
*/
|
||||||
|
return global_huge ? BIT(HPAGE_PMD_ORDER) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Following the 'deny' semantics of the top level, force the huge
|
* Following the 'deny' semantics of the top level, force the huge
|
||||||
* option off from all mounts.
|
* option off from all mounts.
|
||||||
|
|
@ -2077,7 +2096,7 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index,
|
||||||
struct mm_struct *fault_mm;
|
struct mm_struct *fault_mm;
|
||||||
struct folio *folio;
|
struct folio *folio;
|
||||||
int error;
|
int error;
|
||||||
bool alloced, huge;
|
bool alloced;
|
||||||
unsigned long orders = 0;
|
unsigned long orders = 0;
|
||||||
|
|
||||||
if (WARN_ON_ONCE(!shmem_mapping(inode->i_mapping)))
|
if (WARN_ON_ONCE(!shmem_mapping(inode->i_mapping)))
|
||||||
|
|
@ -2150,14 +2169,8 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
huge = shmem_huge_global_enabled(inode, index, false, fault_mm,
|
/* Find hugepage orders that are allowed for anonymous shmem and tmpfs. */
|
||||||
vma ? vma->vm_flags : 0);
|
orders = shmem_allowable_huge_orders(inode, vma, index, false);
|
||||||
/* Find hugepage orders that are allowed for anonymous shmem. */
|
|
||||||
if (vma && vma_is_anon_shmem(vma))
|
|
||||||
orders = shmem_allowable_huge_orders(inode, vma, index, huge);
|
|
||||||
else if (huge)
|
|
||||||
orders = BIT(HPAGE_PMD_ORDER);
|
|
||||||
|
|
||||||
if (orders > 0) {
|
if (orders > 0) {
|
||||||
gfp_t huge_gfp;
|
gfp_t huge_gfp;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user