WIP: update tizen_qemu_defconfig
[platform/kernel/linux-starfive.git] / mm / vmscan.c
index 8fcc5fa..d182961 100644 (file)
@@ -740,6 +740,8 @@ EXPORT_SYMBOL(register_shrinker);
  */
 void unregister_shrinker(struct shrinker *shrinker)
 {
+       struct dentry *debugfs_entry;
+
        if (!(shrinker->flags & SHRINKER_REGISTERED))
                return;
 
@@ -748,9 +750,11 @@ void unregister_shrinker(struct shrinker *shrinker)
        shrinker->flags &= ~SHRINKER_REGISTERED;
        if (shrinker->flags & SHRINKER_MEMCG_AWARE)
                unregister_memcg_shrinker(shrinker);
-       shrinker_debugfs_remove(shrinker);
+       debugfs_entry = shrinker_debugfs_remove(shrinker);
        up_write(&shrinker_rwsem);
 
+       debugfs_remove_recursive(debugfs_entry);
+
        kfree(shrinker->nr_deferred);
        shrinker->nr_deferred = NULL;
 }
@@ -1883,6 +1887,16 @@ retry:
                        }
                }
 
+               /*
+                * Folio is unmapped now so it cannot be newly pinned anymore.
+                * No point in trying to reclaim folio if it is pinned.
+                * Furthermore we don't want to reclaim underlying fs metadata
+                * if the folio is pinned and thus potentially modified by the
+                * pinning process as that may upset the filesystem.
+                */
+               if (folio_maybe_dma_pinned(folio))
+                       goto activate_locked;
+
                mapping = folio_mapping(folio);
                if (folio_test_dirty(folio)) {
                        /*
@@ -3290,13 +3304,16 @@ void lru_gen_migrate_mm(struct mm_struct *mm)
        if (mem_cgroup_disabled())
                return;
 
+       /* migration can happen before addition */
+       if (!mm->lru_gen.memcg)
+               return;
+
        rcu_read_lock();
        memcg = mem_cgroup_from_task(task);
        rcu_read_unlock();
        if (memcg == mm->lru_gen.memcg)
                return;
 
-       VM_WARN_ON_ONCE(!mm->lru_gen.memcg);
        VM_WARN_ON_ONCE(list_empty(&mm->lru_gen.list));
 
        lru_gen_del_mm(mm);