cgroup/cpuset: Avoid memory migration when nodemasks match
authorNicolas Saenz Julienne <nsaenzju@redhat.com>
Wed, 25 Aug 2021 10:54:15 +0000 (12:54 +0200)
committerTejun Heo <tj@kernel.org>
Wed, 25 Aug 2021 16:51:51 +0000 (06:51 -1000)
With the introduction of ee9707e8593d ("cgroup/cpuset: Enable memory
migration for cpuset v2") attaching a process to a different cgroup will
trigger a memory migration regardless of whether it's really needed.
Memory migration is an expensive operation, so bypass it if the
nodemasks passed to cpuset_migrate_mm() are equal.

Note that we're not only avoiding the migration work itself, but also a
call to lru_cache_disable(), which triggers and flushes an LRU drain
work on every online CPU.

Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/cgroup/cpuset.c

index 44d234b..d497a65 100644 (file)
@@ -1634,6 +1634,11 @@ static void cpuset_migrate_mm(struct mm_struct *mm, const nodemask_t *from,
 {
        struct cpuset_migrate_mm_work *mwork;
 
+       if (nodes_equal(*from, *to)) {
+               mmput(mm);
+               return;
+       }
+
        mwork = kzalloc(sizeof(*mwork), GFP_KERNEL);
        if (mwork) {
                mwork->mm = mm;