Hi all, On Wed, 22 Nov 2023 12:55:39 +1100 Stephen Rothwell wrote: > > Today's linux-next merge of the kvm tree got a conflict in: > > include/linux/pagemap.h > > between commit: > > 762321dab9a7 ("filemap: add a per-mapping stable writes flag") This is now in Linus' tree. > from the vfs-brauner tree and commit: > > 0003e2a41468 ("mm: Add AS_UNMOVABLE to mark mapping as completely unmovable") > > from the kvm tree. > > I fixed it up (see below) and can carry the fix as necessary. This > is now fixed as far as linux-next is concerned, but any non trivial > conflicts should be mentioned to your upstream maintainer when your tree > is submitted for merging. You may also want to consider cooperating > with the maintainer of the conflicting tree to minimise any particularly > complex conflicts. The current resolution is below. -- Cheers, Stephen Rothwell diff --cc include/linux/pagemap.h index 06142ff7f9ce,bf2965b01b35..c2d90588c0bf --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@@ -203,9 -203,8 +203,10 @@@ enum mapping_flags /* writeback related tags are not used */ AS_NO_WRITEBACK_TAGS = 5, AS_LARGE_FOLIO_SUPPORT = 6, - AS_RELEASE_ALWAYS = 7, /* Call ->release_folio(), even if no private data */ - AS_UNMOVABLE = 8, /* The mapping cannot be moved, ever */ + AS_RELEASE_ALWAYS, /* Call ->release_folio(), even if no private data */ + AS_STABLE_WRITES, /* must wait for writeback before modifying + folio contents */ ++ AS_UNMOVABLE, /* The mapping cannot be moved, ever */ }; /** @@@ -291,21 -290,22 +292,37 @@@ static inline void mapping_clear_releas clear_bit(AS_RELEASE_ALWAYS, &mapping->flags); } + static inline void mapping_set_unmovable(struct address_space *mapping) + { + /* + * It's expected unmovable mappings are also unevictable. Compaction + * migrate scanner (isolate_migratepages_block()) relies on this to + * reduce page locking. + */ + set_bit(AS_UNEVICTABLE, &mapping->flags); + set_bit(AS_UNMOVABLE, &mapping->flags); + } + + static inline bool mapping_unmovable(struct address_space *mapping) + { + return test_bit(AS_UNMOVABLE, &mapping->flags); + } + +static inline bool mapping_stable_writes(const struct address_space *mapping) +{ + return test_bit(AS_STABLE_WRITES, &mapping->flags); +} + +static inline void mapping_set_stable_writes(struct address_space *mapping) +{ + set_bit(AS_STABLE_WRITES, &mapping->flags); +} + +static inline void mapping_clear_stable_writes(struct address_space *mapping) +{ + clear_bit(AS_STABLE_WRITES, &mapping->flags); +} + static inline gfp_t mapping_gfp_mask(struct address_space * mapping) { return mapping->gfp_mask;