diff options
author | Alexey Dobriyan <adobriyan@gmail.com> | 2011-01-12 20:00:32 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-13 11:03:16 -0500 |
commit | a2ade7b6ca37c808128810687cd56e8a44443e65 (patch) | |
tree | d7ffb1be14e69f4ba22ca425c21369d4dd3a3032 /fs/proc | |
parent | 34e49d4f635d6a800c4089c40fd254e12e451449 (diff) |
proc: use unsigned long inside /proc/*/statm
/proc/*/statm code needlessly truncates data from unsigned long to int.
One needs only 8+ TB of RAM to make truncation visible.
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Reviewed-by: WANG Cong <xiyou.wangcong@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/proc')
-rw-r--r-- | fs/proc/array.c | 6 | ||||
-rw-r--r-- | fs/proc/internal.h | 3 | ||||
-rw-r--r-- | fs/proc/task_mmu.c | 5 | ||||
-rw-r--r-- | fs/proc/task_nommu.c | 7 |
4 files changed, 12 insertions, 9 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c index fff6572676ae..842a6564f2ce 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -535,15 +535,15 @@ int proc_tgid_stat(struct seq_file *m, struct pid_namespace *ns, | |||
535 | int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, | 535 | int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, |
536 | struct pid *pid, struct task_struct *task) | 536 | struct pid *pid, struct task_struct *task) |
537 | { | 537 | { |
538 | int size = 0, resident = 0, shared = 0, text = 0, lib = 0, data = 0; | 538 | unsigned long size = 0, resident = 0, shared = 0, text = 0, data = 0; |
539 | struct mm_struct *mm = get_task_mm(task); | 539 | struct mm_struct *mm = get_task_mm(task); |
540 | 540 | ||
541 | if (mm) { | 541 | if (mm) { |
542 | size = task_statm(mm, &shared, &text, &data, &resident); | 542 | size = task_statm(mm, &shared, &text, &data, &resident); |
543 | mmput(mm); | 543 | mmput(mm); |
544 | } | 544 | } |
545 | seq_printf(m, "%d %d %d %d %d %d %d\n", | 545 | seq_printf(m, "%lu %lu %lu %lu 0 %lu 0\n", |
546 | size, resident, shared, text, lib, data, 0); | 546 | size, resident, shared, text, data); |
547 | 547 | ||
548 | return 0; | 548 | return 0; |
549 | } | 549 | } |
diff --git a/fs/proc/internal.h b/fs/proc/internal.h index 1f24a3eddd12..659ea6af379a 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h | |||
@@ -96,7 +96,8 @@ extern spinlock_t proc_subdir_lock; | |||
96 | struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *); | 96 | struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *); |
97 | int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir); | 97 | int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir); |
98 | unsigned long task_vsize(struct mm_struct *); | 98 | unsigned long task_vsize(struct mm_struct *); |
99 | int task_statm(struct mm_struct *, int *, int *, int *, int *); | 99 | unsigned long task_statm(struct mm_struct *, |
100 | unsigned long *, unsigned long *, unsigned long *, unsigned long *); | ||
100 | void task_mem(struct seq_file *, struct mm_struct *); | 101 | void task_mem(struct seq_file *, struct mm_struct *); |
101 | 102 | ||
102 | static inline struct proc_dir_entry *pde_get(struct proc_dir_entry *pde) | 103 | static inline struct proc_dir_entry *pde_get(struct proc_dir_entry *pde) |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index c126c83b9a45..c3755bd8dd3e 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -66,8 +66,9 @@ unsigned long task_vsize(struct mm_struct *mm) | |||
66 | return PAGE_SIZE * mm->total_vm; | 66 | return PAGE_SIZE * mm->total_vm; |
67 | } | 67 | } |
68 | 68 | ||
69 | int task_statm(struct mm_struct *mm, int *shared, int *text, | 69 | unsigned long task_statm(struct mm_struct *mm, |
70 | int *data, int *resident) | 70 | unsigned long *shared, unsigned long *text, |
71 | unsigned long *data, unsigned long *resident) | ||
71 | { | 72 | { |
72 | *shared = get_mm_counter(mm, MM_FILEPAGES); | 73 | *shared = get_mm_counter(mm, MM_FILEPAGES); |
73 | *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) | 74 | *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) |
diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c index cb6306e63843..b535d3e5d5f1 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c | |||
@@ -92,13 +92,14 @@ unsigned long task_vsize(struct mm_struct *mm) | |||
92 | return vsize; | 92 | return vsize; |
93 | } | 93 | } |
94 | 94 | ||
95 | int task_statm(struct mm_struct *mm, int *shared, int *text, | 95 | unsigned long task_statm(struct mm_struct *mm, |
96 | int *data, int *resident) | 96 | unsigned long *shared, unsigned long *text, |
97 | unsigned long *data, unsigned long *resident) | ||
97 | { | 98 | { |
98 | struct vm_area_struct *vma; | 99 | struct vm_area_struct *vma; |
99 | struct vm_region *region; | 100 | struct vm_region *region; |
100 | struct rb_node *p; | 101 | struct rb_node *p; |
101 | int size = kobjsize(mm); | 102 | unsigned long size = kobjsize(mm); |
102 | 103 | ||
103 | down_read(&mm->mmap_sem); | 104 | down_read(&mm->mmap_sem); |
104 | for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) { | 105 | for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) { |