| /* mmu.c: mmu memory info files | |
| * | |
| * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | |
| * Written by David Howells (dhowells@redhat.com) | |
| * | |
| * This program is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU General Public License | |
| * as published by the Free Software Foundation; either version | |
| * 2 of the License, or (at your option) any later version. | |
| */ | |
| #include <linux/spinlock.h> | |
| #include <linux/vmalloc.h> | |
| #include <linux/highmem.h> | |
| #include <asm/pgtable.h> | |
| #include "internal.h" | |
| void get_vmalloc_info(struct vmalloc_info *vmi) | |
| { | |
| struct vm_struct *vma; | |
| unsigned long free_area_size; | |
| unsigned long prev_end; | |
| vmi->used = 0; | |
| if (!vmlist) { | |
| vmi->largest_chunk = VMALLOC_TOTAL; | |
| } | |
| else { | |
| vmi->largest_chunk = 0; | |
| prev_end = VMALLOC_START; | |
| read_lock(&vmlist_lock); | |
| for (vma = vmlist; vma; vma = vma->next) { | |
| unsigned long addr = (unsigned long) vma->addr; | |
| /* | |
| * Some archs keep another range for modules in vmlist | |
| */ | |
| if (addr < VMALLOC_START) | |
| continue; | |
| if (addr >= VMALLOC_END) | |
| break; | |
| vmi->used += vma->size; | |
| free_area_size = addr - prev_end; | |
| if (vmi->largest_chunk < free_area_size) | |
| vmi->largest_chunk = free_area_size; | |
| prev_end = vma->size + addr; | |
| } | |
| if (VMALLOC_END - prev_end > vmi->largest_chunk) | |
| vmi->largest_chunk = VMALLOC_END - prev_end; | |
| read_unlock(&vmlist_lock); | |
| } | |
| } |