Commit f98782ddd31ac6f938386b79d8bd7aa7c8a78c50

Authored by Joonsoo Kim
Committed by Linus Torvalds
1 parent e81ce85f96

mm, vmalloc: iterate vmap_area_list in get_vmalloc_info()

This patch is a preparatory step for removing vmlist entirely.  For
above purpose, we change iterating a vmap_list codes to iterating a
vmap_area_list.  It is somewhat trivial change, but just one thing
should be noticed.

vmlist is lack of information about some areas in vmalloc address space.
For example, vm_map_ram() allocate area in vmalloc address space, but it
doesn't make a link with vmlist.  To provide full information about
vmalloc address space is better idea, so we don't use va->vm and use
vmap_area directly.  This makes get_vmalloc_info() more precise.

Signed-off-by: Joonsoo Kim <js1304@gmail.com>
Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Atsushi Kumagai <kumagai-atsushi@mxc.nes.nec.co.jp>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Dave Anderson <anderson@redhat.com>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Guan Xuetao <gxt@mprc.pku.edu.cn>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 30 additions and 26 deletions Side-by-side Diff

... ... @@ -2671,46 +2671,50 @@
2671 2671  
2672 2672 void get_vmalloc_info(struct vmalloc_info *vmi)
2673 2673 {
2674   - struct vm_struct *vma;
  2674 + struct vmap_area *va;
2675 2675 unsigned long free_area_size;
2676 2676 unsigned long prev_end;
2677 2677  
2678 2678 vmi->used = 0;
  2679 + vmi->largest_chunk = 0;
2679 2680  
2680   - if (!vmlist) {
2681   - vmi->largest_chunk = VMALLOC_TOTAL;
2682   - } else {
2683   - vmi->largest_chunk = 0;
  2681 + prev_end = VMALLOC_START;
2684 2682  
2685   - prev_end = VMALLOC_START;
  2683 + spin_lock(&vmap_area_lock);
2686 2684  
2687   - read_lock(&vmlist_lock);
  2685 + if (list_empty(&vmap_area_list)) {
  2686 + vmi->largest_chunk = VMALLOC_TOTAL;
  2687 + goto out;
  2688 + }
2688 2689  
2689   - for (vma = vmlist; vma; vma = vma->next) {
2690   - unsigned long addr = (unsigned long) vma->addr;
  2690 + list_for_each_entry(va, &vmap_area_list, list) {
  2691 + unsigned long addr = va->va_start;
2691 2692  
2692   - /*
2693   - * Some archs keep another range for modules in vmlist
2694   - */
2695   - if (addr < VMALLOC_START)
2696   - continue;
2697   - if (addr >= VMALLOC_END)
2698   - break;
  2693 + /*
  2694 + * Some archs keep another range for modules in vmalloc space
  2695 + */
  2696 + if (addr < VMALLOC_START)
  2697 + continue;
  2698 + if (addr >= VMALLOC_END)
  2699 + break;
2699 2700  
2700   - vmi->used += vma->size;
  2701 + if (va->flags & (VM_LAZY_FREE | VM_LAZY_FREEING))
  2702 + continue;
2701 2703  
2702   - free_area_size = addr - prev_end;
2703   - if (vmi->largest_chunk < free_area_size)
2704   - vmi->largest_chunk = free_area_size;
  2704 + vmi->used += (va->va_end - va->va_start);
2705 2705  
2706   - prev_end = vma->size + addr;
2707   - }
  2706 + free_area_size = addr - prev_end;
  2707 + if (vmi->largest_chunk < free_area_size)
  2708 + vmi->largest_chunk = free_area_size;
2708 2709  
2709   - if (VMALLOC_END - prev_end > vmi->largest_chunk)
2710   - vmi->largest_chunk = VMALLOC_END - prev_end;
2711   -
2712   - read_unlock(&vmlist_lock);
  2710 + prev_end = va->va_end;
2713 2711 }
  2712 +
  2713 + if (VMALLOC_END - prev_end > vmi->largest_chunk)
  2714 + vmi->largest_chunk = VMALLOC_END - prev_end;
  2715 +
  2716 +out:
  2717 + spin_unlock(&vmap_area_lock);
2714 2718 }
2715 2719 #endif