mm, vmalloc: move get_vmalloc_info() to vmalloc.c
Now get_vmalloc_info() is in fs/proc/mmu.c. There is no reason that this code must be here and it's implementation needs vmlist_lock and it iterate a vmlist which may be internal data structure for vmalloc. It is preferable that vmlist_lock and vmlist is only used in vmalloc.c for maintainability. So move the code to vmalloc.c 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>
This commit is contained in:
parent
ef93247325
commit
db3808c1ba
6 changed files with 64 additions and 79 deletions
|
@ -5,7 +5,7 @@
|
||||||
obj-y += proc.o
|
obj-y += proc.o
|
||||||
|
|
||||||
proc-y := nommu.o task_nommu.o
|
proc-y := nommu.o task_nommu.o
|
||||||
proc-$(CONFIG_MMU) := mmu.o task_mmu.o
|
proc-$(CONFIG_MMU) := task_mmu.o
|
||||||
|
|
||||||
proc-y += inode.o root.o base.o generic.o array.o \
|
proc-y += inode.o root.o base.o generic.o array.o \
|
||||||
fd.o
|
fd.o
|
||||||
|
|
|
@ -30,24 +30,6 @@ extern int proc_net_init(void);
|
||||||
static inline int proc_net_init(void) { return 0; }
|
static inline int proc_net_init(void) { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct vmalloc_info {
|
|
||||||
unsigned long used;
|
|
||||||
unsigned long largest_chunk;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef CONFIG_MMU
|
|
||||||
#define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START)
|
|
||||||
extern void get_vmalloc_info(struct vmalloc_info *vmi);
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define VMALLOC_TOTAL 0UL
|
|
||||||
#define get_vmalloc_info(vmi) \
|
|
||||||
do { \
|
|
||||||
(vmi)->used = 0; \
|
|
||||||
(vmi)->largest_chunk = 0; \
|
|
||||||
} while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern int proc_tid_stat(struct seq_file *m, struct pid_namespace *ns,
|
extern int proc_tid_stat(struct seq_file *m, struct pid_namespace *ns,
|
||||||
struct pid *pid, struct task_struct *task);
|
struct pid *pid, struct task_struct *task);
|
||||||
extern int proc_tgid_stat(struct seq_file *m, struct pid_namespace *ns,
|
extern int proc_tgid_stat(struct seq_file *m, struct pid_namespace *ns,
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <linux/swap.h>
|
#include <linux/swap.h>
|
||||||
#include <linux/vmstat.h>
|
#include <linux/vmstat.h>
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
|
#include <linux/vmalloc.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
|
@ -1,60 +0,0 @@
|
||||||
/* 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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -158,4 +158,22 @@ pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms)
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct vmalloc_info {
|
||||||
|
unsigned long used;
|
||||||
|
unsigned long largest_chunk;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_MMU
|
||||||
|
#define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START)
|
||||||
|
extern void get_vmalloc_info(struct vmalloc_info *vmi);
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define VMALLOC_TOTAL 0UL
|
||||||
|
#define get_vmalloc_info(vmi) \
|
||||||
|
do { \
|
||||||
|
(vmi)->used = 0; \
|
||||||
|
(vmi)->largest_chunk = 0; \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _LINUX_VMALLOC_H */
|
#endif /* _LINUX_VMALLOC_H */
|
||||||
|
|
44
mm/vmalloc.c
44
mm/vmalloc.c
|
@ -2645,5 +2645,49 @@ static int __init proc_vmalloc_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
module_init(proc_vmalloc_init);
|
module_init(proc_vmalloc_init);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue