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.com Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> Reviewed-by: Davidlohr Bueso <dave@stgolabs.net> Tested-by: Yu 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: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
d0cf3dd47f
commit
0c563f1480
@ -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;
|
||||
@ -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;
|
||||
}
|
||||
@ -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) {
|
||||
@ -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);
|
||||
@ -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);
|
||||
@ -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 = {
|
||||
|
Loading…
Reference in New Issue
Block a user