Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm/filemap: Add NUMA mempolicy support to filemap_alloc_folio()

Add a mempolicy parameter to filemap_alloc_folio() to enable NUMA-aware
page cache allocations. This will be used by upcoming changes to
support NUMA policies in guest-memfd, where guest_memory need to be
allocated NUMA policy specified by VMM.

All existing users pass NULL maintaining current behavior.

Reviewed-by: Pankaj Gupta <pankaj.gupta@amd.com>
Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Shivank Garg <shivankg@amd.com>
Tested-by: Ashish Kalra <ashish.kalra@amd.com>
Link: https://lore.kernel.org/r/20250827175247.83322-4-shivankg@amd.com
Signed-off-by: Sean Christopherson <seanjc@google.com>

authored by

Matthew Wilcox and committed by
Sean Christopherson
7f3779a3 211ddde0

+20 -14
+2 -2
fs/btrfs/compression.c
··· 491 491 continue; 492 492 } 493 493 494 - folio = filemap_alloc_folio(mapping_gfp_constraint(mapping, 495 - ~__GFP_FS), 0); 494 + folio = filemap_alloc_folio(mapping_gfp_constraint(mapping, ~__GFP_FS), 495 + 0, NULL); 496 496 if (!folio) 497 497 break; 498 498
+1 -1
fs/btrfs/verity.c
··· 742 742 } 743 743 744 744 folio = filemap_alloc_folio(mapping_gfp_constraint(inode->i_mapping, ~__GFP_FS), 745 - 0); 745 + 0, NULL); 746 746 if (!folio) 747 747 return ERR_PTR(-ENOMEM); 748 748
+1 -1
fs/erofs/zdata.c
··· 562 562 * Allocate a managed folio for cached I/O, or it may be 563 563 * then filled with a file-backed folio for in-place I/O 564 564 */ 565 - newfolio = filemap_alloc_folio(gfp, 0); 565 + newfolio = filemap_alloc_folio(gfp, 0, NULL); 566 566 if (!newfolio) 567 567 continue; 568 568 newfolio->private = Z_EROFS_PREALLOCATED_FOLIO;
+1 -1
fs/f2fs/compress.c
··· 1947 1947 return; 1948 1948 } 1949 1949 1950 - cfolio = filemap_alloc_folio(__GFP_NOWARN | __GFP_IO, 0); 1950 + cfolio = filemap_alloc_folio(__GFP_NOWARN | __GFP_IO, 0, NULL); 1951 1951 if (!cfolio) 1952 1952 return; 1953 1953
+5 -3
include/linux/pagemap.h
··· 654 654 } 655 655 656 656 #ifdef CONFIG_NUMA 657 - struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order); 657 + struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order, 658 + struct mempolicy *policy); 658 659 #else 659 - static inline struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order) 660 + static inline struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order, 661 + struct mempolicy *policy) 660 662 { 661 663 return folio_alloc_noprof(gfp, order); 662 664 } ··· 669 667 670 668 static inline struct page *__page_cache_alloc(gfp_t gfp) 671 669 { 672 - return &filemap_alloc_folio(gfp, 0)->page; 670 + return &filemap_alloc_folio(gfp, 0, NULL)->page; 673 671 } 674 672 675 673 static inline gfp_t readahead_gfp_mask(struct address_space *x)
+9 -5
mm/filemap.c
··· 1002 1002 EXPORT_SYMBOL_GPL(filemap_add_folio); 1003 1003 1004 1004 #ifdef CONFIG_NUMA 1005 - struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order) 1005 + struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order, 1006 + struct mempolicy *policy) 1006 1007 { 1007 1008 int n; 1008 1009 struct folio *folio; 1010 + 1011 + if (policy) 1012 + return folio_alloc_mpol_noprof(gfp, order, policy, 1013 + NO_INTERLEAVE_INDEX, numa_node_id()); 1009 1014 1010 1015 if (cpuset_do_page_mem_spread()) { 1011 1016 unsigned int cpuset_mems_cookie; ··· 2014 2009 err = -ENOMEM; 2015 2010 if (order > min_order) 2016 2011 alloc_gfp |= __GFP_NORETRY | __GFP_NOWARN; 2017 - folio = filemap_alloc_folio(alloc_gfp, order); 2012 + folio = filemap_alloc_folio(alloc_gfp, order, NULL); 2018 2013 if (!folio) 2019 2014 continue; 2020 2015 ··· 2556 2551 if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_WAITQ)) 2557 2552 return -EAGAIN; 2558 2553 2559 - folio = filemap_alloc_folio(mapping_gfp_mask(mapping), min_order); 2554 + folio = filemap_alloc_folio(mapping_gfp_mask(mapping), min_order, NULL); 2560 2555 if (!folio) 2561 2556 return -ENOMEM; 2562 2557 if (iocb->ki_flags & IOCB_DONTCACHE) ··· 3988 3983 repeat: 3989 3984 folio = filemap_get_folio(mapping, index); 3990 3985 if (IS_ERR(folio)) { 3991 - folio = filemap_alloc_folio(gfp, 3992 - mapping_min_folio_order(mapping)); 3986 + folio = filemap_alloc_folio(gfp, mapping_min_folio_order(mapping), NULL); 3993 3987 if (!folio) 3994 3988 return ERR_PTR(-ENOMEM); 3995 3989 index = mapping_align_index(mapping, index);
+1 -1
mm/readahead.c
··· 186 186 { 187 187 struct folio *folio; 188 188 189 - folio = filemap_alloc_folio(gfp_mask, order); 189 + folio = filemap_alloc_folio(gfp_mask, order, NULL); 190 190 if (folio && ractl->dropbehind) 191 191 __folio_set_dropbehind(folio); 192 192