]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
proc: inline vma_stop into m_stop
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Tue, 7 Apr 2020 03:09:08 +0000 (20:09 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 7 Apr 2020 17:43:42 +0000 (10:43 -0700)
Instead of calling vma_stop() from m_start() and m_next(), do its work
in m_stop().

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Link: http://lkml.kernel.org/r/20200317193201.9924-1-adobriyan@gmail.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/proc/task_mmu.c

index 3ba9ae83bff5a54a98d831c9cee416e06fa41a08..4b19a46d351f68e23a8fd06d364ffa6e1818e87b 100644 (file)
@@ -123,15 +123,6 @@ static void release_task_mempolicy(struct proc_maps_private *priv)
 }
 #endif
 
-static void vma_stop(struct proc_maps_private *priv)
-{
-       struct mm_struct *mm = priv->mm;
-
-       release_task_mempolicy(priv);
-       up_read(&mm->mmap_sem);
-       mmput(mm);
-}
-
 static struct vm_area_struct *
 m_next_vma(struct proc_maps_private *priv, struct vm_area_struct *vma)
 {
@@ -163,11 +154,16 @@ static void *m_start(struct seq_file *m, loff_t *ppos)
                return ERR_PTR(-ESRCH);
 
        mm = priv->mm;
-       if (!mm || !mmget_not_zero(mm))
+       if (!mm || !mmget_not_zero(mm)) {
+               put_task_struct(priv->task);
+               priv->task = NULL;
                return NULL;
+       }
 
        if (down_read_killable(&mm->mmap_sem)) {
                mmput(mm);
+               put_task_struct(priv->task);
+               priv->task = NULL;
                return ERR_PTR(-EINTR);
        }
 
@@ -195,7 +191,6 @@ static void *m_start(struct seq_file *m, loff_t *ppos)
        if (pos == mm->map_count && priv->tail_vma)
                return priv->tail_vma;
 
-       vma_stop(priv);
        return NULL;
 }
 
@@ -206,21 +201,22 @@ static void *m_next(struct seq_file *m, void *v, loff_t *pos)
 
        (*pos)++;
        next = m_next_vma(priv, v);
-       if (!next)
-               vma_stop(priv);
        return next;
 }
 
 static void m_stop(struct seq_file *m, void *v)
 {
        struct proc_maps_private *priv = m->private;
+       struct mm_struct *mm = priv->mm;
 
-       if (!IS_ERR_OR_NULL(v))
-               vma_stop(priv);
-       if (priv->task) {
-               put_task_struct(priv->task);
-               priv->task = NULL;
-       }
+       if (!priv->task)
+               return;
+
+       release_task_mempolicy(priv);
+       up_read(&mm->mmap_sem);
+       mmput(mm);
+       put_task_struct(priv->task);
+       priv->task = NULL;
 }
 
 static int proc_maps_open(struct inode *inode, struct file *file,