mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 23:09:29 +02:00
Merge tag 'mm-hotfixes-stable-2026-09-13-21-50' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Pull misc fixes from Andrew Morton: "14 hotfixes. 10 are cc:stable. 11 are for MM. All are singletons - please see the changelogs for details" * tag 'mm-hotfixes-stable-2026-09-13-21-50' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm: mm/folio: EXPORT_SYMBOL_FOR_KVM(lru_cache_drain_for_folio) mm/shrinker: fix bogus set_shrinker_bit() with cgroup.memory=nokmem mm/vma: correctly unaccount on mmap_prepare() failure mm/mlock: use the IRQ-safe accessor for NR_MLOCK in __munlock_folio() remove old lib/alloc_tag.c fs/dax: check zero or empty entry before converting xarray entry fs: fix missed removal of super_fs_objects_eligible() mm: filemap: retain mapped dropbehind folios mailmap: update entry for Christopher Obbard memcg: avoid charging the root memcg from obj_cgroup_charge_pages() mm, swap: fix SWAP_USAGE_OFFLIST_BIT collision with real usage count mailmap: map Coiby Xu's address mm/mremap: account mm->locked_vm correctly for MREMAP_DONTUNMAP mm/huge_memory: bypass THP tuneables for huge pfnmap mappings
This commit is contained in:
@@ -480,11 +480,12 @@ static void dax_associate_entry(void *entry, struct address_space *mapping,
|
||||
unsigned long address, bool shared)
|
||||
{
|
||||
unsigned long size = dax_entry_size(entry), index;
|
||||
struct folio *folio = dax_to_folio(entry);
|
||||
struct folio *folio;
|
||||
|
||||
if (dax_is_zero_entry(entry) || dax_is_empty_entry(entry))
|
||||
return;
|
||||
|
||||
folio = dax_to_folio(entry);
|
||||
index = linear_page_index(vma, address & ~(size - 1));
|
||||
if (shared && (folio->mapping || dax_folio_is_shared(folio))) {
|
||||
if (folio->mapping)
|
||||
@@ -505,21 +506,23 @@ static void dax_associate_entry(void *entry, struct address_space *mapping,
|
||||
static void dax_disassociate_entry(void *entry, struct address_space *mapping,
|
||||
bool trunc)
|
||||
{
|
||||
struct folio *folio = dax_to_folio(entry);
|
||||
struct folio *folio;
|
||||
|
||||
if (dax_is_zero_entry(entry) || dax_is_empty_entry(entry))
|
||||
return;
|
||||
|
||||
folio = dax_to_folio(entry);
|
||||
dax_folio_put(folio);
|
||||
}
|
||||
|
||||
static struct page *dax_busy_page(void *entry)
|
||||
{
|
||||
struct folio *folio = dax_to_folio(entry);
|
||||
struct folio *folio;
|
||||
|
||||
if (dax_is_zero_entry(entry) || dax_is_empty_entry(entry))
|
||||
return NULL;
|
||||
|
||||
folio = dax_to_folio(entry);
|
||||
if (folio_ref_count(folio) - folio_mapcount(folio))
|
||||
return &folio->page;
|
||||
else
|
||||
|
||||
+2
-16
@@ -171,19 +171,6 @@ static void super_wake(struct super_block *sb, unsigned int flag)
|
||||
wake_up_var(&sb->s_flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* The s_op->nr_cached_objects hooks (used for example by btrfs and xfs)
|
||||
* operate on filesystem-global state and ignore sc->memcg. Driving them
|
||||
* from per-memcg shrink_slab_memcg() invocations only burns CPU walking
|
||||
* per-cpu counters and queueing duplicate work: the actual reclaim happens on
|
||||
* the global path (kswapd or root direct reclaim) regardless. Restrict them
|
||||
* to that path.
|
||||
*/
|
||||
static inline bool super_fs_objects_eligible(struct shrink_control *sc)
|
||||
{
|
||||
return !sc->memcg || mem_cgroup_is_root(sc->memcg);
|
||||
}
|
||||
|
||||
/*
|
||||
* One thing we have to be careful of with a per-sb shrinker is that we don't
|
||||
* drop the last active reference to the superblock from within the shrinker.
|
||||
@@ -213,7 +200,7 @@ static unsigned long super_cache_scan(struct shrinker *shrink,
|
||||
if (!super_trylock_shared(sb))
|
||||
return SHRINK_STOP;
|
||||
|
||||
if (sb->s_op->nr_cached_objects && super_fs_objects_eligible(sc))
|
||||
if (sb->s_op->nr_cached_objects)
|
||||
fs_objects = sb->s_op->nr_cached_objects(sb, sc);
|
||||
|
||||
inodes = list_lru_shrink_count(&sb->s_inode_lru, sc);
|
||||
@@ -274,8 +261,7 @@ static unsigned long super_cache_count(struct shrinker *shrink,
|
||||
return 0;
|
||||
smp_rmb();
|
||||
|
||||
if (sb->s_op && sb->s_op->nr_cached_objects &&
|
||||
super_fs_objects_eligible(sc))
|
||||
if (sb->s_op && sb->s_op->nr_cached_objects)
|
||||
total_objects = sb->s_op->nr_cached_objects(sb, sc);
|
||||
|
||||
total_objects += list_lru_shrink_count(&sb->s_dentry_lru, sc);
|
||||
|
||||
Reference in New Issue
Block a user