Skip to content

Commit

Permalink
proc: remove VMA rbtree use from nommu
Browse files Browse the repository at this point in the history
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/[email protected]
Signed-off-by: Matthew Wilcox (Oracle) <[email protected]>
Signed-off-by: Liam R. Howlett <[email protected]>
Acked-by: Vlastimil Babka <[email protected]>
Reviewed-by: Davidlohr Bueso <[email protected]>
Tested-by: Yu Zhao <[email protected]>
Cc: Catalin Marinas <[email protected]>
Cc: David Hildenbrand <[email protected]>
Cc: David Howells <[email protected]>
Cc: SeongJae Park <[email protected]>
Cc: Sven Schnelle <[email protected]>
Cc: Will Deacon <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
  • Loading branch information
Matthew Wilcox (Oracle) authored and akpm00 committed Sep 27, 2022
1 parent d0cf3dd commit 0c563f1
Showing 1 changed file with 21 additions and 24 deletions.
45 changes: 21 additions & 24 deletions fs/proc/task_nommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,13 @@
*/
void task_mem(struct seq_file *m, struct mm_struct *mm)
{
VMA_ITERATOR(vmi, mm, 0);
struct vm_area_struct *vma;
struct vm_region *region;
struct rb_node *p;
unsigned long bytes = 0, sbytes = 0, slack = 0, size;

mmap_read_lock(mm);
for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) {
vma = rb_entry(p, struct vm_area_struct, vm_rb);

mmap_read_lock(mm);
for_each_vma(vmi, vma) {
bytes += kobjsize(vma);

region = vma->vm_region;
Expand Down Expand Up @@ -82,15 +80,13 @@ void task_mem(struct seq_file *m, struct mm_struct *mm)

unsigned long task_vsize(struct mm_struct *mm)
{
VMA_ITERATOR(vmi, mm, 0);
struct vm_area_struct *vma;
struct rb_node *p;
unsigned long vsize = 0;

mmap_read_lock(mm);
for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) {
vma = rb_entry(p, struct vm_area_struct, vm_rb);
for_each_vma(vmi, vma)
vsize += vma->vm_end - vma->vm_start;
}
mmap_read_unlock(mm);
return vsize;
}
Expand All @@ -99,14 +95,13 @@ unsigned long task_statm(struct mm_struct *mm,
unsigned long *shared, unsigned long *text,
unsigned long *data, unsigned long *resident)
{
VMA_ITERATOR(vmi, mm, 0);
struct vm_area_struct *vma;
struct vm_region *region;
struct rb_node *p;
unsigned long size = kobjsize(mm);

mmap_read_lock(mm);
for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) {
vma = rb_entry(p, struct vm_area_struct, vm_rb);
for_each_vma(vmi, vma) {
size += kobjsize(vma);
region = vma->vm_region;
if (region) {
Expand Down Expand Up @@ -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)
{
struct rb_node *p = _p;

return nommu_vma_show(m, rb_entry(p, struct vm_area_struct, vm_rb));
return nommu_vma_show(m, _p);
}

static void *m_start(struct seq_file *m, loff_t *pos)
{
struct proc_maps_private *priv = m->private;
struct mm_struct *mm;
struct rb_node *p;
loff_t n = *pos;
struct vm_area_struct *vma;
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 */
priv->task = get_proc_task(priv->inode);
Expand All @@ -216,10 +213,10 @@ static void *m_start(struct seq_file *m, loff_t *pos)
return ERR_PTR(-EINTR);
}

/* start from the Nth VMA */
for (p = rb_first(&mm->mm_rb); p; p = rb_next(p))
if (n-- == 0)
return p;
/* start the next element from addr */
vma = find_vma(mm, addr);
if (vma)
return vma;

mmap_read_unlock(mm);
mmput(mm);
Expand All @@ -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)
{
struct rb_node *p = _p;
struct vm_area_struct *vma = _p;

(*pos)++;
return p ? rb_next(p) : NULL;
*pos = vma->vm_end;
return find_vma(vma->vm_mm, vma->vm_end);
}

static const struct seq_operations proc_pid_maps_ops = {
Expand Down

0 comments on commit 0c563f1

Please sign in to comment.