Commit 0c563f14 authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Andrew Morton

proc: remove VMA rbtree use from nommu

These users of the rbtree should probably have been walks of the linked
list, but convert them to use walks of the maple tree.

Link: https://lkml.kernel.org/r/20220906194824.2110408-17-Liam.Howlett@oracle.comSigned-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: default avatarLiam R. Howlett <Liam.Howlett@Oracle.com>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
Reviewed-by: default avatarDavidlohr Bueso <dave@stgolabs.net>
Tested-by: default avatarYu Zhao <yuzhao@google.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: David Howells <dhowells@redhat.com>
Cc: SeongJae Park <sj@kernel.org>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent d0cf3dd4
...@@ -20,15 +20,13 @@ ...@@ -20,15 +20,13 @@
*/ */
void task_mem(struct seq_file *m, struct mm_struct *mm) void task_mem(struct seq_file *m, struct mm_struct *mm)
{ {
VMA_ITERATOR(vmi, mm, 0);
struct vm_area_struct *vma; struct vm_area_struct *vma;
struct vm_region *region; struct vm_region *region;
struct rb_node *p;
unsigned long bytes = 0, sbytes = 0, slack = 0, size; unsigned long bytes = 0, sbytes = 0, slack = 0, size;
mmap_read_lock(mm); mmap_read_lock(mm);
for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) { for_each_vma(vmi, vma) {
vma = rb_entry(p, struct vm_area_struct, vm_rb);
bytes += kobjsize(vma); bytes += kobjsize(vma);
region = vma->vm_region; region = vma->vm_region;
...@@ -82,15 +80,13 @@ void task_mem(struct seq_file *m, struct mm_struct *mm) ...@@ -82,15 +80,13 @@ void task_mem(struct seq_file *m, struct mm_struct *mm)
unsigned long task_vsize(struct mm_struct *mm) unsigned long task_vsize(struct mm_struct *mm)
{ {
VMA_ITERATOR(vmi, mm, 0);
struct vm_area_struct *vma; struct vm_area_struct *vma;
struct rb_node *p;
unsigned long vsize = 0; unsigned long vsize = 0;
mmap_read_lock(mm); mmap_read_lock(mm);
for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) { for_each_vma(vmi, vma)
vma = rb_entry(p, struct vm_area_struct, vm_rb);
vsize += vma->vm_end - vma->vm_start; vsize += vma->vm_end - vma->vm_start;
}
mmap_read_unlock(mm); mmap_read_unlock(mm);
return vsize; return vsize;
} }
...@@ -99,14 +95,13 @@ unsigned long task_statm(struct mm_struct *mm, ...@@ -99,14 +95,13 @@ unsigned long task_statm(struct mm_struct *mm,
unsigned long *shared, unsigned long *text, unsigned long *shared, unsigned long *text,
unsigned long *data, unsigned long *resident) unsigned long *data, unsigned long *resident)
{ {
VMA_ITERATOR(vmi, mm, 0);
struct vm_area_struct *vma; struct vm_area_struct *vma;
struct vm_region *region; struct vm_region *region;
struct rb_node *p;
unsigned long size = kobjsize(mm); unsigned long size = kobjsize(mm);
mmap_read_lock(mm); mmap_read_lock(mm);
for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) { for_each_vma(vmi, vma) {
vma = rb_entry(p, struct vm_area_struct, vm_rb);
size += kobjsize(vma); size += kobjsize(vma);
region = vma->vm_region; region = vma->vm_region;
if (region) { if (region) {
...@@ -190,17 +185,19 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) ...@@ -190,17 +185,19 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma)
*/ */
static int show_map(struct seq_file *m, void *_p) static int show_map(struct seq_file *m, void *_p)
{ {
struct rb_node *p = _p; return nommu_vma_show(m, _p);
return nommu_vma_show(m, rb_entry(p, struct vm_area_struct, vm_rb));
} }
static void *m_start(struct seq_file *m, loff_t *pos) static void *m_start(struct seq_file *m, loff_t *pos)
{ {
struct proc_maps_private *priv = m->private; struct proc_maps_private *priv = m->private;
struct mm_struct *mm; struct mm_struct *mm;
struct rb_node *p; struct vm_area_struct *vma;
loff_t n = *pos; unsigned long addr = *pos;
/* See m_next(). Zero at the start or after lseek. */
if (addr == -1UL)
return NULL;
/* pin the task and mm whilst we play with them */ /* pin the task and mm whilst we play with them */
priv->task = get_proc_task(priv->inode); priv->task = get_proc_task(priv->inode);
...@@ -216,10 +213,10 @@ static void *m_start(struct seq_file *m, loff_t *pos) ...@@ -216,10 +213,10 @@ static void *m_start(struct seq_file *m, loff_t *pos)
return ERR_PTR(-EINTR); return ERR_PTR(-EINTR);
} }
/* start from the Nth VMA */ /* start the next element from addr */
for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) vma = find_vma(mm, addr);
if (n-- == 0) if (vma)
return p; return vma;
mmap_read_unlock(mm); mmap_read_unlock(mm);
mmput(mm); mmput(mm);
...@@ -242,10 +239,10 @@ static void m_stop(struct seq_file *m, void *_vml) ...@@ -242,10 +239,10 @@ static void m_stop(struct seq_file *m, void *_vml)
static void *m_next(struct seq_file *m, void *_p, loff_t *pos) static void *m_next(struct seq_file *m, void *_p, loff_t *pos)
{ {
struct rb_node *p = _p; struct vm_area_struct *vma = _p;
(*pos)++; *pos = vma->vm_end;
return p ? rb_next(p) : NULL; return find_vma(vma->vm_mm, vma->vm_end);
} }
static const struct seq_operations proc_pid_maps_ops = { static const struct seq_operations proc_pid_maps_ops = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment