media: starfive: Update VIN system PM operation
[platform/kernel/linux-starfive.git] / mm / oom_kill.c
index 831340e..989f35a 100644 (file)
@@ -1150,7 +1150,7 @@ SYSCALL_DEFINE2(process_mrelease, int, pidfd, unsigned int, flags)
        struct task_struct *task;
        struct task_struct *p;
        unsigned int f_flags;
-       bool reap = true;
+       bool reap = false;
        struct pid *pid;
        long ret = 0;
 
@@ -1177,15 +1177,15 @@ SYSCALL_DEFINE2(process_mrelease, int, pidfd, unsigned int, flags)
                goto put_task;
        }
 
-       mm = p->mm;
-       mmgrab(mm);
-
-       /* If the work has been done already, just exit with success */
-       if (test_bit(MMF_OOM_SKIP, &mm->flags))
-               reap = false;
-       else if (!task_will_free_mem(p)) {
-               reap = false;
-               ret = -EINVAL;
+       if (mmget_not_zero(p->mm)) {
+               mm = p->mm;
+               if (task_will_free_mem(p))
+                       reap = true;
+               else {
+                       /* Error only if the work has not been done already */
+                       if (!test_bit(MMF_OOM_SKIP, &mm->flags))
+                               ret = -EINVAL;
+               }
        }
        task_unlock(p);
 
@@ -1201,7 +1201,8 @@ SYSCALL_DEFINE2(process_mrelease, int, pidfd, unsigned int, flags)
        mmap_read_unlock(mm);
 
 drop_mm:
-       mmdrop(mm);
+       if (mm)
+               mmput(mm);
 put_task:
        put_task_struct(task);
 put_pid: