Message ID | 20240625090646.1194644-2-gshan@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm/filemap: Limit page cache size to that supported by xarray | expand |
On 25.06.24 11:06, Gavin Shan wrote: > The largest page cache order can be HPAGE_PMD_ORDER (13) on ARM64 > with 64KB base page size. The xarray entry with this order can't > be split as the following error messages indicate. > > ------------[ cut here ]------------ > WARNING: CPU: 35 PID: 7484 at lib/xarray.c:1025 xas_split_alloc+0xf8/0x128 > Modules linked in: nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib \ > nft_reject_inet nf_reject_ipv4 nf_reject_ipv6 nft_reject nft_ct \ > nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 \ > ip_set rfkill nf_tables nfnetlink vfat fat virtio_balloon drm \ > fuse xfs libcrc32c crct10dif_ce ghash_ce sha2_ce sha256_arm64 \ > sha1_ce virtio_net net_failover virtio_console virtio_blk failover \ > dimlib virtio_mmio > CPU: 35 PID: 7484 Comm: test Kdump: loaded Tainted: G W 6.10.0-rc5-gavin+ #9 > Hardware name: QEMU KVM Virtual Machine, BIOS edk2-20240524-1.el9 05/24/2024 > pstate: 83400005 (Nzcv daif +PAN -UAO +TCO +DIT -SSBS BTYPE=--) > pc : xas_split_alloc+0xf8/0x128 > lr : split_huge_page_to_list_to_order+0x1c4/0x720 > sp : ffff800087a4f6c0 > x29: ffff800087a4f6c0 x28: ffff800087a4f720 x27: 000000001fffffff > x26: 0000000000000c40 x25: 000000000000000d x24: ffff00010625b858 > x23: ffff800087a4f720 x22: ffffffdfc0780000 x21: 0000000000000000 > x20: 0000000000000000 x19: ffffffdfc0780000 x18: 000000001ff40000 > x17: 00000000ffffffff x16: 0000018000000000 x15: 51ec004000000000 > x14: 0000e00000000000 x13: 0000000000002000 x12: 0000000000000020 > x11: 51ec000000000000 x10: 51ece1c0ffff8000 x9 : ffffbeb961a44d28 > x8 : 0000000000000003 x7 : ffffffdfc0456420 x6 : ffff0000e1aa6eb8 > x5 : 20bf08b4fe778fca x4 : ffffffdfc0456420 x3 : 0000000000000c40 > x2 : 000000000000000d x1 : 000000000000000c x0 : 0000000000000000 > Call trace: > xas_split_alloc+0xf8/0x128 > split_huge_page_to_list_to_order+0x1c4/0x720 > truncate_inode_partial_folio+0xdc/0x160 > truncate_inode_pages_range+0x1b4/0x4a8 > truncate_pagecache_range+0x84/0xa0 > xfs_flush_unmap_range+0x70/0x90 [xfs] > xfs_file_fallocate+0xfc/0x4d8 [xfs] > vfs_fallocate+0x124/0x2e8 > ksys_fallocate+0x4c/0xa0 > __arm64_sys_fallocate+0x24/0x38 > invoke_syscall.constprop.0+0x7c/0xd8 > do_el0_svc+0xb4/0xd0 > el0_svc+0x44/0x1d8 > el0t_64_sync_handler+0x134/0x150 > el0t_64_sync+0x17c/0x180 > > Fix it by decreasing MAX_PAGECACHE_ORDER to the largest supported order > by xarray. For this specific case, MAX_PAGECACHE_ORDER is dropped from > 13 to 11 when CONFIG_BASE_SMALL is disabled. > > Fixes: 4f6617011910 ("filemap: Allow __filemap_get_folio to allocate large folios") > Cc: stable@kernel.org # v6.6+ > Suggested-by: David Hildenbrand <david@redhat.com> > Signed-off-by: Gavin Shan <gshan@redhat.com> > --- > include/linux/pagemap.h | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h > index 59f1df0cde5a..a0a026d2d244 100644 > --- a/include/linux/pagemap.h > +++ b/include/linux/pagemap.h > @@ -354,11 +354,18 @@ static inline void mapping_set_gfp_mask(struct address_space *m, gfp_t mask) > * a good order (that's 1MB if you're using 4kB pages) > */ > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > -#define MAX_PAGECACHE_ORDER HPAGE_PMD_ORDER > +#define PREFERRED_MAX_PAGECACHE_ORDER HPAGE_PMD_ORDER > #else > -#define MAX_PAGECACHE_ORDER 8 > +#define PREFERRED_MAX_PAGECACHE_ORDER 8 > #endif > > +/* > + * xas_split_alloc() does not support arbitrary orders. This implies no > + * 512MB THP on ARM64 with 64KB base page size. > + */ > +#define MAX_XAS_ORDER (XA_CHUNK_SHIFT * 2 - 1) > +#define MAX_PAGECACHE_ORDER min(MAX_XAS_ORDER, PREFERRED_MAX_PAGECACHE_ORDER) > + > /** > * mapping_set_large_folios() - Indicate the file supports large folios. > * @mapping: The file. Thanks! Acked-by: David Hildenbrand <david@redhat.com>
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 59f1df0cde5a..a0a026d2d244 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -354,11 +354,18 @@ static inline void mapping_set_gfp_mask(struct address_space *m, gfp_t mask) * a good order (that's 1MB if you're using 4kB pages) */ #ifdef CONFIG_TRANSPARENT_HUGEPAGE -#define MAX_PAGECACHE_ORDER HPAGE_PMD_ORDER +#define PREFERRED_MAX_PAGECACHE_ORDER HPAGE_PMD_ORDER #else -#define MAX_PAGECACHE_ORDER 8 +#define PREFERRED_MAX_PAGECACHE_ORDER 8 #endif +/* + * xas_split_alloc() does not support arbitrary orders. This implies no + * 512MB THP on ARM64 with 64KB base page size. + */ +#define MAX_XAS_ORDER (XA_CHUNK_SHIFT * 2 - 1) +#define MAX_PAGECACHE_ORDER min(MAX_XAS_ORDER, PREFERRED_MAX_PAGECACHE_ORDER) + /** * mapping_set_large_folios() - Indicate the file supports large folios. * @mapping: The file.
The largest page cache order can be HPAGE_PMD_ORDER (13) on ARM64 with 64KB base page size. The xarray entry with this order can't be split as the following error messages indicate. ------------[ cut here ]------------ WARNING: CPU: 35 PID: 7484 at lib/xarray.c:1025 xas_split_alloc+0xf8/0x128 Modules linked in: nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib \ nft_reject_inet nf_reject_ipv4 nf_reject_ipv6 nft_reject nft_ct \ nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 \ ip_set rfkill nf_tables nfnetlink vfat fat virtio_balloon drm \ fuse xfs libcrc32c crct10dif_ce ghash_ce sha2_ce sha256_arm64 \ sha1_ce virtio_net net_failover virtio_console virtio_blk failover \ dimlib virtio_mmio CPU: 35 PID: 7484 Comm: test Kdump: loaded Tainted: G W 6.10.0-rc5-gavin+ #9 Hardware name: QEMU KVM Virtual Machine, BIOS edk2-20240524-1.el9 05/24/2024 pstate: 83400005 (Nzcv daif +PAN -UAO +TCO +DIT -SSBS BTYPE=--) pc : xas_split_alloc+0xf8/0x128 lr : split_huge_page_to_list_to_order+0x1c4/0x720 sp : ffff800087a4f6c0 x29: ffff800087a4f6c0 x28: ffff800087a4f720 x27: 000000001fffffff x26: 0000000000000c40 x25: 000000000000000d x24: ffff00010625b858 x23: ffff800087a4f720 x22: ffffffdfc0780000 x21: 0000000000000000 x20: 0000000000000000 x19: ffffffdfc0780000 x18: 000000001ff40000 x17: 00000000ffffffff x16: 0000018000000000 x15: 51ec004000000000 x14: 0000e00000000000 x13: 0000000000002000 x12: 0000000000000020 x11: 51ec000000000000 x10: 51ece1c0ffff8000 x9 : ffffbeb961a44d28 x8 : 0000000000000003 x7 : ffffffdfc0456420 x6 : ffff0000e1aa6eb8 x5 : 20bf08b4fe778fca x4 : ffffffdfc0456420 x3 : 0000000000000c40 x2 : 000000000000000d x1 : 000000000000000c x0 : 0000000000000000 Call trace: xas_split_alloc+0xf8/0x128 split_huge_page_to_list_to_order+0x1c4/0x720 truncate_inode_partial_folio+0xdc/0x160 truncate_inode_pages_range+0x1b4/0x4a8 truncate_pagecache_range+0x84/0xa0 xfs_flush_unmap_range+0x70/0x90 [xfs] xfs_file_fallocate+0xfc/0x4d8 [xfs] vfs_fallocate+0x124/0x2e8 ksys_fallocate+0x4c/0xa0 __arm64_sys_fallocate+0x24/0x38 invoke_syscall.constprop.0+0x7c/0xd8 do_el0_svc+0xb4/0xd0 el0_svc+0x44/0x1d8 el0t_64_sync_handler+0x134/0x150 el0t_64_sync+0x17c/0x180 Fix it by decreasing MAX_PAGECACHE_ORDER to the largest supported order by xarray. For this specific case, MAX_PAGECACHE_ORDER is dropped from 13 to 11 when CONFIG_BASE_SMALL is disabled. Fixes: 4f6617011910 ("filemap: Allow __filemap_get_folio to allocate large folios") Cc: stable@kernel.org # v6.6+ Suggested-by: David Hildenbrand <david@redhat.com> Signed-off-by: Gavin Shan <gshan@redhat.com> --- include/linux/pagemap.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)