mm-shmem-add-mthp-size-alignment-in-shmem_get_unmapped_area.patch removed from -mm tree
The quilt patch titled
Subject: mm: shmem: add mTHP size alignment in shmem_get_unmapped_area
has been removed from the -mm tree. Its filename was
mm-shmem-add-mthp-size-alignment-in-shmem_get_unmapped_area.patch
This patch was dropped because it was merged into the mm-stable branch of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
------------------------------------------------------
From: Baolin Wang <[email protected]>
Subject: mm: shmem: add mTHP size alignment in shmem_get_unmapped_area
Date: Tue, 11 Jun 2024 18:11:09 +0800
Although the top-level hugepage allocation can be turned off, anonymous shmem can still use mTHP by configuring the sysfs interface located at '/sys/kernel/mm/transparent_hugepage/hugepage-XXkb/shmem_enabled'. Therefore, add alignment for mTHP size to provide a suitable alignment address in shmem_get_unmapped_area().
---
mm/shmem.c | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-)
mm/shmem.c renamed from mm/shmem.c~mm-shmem-add-mthp-size-alignment-in-shmem_get_unmapped_area +31 -9
@@ -2393,6 +2393,7 @@ unsigned long shmem_get_unmapped_area(stunsigned long inflated_len;unsigned long inflated_addr;unsigned long inflated_offset; +unsigned long hpage_size;if (len >TASK_SIZE )return -ENOMEM ;
@@ -2411,8 +2412,6 @@ unsigned long shmem_get_unmapped_area(stif (shmem_huge ==SHMEM_HUGE_DENY )return addr; -if (len <HPAGE_PMD_SIZE ) -return addr;if (flags &MAP_FIXED )return addr;/*
@@ -2424,8 +2423,11 @@ unsigned long shmem_get_unmapped_area(stif (uaddr == addr)return addr; + hpage_size =HPAGE_PMD_SIZE ;if (shmem_huge !=SHMEM_HUGE_FORCE ) {struct super_block *sb; +unsigned long __maybe_unused hpage_orders; +int order =0 ;if (file) {VM_BUG_ON (file->f_op != &shmem_file_operations);
@@ -2438,18 +2440,38 @@ unsigned long shmem_get_unmapped_area(stif (IS_ERR (shm_mnt))return addr; sb = shm_mnt->mnt_sb; + +/* +* Find the highest mTHP order used for anonymous shmem to +* provide a suitable alignment address. +*/ +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + hpage_orders =READ_ONCE (huge_shmem_orders_always); + hpage_orders |=READ_ONCE (huge_shmem_orders_within_size); + hpage_orders |=READ_ONCE (huge_shmem_orders_madvise); +if (SHMEM_SB (sb)->huge !=SHMEM_HUGE_NEVER ) + hpage_orders |=READ_ONCE (huge_shmem_orders_inherit); + +if (hpage_orders >0 ) { + order =highest_order (hpage_orders); + hpage_size =PAGE_SIZE << order; + } +#endif } -if (SHMEM_SB (sb)->huge ==SHMEM_HUGE_NEVER ) +if (SHMEM_SB (sb)->huge ==SHMEM_HUGE_NEVER && !order)return addr; } - offset = (pgoff <<PAGE_SHIFT ) & (HPAGE_PMD_SIZE -1 ); -if (offset && offset + len <2 *HPAGE_PMD_SIZE ) +if (len < hpage_size) +return addr; + + offset = (pgoff <<PAGE_SHIFT ) & (hpage_size -1 ); +if (offset && offset + len <2 * hpage_size)return addr; -if ((addr & (HPAGE_PMD_SIZE -1 )) == offset) +if ((addr & (hpage_size -1 )) == offset)return addr; - inflated_len = len +HPAGE_PMD_SIZE -PAGE_SIZE ; + inflated_len = len + hpage_size -PAGE_SIZE ;if (inflated_len >TASK_SIZE )return addr;if (inflated_len < len)
@@ -2462,10 +2484,10 @@ unsigned long shmem_get_unmapped_area(stif (inflated_addr & ~PAGE_MASK )return addr; - inflated_offset = inflated_addr & (HPAGE_PMD_SIZE -1 ); + inflated_offset = inflated_addr & (hpage_size -1 ); inflated_addr += offset - inflated_offset;if (inflated_offset > offset) - inflated_addr +=HPAGE_PMD_SIZE ; + inflated_addr += hpage_size;if (inflated_addr >TASK_SIZE - len)return addr;
_
Patches currently in -mm which might be from [email protected] are