1 /* mmu.c: mmu memory info files 2 * 3 * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 9 * 2 of the License, or (at your option) any later version. 10 */ 11 #include <linux/spinlock.h> 12 #include <linux/vmalloc.h> 13 #include <linux/highmem.h> 14 #include <asm/pgtable.h> 15 #include "internal.h" 16 get_vmalloc_info(struct vmalloc_info * vmi)17void get_vmalloc_info(struct vmalloc_info *vmi) 18 { 19 struct vm_struct *vma; 20 unsigned long free_area_size; 21 unsigned long prev_end; 22 23 vmi->used = 0; 24 25 if (!vmlist) { 26 vmi->largest_chunk = VMALLOC_TOTAL; 27 } 28 else { 29 vmi->largest_chunk = 0; 30 31 prev_end = VMALLOC_START; 32 33 read_lock(&vmlist_lock); 34 35 for (vma = vmlist; vma; vma = vma->next) { 36 unsigned long addr = (unsigned long) vma->addr; 37 38 /* 39 * Some archs keep another range for modules in vmlist 40 */ 41 if (addr < VMALLOC_START) 42 continue; 43 if (addr >= VMALLOC_END) 44 break; 45 46 vmi->used += vma->size; 47 48 free_area_size = addr - prev_end; 49 if (vmi->largest_chunk < free_area_size) 50 vmi->largest_chunk = free_area_size; 51 52 prev_end = vma->size + addr; 53 } 54 55 if (VMALLOC_END - prev_end > vmi->largest_chunk) 56 vmi->largest_chunk = VMALLOC_END - prev_end; 57 58 read_unlock(&vmlist_lock); 59 } 60 } 61