Skip to content

Commit 2368317

Browse files
committed
Merge tag 'kvm-x86-gmem-6.19' of https://github.com/kvm-x86/linux into HEAD
KVM guest_memfd changes for 6.19: - Add NUMA mempolicy support for guest_memfd, and clean up a variety of rough edges in guest_memfd along the way. - Define a CLASS to automatically handle get+put when grabbing a guest_memfd from a memslot to make it harder to leak references. - Enhance KVM selftests to make it easer to develop and debug selftests like those added for guest_memfd NUMA support, e.g. where test and/or KVM bugs often result in hard-to-debug SIGBUS errors. - Misc cleanups.
2 parents 9aca52b + 83e0e12 commit 2368317

File tree

21 files changed

+645
-253
lines changed

21 files changed

+645
-253
lines changed

fs/btrfs/compression.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,8 +491,8 @@ static noinline int add_ra_bio_pages(struct inode *inode,
491491
continue;
492492
}
493493

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);
496496
if (!folio)
497497
break;
498498

fs/btrfs/verity.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -742,7 +742,7 @@ static struct page *btrfs_read_merkle_tree_page(struct inode *inode,
742742
}
743743

744744
folio = filemap_alloc_folio(mapping_gfp_constraint(inode->i_mapping, ~__GFP_FS),
745-
0);
745+
0, NULL);
746746
if (!folio)
747747
return ERR_PTR(-ENOMEM);
748748

fs/erofs/zdata.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ static void z_erofs_bind_cache(struct z_erofs_frontend *fe)
562562
* Allocate a managed folio for cached I/O, or it may be
563563
* then filled with a file-backed folio for in-place I/O
564564
*/
565-
newfolio = filemap_alloc_folio(gfp, 0);
565+
newfolio = filemap_alloc_folio(gfp, 0, NULL);
566566
if (!newfolio)
567567
continue;
568568
newfolio->private = Z_EROFS_PREALLOCATED_FOLIO;

fs/f2fs/compress.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1947,7 +1947,7 @@ static void f2fs_cache_compressed_page(struct f2fs_sb_info *sbi,
19471947
return;
19481948
}
19491949

1950-
cfolio = filemap_alloc_folio(__GFP_NOWARN | __GFP_IO, 0);
1950+
cfolio = filemap_alloc_folio(__GFP_NOWARN | __GFP_IO, 0, NULL);
19511951
if (!cfolio)
19521952
return;
19531953

include/linux/pagemap.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -654,9 +654,11 @@ static inline void *detach_page_private(struct page *page)
654654
}
655655

656656
#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);
658659
#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)
660662
{
661663
return folio_alloc_noprof(gfp, order);
662664
}
@@ -667,7 +669,7 @@ static inline struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int o
667669

668670
static inline struct page *__page_cache_alloc(gfp_t gfp)
669671
{
670-
return &filemap_alloc_folio(gfp, 0)->page;
672+
return &filemap_alloc_folio(gfp, 0, NULL)->page;
671673
}
672674

673675
static inline gfp_t readahead_gfp_mask(struct address_space *x)
@@ -753,11 +755,17 @@ static inline fgf_t fgf_set_order(size_t size)
753755
}
754756

755757
void *filemap_get_entry(struct address_space *mapping, pgoff_t index);
756-
struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t index,
757-
fgf_t fgp_flags, gfp_t gfp);
758+
struct folio *__filemap_get_folio_mpol(struct address_space *mapping,
759+
pgoff_t index, fgf_t fgf_flags, gfp_t gfp, struct mempolicy *policy);
758760
struct page *pagecache_get_page(struct address_space *mapping, pgoff_t index,
759761
fgf_t fgp_flags, gfp_t gfp);
760762

763+
static inline struct folio *__filemap_get_folio(struct address_space *mapping,
764+
pgoff_t index, fgf_t fgf_flags, gfp_t gfp)
765+
{
766+
return __filemap_get_folio_mpol(mapping, index, fgf_flags, gfp, NULL);
767+
}
768+
761769
/**
762770
* write_begin_get_folio - Get folio for write_begin with flags.
763771
* @iocb: The kiocb passed from write_begin (may be NULL).

include/uapi/linux/magic.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,6 @@
103103
#define DEVMEM_MAGIC 0x454d444d /* "DMEM" */
104104
#define SECRETMEM_MAGIC 0x5345434d /* "SECM" */
105105
#define PID_FS_MAGIC 0x50494446 /* "PIDF" */
106+
#define GUEST_MEMFD_MAGIC 0x474d454d /* "GMEM" */
106107

107108
#endif /* __LINUX_MAGIC_H__ */

mm/filemap.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,11 +1002,16 @@ int filemap_add_folio(struct address_space *mapping, struct folio *folio,
10021002
EXPORT_SYMBOL_GPL(filemap_add_folio);
10031003

10041004
#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)
10061007
{
10071008
int n;
10081009
struct folio *folio;
10091010

1011+
if (policy)
1012+
return folio_alloc_mpol_noprof(gfp, order, policy,
1013+
NO_INTERLEAVE_INDEX, numa_node_id());
1014+
10101015
if (cpuset_do_page_mem_spread()) {
10111016
unsigned int cpuset_mems_cookie;
10121017
do {
@@ -1923,11 +1928,12 @@ void *filemap_get_entry(struct address_space *mapping, pgoff_t index)
19231928
}
19241929

19251930
/**
1926-
* __filemap_get_folio - Find and get a reference to a folio.
1931+
* __filemap_get_folio_mpol - Find and get a reference to a folio.
19271932
* @mapping: The address_space to search.
19281933
* @index: The page index.
19291934
* @fgp_flags: %FGP flags modify how the folio is returned.
19301935
* @gfp: Memory allocation flags to use if %FGP_CREAT is specified.
1936+
* @policy: NUMA memory allocation policy to follow.
19311937
*
19321938
* Looks up the page cache entry at @mapping & @index.
19331939
*
@@ -1938,8 +1944,8 @@ void *filemap_get_entry(struct address_space *mapping, pgoff_t index)
19381944
*
19391945
* Return: The found folio or an ERR_PTR() otherwise.
19401946
*/
1941-
struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t index,
1942-
fgf_t fgp_flags, gfp_t gfp)
1947+
struct folio *__filemap_get_folio_mpol(struct address_space *mapping,
1948+
pgoff_t index, fgf_t fgp_flags, gfp_t gfp, struct mempolicy *policy)
19431949
{
19441950
struct folio *folio;
19451951

@@ -2009,7 +2015,7 @@ struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t index,
20092015
err = -ENOMEM;
20102016
if (order > min_order)
20112017
alloc_gfp |= __GFP_NORETRY | __GFP_NOWARN;
2012-
folio = filemap_alloc_folio(alloc_gfp, order);
2018+
folio = filemap_alloc_folio(alloc_gfp, order, policy);
20132019
if (!folio)
20142020
continue;
20152021

@@ -2056,7 +2062,7 @@ struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t index,
20562062
folio_clear_dropbehind(folio);
20572063
return folio;
20582064
}
2059-
EXPORT_SYMBOL(__filemap_get_folio);
2065+
EXPORT_SYMBOL(__filemap_get_folio_mpol);
20602066

20612067
static inline struct folio *find_get_entry(struct xa_state *xas, pgoff_t max,
20622068
xa_mark_t mark)
@@ -2551,7 +2557,7 @@ static int filemap_create_folio(struct kiocb *iocb, struct folio_batch *fbatch)
25512557
if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_WAITQ))
25522558
return -EAGAIN;
25532559

2554-
folio = filemap_alloc_folio(mapping_gfp_mask(mapping), min_order);
2560+
folio = filemap_alloc_folio(mapping_gfp_mask(mapping), min_order, NULL);
25552561
if (!folio)
25562562
return -ENOMEM;
25572563
if (iocb->ki_flags & IOCB_DONTCACHE)
@@ -3995,8 +4001,7 @@ static struct folio *do_read_cache_folio(struct address_space *mapping,
39954001
repeat:
39964002
folio = filemap_get_folio(mapping, index);
39974003
if (IS_ERR(folio)) {
3998-
folio = filemap_alloc_folio(gfp,
3999-
mapping_min_folio_order(mapping));
4004+
folio = filemap_alloc_folio(gfp, mapping_min_folio_order(mapping), NULL);
40004005
if (!folio)
40014006
return ERR_PTR(-ENOMEM);
40024007
index = mapping_align_index(mapping, index);

mm/mempolicy.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ struct mempolicy *get_task_policy(struct task_struct *p)
354354

355355
return &default_policy;
356356
}
357+
EXPORT_SYMBOL_FOR_MODULES(get_task_policy, "kvm");
357358

358359
static const struct mempolicy_operations {
359360
int (*create)(struct mempolicy *pol, const nodemask_t *nodes);
@@ -487,6 +488,7 @@ void __mpol_put(struct mempolicy *pol)
487488
return;
488489
kmem_cache_free(policy_cache, pol);
489490
}
491+
EXPORT_SYMBOL_FOR_MODULES(__mpol_put, "kvm");
490492

491493
static void mpol_rebind_default(struct mempolicy *pol, const nodemask_t *nodes)
492494
{
@@ -2885,6 +2887,7 @@ struct mempolicy *mpol_shared_policy_lookup(struct shared_policy *sp,
28852887
read_unlock(&sp->lock);
28862888
return pol;
28872889
}
2890+
EXPORT_SYMBOL_FOR_MODULES(mpol_shared_policy_lookup, "kvm");
28882891

28892892
static void sp_free(struct sp_node *n)
28902893
{
@@ -3170,6 +3173,7 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol)
31703173
mpol_put(mpol); /* drop our incoming ref on sb mpol */
31713174
}
31723175
}
3176+
EXPORT_SYMBOL_FOR_MODULES(mpol_shared_policy_init, "kvm");
31733177

31743178
int mpol_set_shared_policy(struct shared_policy *sp,
31753179
struct vm_area_struct *vma, struct mempolicy *pol)
@@ -3188,6 +3192,7 @@ int mpol_set_shared_policy(struct shared_policy *sp,
31883192
sp_free(new);
31893193
return err;
31903194
}
3195+
EXPORT_SYMBOL_FOR_MODULES(mpol_set_shared_policy, "kvm");
31913196

31923197
/* Free a backing policy store on inode delete. */
31933198
void mpol_free_shared_policy(struct shared_policy *sp)
@@ -3206,6 +3211,7 @@ void mpol_free_shared_policy(struct shared_policy *sp)
32063211
}
32073212
write_unlock(&sp->lock);
32083213
}
3214+
EXPORT_SYMBOL_FOR_MODULES(mpol_free_shared_policy, "kvm");
32093215

32103216
#ifdef CONFIG_NUMA_BALANCING
32113217
static int __initdata numabalancing_override;

mm/readahead.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ static struct folio *ractl_alloc_folio(struct readahead_control *ractl,
186186
{
187187
struct folio *folio;
188188

189-
folio = filemap_alloc_folio(gfp_mask, order);
189+
folio = filemap_alloc_folio(gfp_mask, order, NULL);
190190
if (folio && ractl->dropbehind)
191191
__folio_set_dropbehind(folio);
192192

tools/testing/selftests/kvm/arm64/vgic_irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@ static void kvm_routing_and_irqfd_check(struct kvm_vm *vm,
636636
}
637637

638638
for (f = 0, i = intid; i < (uint64_t)intid + num; i++, f++)
639-
close(fd[f]);
639+
kvm_close(fd[f]);
640640
}
641641

642642
/* handles the valid case: intid=0xffffffff num=1 */

0 commit comments

Comments
 (0)