aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc
diff options
context:
space:
mode:
Diffstat (limited to 'fs/proc')
-rw-r--r--fs/proc/Kconfig4
-rw-r--r--fs/proc/array.c2
-rw-r--r--fs/proc/consoles.c10
-rw-r--r--fs/proc/inode.c20
-rw-r--r--fs/proc/kcore.c3
-rw-r--r--fs/proc/meminfo.c7
-rw-r--r--fs/proc/nommu.c12
-rw-r--r--fs/proc/proc_devtree.c3
-rw-r--r--fs/proc/self.c10
-rw-r--r--fs/proc/task_mmu.c57
-rw-r--r--fs/proc/task_nommu.c19
11 files changed, 66 insertions, 81 deletions
diff --git a/fs/proc/Kconfig b/fs/proc/Kconfig
index 15af6222f8a4..2183fcf41d59 100644
--- a/fs/proc/Kconfig
+++ b/fs/proc/Kconfig
@@ -31,6 +31,10 @@ config PROC_FS
31config PROC_KCORE 31config PROC_KCORE
32 bool "/proc/kcore support" if !ARM 32 bool "/proc/kcore support" if !ARM
33 depends on PROC_FS && MMU 33 depends on PROC_FS && MMU
34 help
35 Provides a virtual ELF core file of the live kernel. This can
36 be read with gdb and other ELF tools. No modifications can be
37 made using this mechanism.
34 38
35config PROC_VMCORE 39config PROC_VMCORE
36 bool "/proc/vmcore support" 40 bool "/proc/vmcore support"
diff --git a/fs/proc/array.c b/fs/proc/array.c
index cbd0f1b324b9..1bd2077187fd 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -183,6 +183,7 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns,
183 seq_printf(m, 183 seq_printf(m,
184 "State:\t%s\n" 184 "State:\t%s\n"
185 "Tgid:\t%d\n" 185 "Tgid:\t%d\n"
186 "Ngid:\t%d\n"
186 "Pid:\t%d\n" 187 "Pid:\t%d\n"
187 "PPid:\t%d\n" 188 "PPid:\t%d\n"
188 "TracerPid:\t%d\n" 189 "TracerPid:\t%d\n"
@@ -190,6 +191,7 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns,
190 "Gid:\t%d\t%d\t%d\t%d\n", 191 "Gid:\t%d\t%d\t%d\t%d\n",
191 get_task_state(p), 192 get_task_state(p),
192 task_tgid_nr_ns(p, ns), 193 task_tgid_nr_ns(p, ns),
194 task_numa_group_id(p),
193 pid_nr_ns(pid, ns), 195 pid_nr_ns(pid, ns),
194 ppid, tpid, 196 ppid, tpid,
195 from_kuid_munged(user_ns, cred->uid), 197 from_kuid_munged(user_ns, cred->uid),
diff --git a/fs/proc/consoles.c b/fs/proc/consoles.c
index b701eaa482bf..51942d5abcec 100644
--- a/fs/proc/consoles.c
+++ b/fs/proc/consoles.c
@@ -29,7 +29,6 @@ static int show_console_dev(struct seq_file *m, void *v)
29 char flags[ARRAY_SIZE(con_flags) + 1]; 29 char flags[ARRAY_SIZE(con_flags) + 1];
30 struct console *con = v; 30 struct console *con = v;
31 unsigned int a; 31 unsigned int a;
32 int len;
33 dev_t dev = 0; 32 dev_t dev = 0;
34 33
35 if (con->device) { 34 if (con->device) {
@@ -47,11 +46,10 @@ static int show_console_dev(struct seq_file *m, void *v)
47 con_flags[a].name : ' '; 46 con_flags[a].name : ' ';
48 flags[a] = 0; 47 flags[a] = 0;
49 48
50 seq_printf(m, "%s%d%n", con->name, con->index, &len); 49 seq_setwidth(m, 21 - 1);
51 len = 21 - len; 50 seq_printf(m, "%s%d", con->name, con->index);
52 if (len < 1) 51 seq_pad(m, ' ');
53 len = 1; 52 seq_printf(m, "%c%c%c (%s)", con->read ? 'R' : '-',
54 seq_printf(m, "%*c%c%c%c (%s)", len, ' ', con->read ? 'R' : '-',
55 con->write ? 'W' : '-', con->unblank ? 'U' : '-', 53 con->write ? 'W' : '-', con->unblank ? 'U' : '-',
56 flags); 54 flags);
57 if (dev) 55 if (dev)
diff --git a/fs/proc/inode.c b/fs/proc/inode.c
index 9f8ef9b7674d..28955d4b7218 100644
--- a/fs/proc/inode.c
+++ b/fs/proc/inode.c
@@ -285,15 +285,23 @@ static int proc_reg_mmap(struct file *file, struct vm_area_struct *vma)
285 return rv; 285 return rv;
286} 286}
287 287
288static unsigned long proc_reg_get_unmapped_area(struct file *file, unsigned long orig_addr, unsigned long len, unsigned long pgoff, unsigned long flags) 288static unsigned long
289proc_reg_get_unmapped_area(struct file *file, unsigned long orig_addr,
290 unsigned long len, unsigned long pgoff,
291 unsigned long flags)
289{ 292{
290 struct proc_dir_entry *pde = PDE(file_inode(file)); 293 struct proc_dir_entry *pde = PDE(file_inode(file));
291 int rv = -EIO; 294 unsigned long rv = -EIO;
292 unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); 295 unsigned long (*get_area)(struct file *, unsigned long, unsigned long,
296 unsigned long, unsigned long) = NULL;
293 if (use_pde(pde)) { 297 if (use_pde(pde)) {
294 get_unmapped_area = pde->proc_fops->get_unmapped_area; 298#ifdef CONFIG_MMU
295 if (get_unmapped_area) 299 get_area = current->mm->get_unmapped_area;
296 rv = get_unmapped_area(file, orig_addr, len, pgoff, flags); 300#endif
301 if (pde->proc_fops->get_unmapped_area)
302 get_area = pde->proc_fops->get_unmapped_area;
303 if (get_area)
304 rv = get_area(file, orig_addr, len, pgoff, flags);
297 unuse_pde(pde); 305 unuse_pde(pde);
298 } 306 }
299 return rv; 307 return rv;
diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c
index 06ea155e1a59..5ed0e52d6aa0 100644
--- a/fs/proc/kcore.c
+++ b/fs/proc/kcore.c
@@ -255,8 +255,7 @@ static int kcore_update_ram(void)
255 end_pfn = 0; 255 end_pfn = 0;
256 for_each_node_state(nid, N_MEMORY) { 256 for_each_node_state(nid, N_MEMORY) {
257 unsigned long node_end; 257 unsigned long node_end;
258 node_end = NODE_DATA(nid)->node_start_pfn + 258 node_end = node_end_pfn(nid);
259 NODE_DATA(nid)->node_spanned_pages;
260 if (end_pfn < node_end) 259 if (end_pfn < node_end)
261 end_pfn = node_end; 260 end_pfn = node_end;
262 } 261 }
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
index 59d85d608898..a77d2b299199 100644
--- a/fs/proc/meminfo.c
+++ b/fs/proc/meminfo.c
@@ -1,8 +1,8 @@
1#include <linux/fs.h> 1#include <linux/fs.h>
2#include <linux/hugetlb.h>
3#include <linux/init.h> 2#include <linux/init.h>
4#include <linux/kernel.h> 3#include <linux/kernel.h>
5#include <linux/mm.h> 4#include <linux/mm.h>
5#include <linux/hugetlb.h>
6#include <linux/mman.h> 6#include <linux/mman.h>
7#include <linux/mmzone.h> 7#include <linux/mmzone.h>
8#include <linux/proc_fs.h> 8#include <linux/proc_fs.h>
@@ -24,7 +24,6 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
24{ 24{
25 struct sysinfo i; 25 struct sysinfo i;
26 unsigned long committed; 26 unsigned long committed;
27 unsigned long allowed;
28 struct vmalloc_info vmi; 27 struct vmalloc_info vmi;
29 long cached; 28 long cached;
30 unsigned long pages[NR_LRU_LISTS]; 29 unsigned long pages[NR_LRU_LISTS];
@@ -37,8 +36,6 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
37 si_meminfo(&i); 36 si_meminfo(&i);
38 si_swapinfo(&i); 37 si_swapinfo(&i);
39 committed = percpu_counter_read_positive(&vm_committed_as); 38 committed = percpu_counter_read_positive(&vm_committed_as);
40 allowed = ((totalram_pages - hugetlb_total_pages())
41 * sysctl_overcommit_ratio / 100) + total_swap_pages;
42 39
43 cached = global_page_state(NR_FILE_PAGES) - 40 cached = global_page_state(NR_FILE_PAGES) -
44 total_swapcache_pages() - i.bufferram; 41 total_swapcache_pages() - i.bufferram;
@@ -147,7 +144,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
147 K(global_page_state(NR_UNSTABLE_NFS)), 144 K(global_page_state(NR_UNSTABLE_NFS)),
148 K(global_page_state(NR_BOUNCE)), 145 K(global_page_state(NR_BOUNCE)),
149 K(global_page_state(NR_WRITEBACK_TEMP)), 146 K(global_page_state(NR_WRITEBACK_TEMP)),
150 K(allowed), 147 K(vm_commit_limit()),
151 K(committed), 148 K(committed),
152 (unsigned long)VMALLOC_TOTAL >> 10, 149 (unsigned long)VMALLOC_TOTAL >> 10,
153 vmi.used >> 10, 150 vmi.used >> 10,
diff --git a/fs/proc/nommu.c b/fs/proc/nommu.c
index ccfd99bd1c5a..5f9bc8a746c9 100644
--- a/fs/proc/nommu.c
+++ b/fs/proc/nommu.c
@@ -39,7 +39,7 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region)
39 unsigned long ino = 0; 39 unsigned long ino = 0;
40 struct file *file; 40 struct file *file;
41 dev_t dev = 0; 41 dev_t dev = 0;
42 int flags, len; 42 int flags;
43 43
44 flags = region->vm_flags; 44 flags = region->vm_flags;
45 file = region->vm_file; 45 file = region->vm_file;
@@ -50,8 +50,9 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region)
50 ino = inode->i_ino; 50 ino = inode->i_ino;
51 } 51 }
52 52
53 seq_setwidth(m, 25 + sizeof(void *) * 6 - 1);
53 seq_printf(m, 54 seq_printf(m,
54 "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n", 55 "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu ",
55 region->vm_start, 56 region->vm_start,
56 region->vm_end, 57 region->vm_end,
57 flags & VM_READ ? 'r' : '-', 58 flags & VM_READ ? 'r' : '-',
@@ -59,13 +60,10 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region)
59 flags & VM_EXEC ? 'x' : '-', 60 flags & VM_EXEC ? 'x' : '-',
60 flags & VM_MAYSHARE ? flags & VM_SHARED ? 'S' : 's' : 'p', 61 flags & VM_MAYSHARE ? flags & VM_SHARED ? 'S' : 's' : 'p',
61 ((loff_t)region->vm_pgoff) << PAGE_SHIFT, 62 ((loff_t)region->vm_pgoff) << PAGE_SHIFT,
62 MAJOR(dev), MINOR(dev), ino, &len); 63 MAJOR(dev), MINOR(dev), ino);
63 64
64 if (file) { 65 if (file) {
65 len = 25 + sizeof(void *) * 6 - len; 66 seq_pad(m, ' ');
66 if (len < 1)
67 len = 1;
68 seq_printf(m, "%*c", len, ' ');
69 seq_path(m, &file->f_path, ""); 67 seq_path(m, &file->f_path, "");
70 } 68 }
71 69
diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c
index 106a83570630..70779b2fc209 100644
--- a/fs/proc/proc_devtree.c
+++ b/fs/proc/proc_devtree.c
@@ -14,16 +14,13 @@
14#include <linux/of.h> 14#include <linux/of.h>
15#include <linux/export.h> 15#include <linux/export.h>
16#include <linux/slab.h> 16#include <linux/slab.h>
17#include <asm/prom.h>
18#include <asm/uaccess.h> 17#include <asm/uaccess.h>
19#include "internal.h" 18#include "internal.h"
20 19
21static inline void set_node_proc_entry(struct device_node *np, 20static inline void set_node_proc_entry(struct device_node *np,
22 struct proc_dir_entry *de) 21 struct proc_dir_entry *de)
23{ 22{
24#ifdef HAVE_ARCH_DEVTREE_FIXUPS
25 np->pde = de; 23 np->pde = de;
26#endif
27} 24}
28 25
29static struct proc_dir_entry *proc_device_tree; 26static struct proc_dir_entry *proc_device_tree;
diff --git a/fs/proc/self.c b/fs/proc/self.c
index 6b6a993b5c25..ffeb202ec942 100644
--- a/fs/proc/self.c
+++ b/fs/proc/self.c
@@ -36,18 +36,10 @@ static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
36 return NULL; 36 return NULL;
37} 37}
38 38
39static void proc_self_put_link(struct dentry *dentry, struct nameidata *nd,
40 void *cookie)
41{
42 char *s = nd_get_link(nd);
43 if (!IS_ERR(s))
44 kfree(s);
45}
46
47static const struct inode_operations proc_self_inode_operations = { 39static const struct inode_operations proc_self_inode_operations = {
48 .readlink = proc_self_readlink, 40 .readlink = proc_self_readlink,
49 .follow_link = proc_self_follow_link, 41 .follow_link = proc_self_follow_link,
50 .put_link = proc_self_put_link, 42 .put_link = kfree_put_link,
51}; 43};
52 44
53static unsigned self_inum; 45static unsigned self_inum;
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 7366e9d63cee..fb52b548080d 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -62,7 +62,8 @@ void task_mem(struct seq_file *m, struct mm_struct *mm)
62 total_rss << (PAGE_SHIFT-10), 62 total_rss << (PAGE_SHIFT-10),
63 data << (PAGE_SHIFT-10), 63 data << (PAGE_SHIFT-10),
64 mm->stack_vm << (PAGE_SHIFT-10), text, lib, 64 mm->stack_vm << (PAGE_SHIFT-10), text, lib,
65 (PTRS_PER_PTE*sizeof(pte_t)*mm->nr_ptes) >> 10, 65 (PTRS_PER_PTE * sizeof(pte_t) *
66 atomic_long_read(&mm->nr_ptes)) >> 10,
66 swap << (PAGE_SHIFT-10)); 67 swap << (PAGE_SHIFT-10));
67} 68}
68 69
@@ -83,14 +84,6 @@ unsigned long task_statm(struct mm_struct *mm,
83 return mm->total_vm; 84 return mm->total_vm;
84} 85}
85 86
86static void pad_len_spaces(struct seq_file *m, int len)
87{
88 len = 25 + sizeof(void*) * 6 - len;
89 if (len < 1)
90 len = 1;
91 seq_printf(m, "%*c", len, ' ');
92}
93
94#ifdef CONFIG_NUMA 87#ifdef CONFIG_NUMA
95/* 88/*
96 * These functions are for numa_maps but called in generic **maps seq_file 89 * These functions are for numa_maps but called in generic **maps seq_file
@@ -268,7 +261,6 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
268 unsigned long long pgoff = 0; 261 unsigned long long pgoff = 0;
269 unsigned long start, end; 262 unsigned long start, end;
270 dev_t dev = 0; 263 dev_t dev = 0;
271 int len;
272 const char *name = NULL; 264 const char *name = NULL;
273 265
274 if (file) { 266 if (file) {
@@ -286,7 +278,8 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
286 if (stack_guard_page_end(vma, end)) 278 if (stack_guard_page_end(vma, end))
287 end -= PAGE_SIZE; 279 end -= PAGE_SIZE;
288 280
289 seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n", 281 seq_setwidth(m, 25 + sizeof(void *) * 6 - 1);
282 seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu ",
290 start, 283 start,
291 end, 284 end,
292 flags & VM_READ ? 'r' : '-', 285 flags & VM_READ ? 'r' : '-',
@@ -294,14 +287,14 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
294 flags & VM_EXEC ? 'x' : '-', 287 flags & VM_EXEC ? 'x' : '-',
295 flags & VM_MAYSHARE ? 's' : 'p', 288 flags & VM_MAYSHARE ? 's' : 'p',
296 pgoff, 289 pgoff,
297 MAJOR(dev), MINOR(dev), ino, &len); 290 MAJOR(dev), MINOR(dev), ino);
298 291
299 /* 292 /*
300 * Print the dentry name for named mappings, and a 293 * Print the dentry name for named mappings, and a
301 * special [heap] marker for the heap: 294 * special [heap] marker for the heap:
302 */ 295 */
303 if (file) { 296 if (file) {
304 pad_len_spaces(m, len); 297 seq_pad(m, ' ');
305 seq_path(m, &file->f_path, "\n"); 298 seq_path(m, &file->f_path, "\n");
306 goto done; 299 goto done;
307 } 300 }
@@ -333,7 +326,7 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
333 name = "[stack]"; 326 name = "[stack]";
334 } else { 327 } else {
335 /* Thread stack in /proc/PID/maps */ 328 /* Thread stack in /proc/PID/maps */
336 pad_len_spaces(m, len); 329 seq_pad(m, ' ');
337 seq_printf(m, "[stack:%d]", tid); 330 seq_printf(m, "[stack:%d]", tid);
338 } 331 }
339 } 332 }
@@ -341,7 +334,7 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
341 334
342done: 335done:
343 if (name) { 336 if (name) {
344 pad_len_spaces(m, len); 337 seq_pad(m, ' ');
345 seq_puts(m, name); 338 seq_puts(m, name);
346 } 339 }
347 seq_putc(m, '\n'); 340 seq_putc(m, '\n');
@@ -505,9 +498,9 @@ static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
505 pte_t *pte; 498 pte_t *pte;
506 spinlock_t *ptl; 499 spinlock_t *ptl;
507 500
508 if (pmd_trans_huge_lock(pmd, vma) == 1) { 501 if (pmd_trans_huge_lock(pmd, vma, &ptl) == 1) {
509 smaps_pte_entry(*(pte_t *)pmd, addr, HPAGE_PMD_SIZE, walk); 502 smaps_pte_entry(*(pte_t *)pmd, addr, HPAGE_PMD_SIZE, walk);
510 spin_unlock(&walk->mm->page_table_lock); 503 spin_unlock(ptl);
511 mss->anonymous_thp += HPAGE_PMD_SIZE; 504 mss->anonymous_thp += HPAGE_PMD_SIZE;
512 return 0; 505 return 0;
513 } 506 }
@@ -561,6 +554,9 @@ static void show_smap_vma_flags(struct seq_file *m, struct vm_area_struct *vma)
561 [ilog2(VM_NONLINEAR)] = "nl", 554 [ilog2(VM_NONLINEAR)] = "nl",
562 [ilog2(VM_ARCH_1)] = "ar", 555 [ilog2(VM_ARCH_1)] = "ar",
563 [ilog2(VM_DONTDUMP)] = "dd", 556 [ilog2(VM_DONTDUMP)] = "dd",
557#ifdef CONFIG_MEM_SOFT_DIRTY
558 [ilog2(VM_SOFTDIRTY)] = "sd",
559#endif
564 [ilog2(VM_MIXEDMAP)] = "mm", 560 [ilog2(VM_MIXEDMAP)] = "mm",
565 [ilog2(VM_HUGEPAGE)] = "hg", 561 [ilog2(VM_HUGEPAGE)] = "hg",
566 [ilog2(VM_NOHUGEPAGE)] = "nh", 562 [ilog2(VM_NOHUGEPAGE)] = "nh",
@@ -941,6 +937,8 @@ static void pte_to_pagemap_entry(pagemap_entry_t *pme, struct pagemapread *pm,
941 frame = pte_pfn(pte); 937 frame = pte_pfn(pte);
942 flags = PM_PRESENT; 938 flags = PM_PRESENT;
943 page = vm_normal_page(vma, addr, pte); 939 page = vm_normal_page(vma, addr, pte);
940 if (pte_soft_dirty(pte))
941 flags2 |= __PM_SOFT_DIRTY;
944 } else if (is_swap_pte(pte)) { 942 } else if (is_swap_pte(pte)) {
945 swp_entry_t entry; 943 swp_entry_t entry;
946 if (pte_swp_soft_dirty(pte)) 944 if (pte_swp_soft_dirty(pte))
@@ -960,7 +958,7 @@ static void pte_to_pagemap_entry(pagemap_entry_t *pme, struct pagemapread *pm,
960 958
961 if (page && !PageAnon(page)) 959 if (page && !PageAnon(page))
962 flags |= PM_FILE; 960 flags |= PM_FILE;
963 if ((vma->vm_flags & VM_SOFTDIRTY) || pte_soft_dirty(pte)) 961 if ((vma->vm_flags & VM_SOFTDIRTY))
964 flags2 |= __PM_SOFT_DIRTY; 962 flags2 |= __PM_SOFT_DIRTY;
965 963
966 *pme = make_pme(PM_PFRAME(frame) | PM_STATUS2(pm->v2, flags2) | flags); 964 *pme = make_pme(PM_PFRAME(frame) | PM_STATUS2(pm->v2, flags2) | flags);
@@ -993,13 +991,14 @@ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
993{ 991{
994 struct vm_area_struct *vma; 992 struct vm_area_struct *vma;
995 struct pagemapread *pm = walk->private; 993 struct pagemapread *pm = walk->private;
994 spinlock_t *ptl;
996 pte_t *pte; 995 pte_t *pte;
997 int err = 0; 996 int err = 0;
998 pagemap_entry_t pme = make_pme(PM_NOT_PRESENT(pm->v2)); 997 pagemap_entry_t pme = make_pme(PM_NOT_PRESENT(pm->v2));
999 998
1000 /* find the first VMA at or above 'addr' */ 999 /* find the first VMA at or above 'addr' */
1001 vma = find_vma(walk->mm, addr); 1000 vma = find_vma(walk->mm, addr);
1002 if (vma && pmd_trans_huge_lock(pmd, vma) == 1) { 1001 if (vma && pmd_trans_huge_lock(pmd, vma, &ptl) == 1) {
1003 int pmd_flags2; 1002 int pmd_flags2;
1004 1003
1005 if ((vma->vm_flags & VM_SOFTDIRTY) || pmd_soft_dirty(*pmd)) 1004 if ((vma->vm_flags & VM_SOFTDIRTY) || pmd_soft_dirty(*pmd))
@@ -1017,7 +1016,7 @@ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
1017 if (err) 1016 if (err)
1018 break; 1017 break;
1019 } 1018 }
1020 spin_unlock(&walk->mm->page_table_lock); 1019 spin_unlock(ptl);
1021 return err; 1020 return err;
1022 } 1021 }
1023 1022
@@ -1319,7 +1318,7 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr,
1319 1318
1320 md = walk->private; 1319 md = walk->private;
1321 1320
1322 if (pmd_trans_huge_lock(pmd, md->vma) == 1) { 1321 if (pmd_trans_huge_lock(pmd, md->vma, &ptl) == 1) {
1323 pte_t huge_pte = *(pte_t *)pmd; 1322 pte_t huge_pte = *(pte_t *)pmd;
1324 struct page *page; 1323 struct page *page;
1325 1324
@@ -1327,7 +1326,7 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr,
1327 if (page) 1326 if (page)
1328 gather_stats(page, md, pte_dirty(huge_pte), 1327 gather_stats(page, md, pte_dirty(huge_pte),
1329 HPAGE_PMD_SIZE/PAGE_SIZE); 1328 HPAGE_PMD_SIZE/PAGE_SIZE);
1330 spin_unlock(&walk->mm->page_table_lock); 1329 spin_unlock(ptl);
1331 return 0; 1330 return 0;
1332 } 1331 }
1333 1332
@@ -1385,8 +1384,8 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid)
1385 struct mm_struct *mm = vma->vm_mm; 1384 struct mm_struct *mm = vma->vm_mm;
1386 struct mm_walk walk = {}; 1385 struct mm_walk walk = {};
1387 struct mempolicy *pol; 1386 struct mempolicy *pol;
1388 int n; 1387 char buffer[64];
1389 char buffer[50]; 1388 int nid;
1390 1389
1391 if (!mm) 1390 if (!mm)
1392 return 0; 1391 return 0;
@@ -1402,10 +1401,8 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid)
1402 walk.mm = mm; 1401 walk.mm = mm;
1403 1402
1404 pol = get_vma_policy(task, vma, vma->vm_start); 1403 pol = get_vma_policy(task, vma, vma->vm_start);
1405 n = mpol_to_str(buffer, sizeof(buffer), pol); 1404 mpol_to_str(buffer, sizeof(buffer), pol);
1406 mpol_cond_put(pol); 1405 mpol_cond_put(pol);
1407 if (n < 0)
1408 return n;
1409 1406
1410 seq_printf(m, "%08lx %s", vma->vm_start, buffer); 1407 seq_printf(m, "%08lx %s", vma->vm_start, buffer);
1411 1408
@@ -1458,9 +1455,9 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid)
1458 if (md->writeback) 1455 if (md->writeback)
1459 seq_printf(m, " writeback=%lu", md->writeback); 1456 seq_printf(m, " writeback=%lu", md->writeback);
1460 1457
1461 for_each_node_state(n, N_MEMORY) 1458 for_each_node_state(nid, N_MEMORY)
1462 if (md->node[n]) 1459 if (md->node[nid])
1463 seq_printf(m, " N%d=%lu", n, md->node[n]); 1460 seq_printf(m, " N%d=%lu", nid, md->node[nid]);
1464out: 1461out:
1465 seq_putc(m, '\n'); 1462 seq_putc(m, '\n');
1466 1463
diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c
index 56123a6f462e..678455d2d683 100644
--- a/fs/proc/task_nommu.c
+++ b/fs/proc/task_nommu.c
@@ -123,14 +123,6 @@ unsigned long task_statm(struct mm_struct *mm,
123 return size; 123 return size;
124} 124}
125 125
126static void pad_len_spaces(struct seq_file *m, int len)
127{
128 len = 25 + sizeof(void*) * 6 - len;
129 if (len < 1)
130 len = 1;
131 seq_printf(m, "%*c", len, ' ');
132}
133
134/* 126/*
135 * display a single VMA to a sequenced file 127 * display a single VMA to a sequenced file
136 */ 128 */
@@ -142,7 +134,7 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma,
142 unsigned long ino = 0; 134 unsigned long ino = 0;
143 struct file *file; 135 struct file *file;
144 dev_t dev = 0; 136 dev_t dev = 0;
145 int flags, len; 137 int flags;
146 unsigned long long pgoff = 0; 138 unsigned long long pgoff = 0;
147 139
148 flags = vma->vm_flags; 140 flags = vma->vm_flags;
@@ -155,8 +147,9 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma,
155 pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT; 147 pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT;
156 } 148 }
157 149
150 seq_setwidth(m, 25 + sizeof(void *) * 6 - 1);
158 seq_printf(m, 151 seq_printf(m,
159 "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n", 152 "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu ",
160 vma->vm_start, 153 vma->vm_start,
161 vma->vm_end, 154 vma->vm_end,
162 flags & VM_READ ? 'r' : '-', 155 flags & VM_READ ? 'r' : '-',
@@ -164,16 +157,16 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma,
164 flags & VM_EXEC ? 'x' : '-', 157 flags & VM_EXEC ? 'x' : '-',
165 flags & VM_MAYSHARE ? flags & VM_SHARED ? 'S' : 's' : 'p', 158 flags & VM_MAYSHARE ? flags & VM_SHARED ? 'S' : 's' : 'p',
166 pgoff, 159 pgoff,
167 MAJOR(dev), MINOR(dev), ino, &len); 160 MAJOR(dev), MINOR(dev), ino);
168 161
169 if (file) { 162 if (file) {
170 pad_len_spaces(m, len); 163 seq_pad(m, ' ');
171 seq_path(m, &file->f_path, ""); 164 seq_path(m, &file->f_path, "");
172 } else if (mm) { 165 } else if (mm) {
173 pid_t tid = vm_is_stack(priv->task, vma, is_pid); 166 pid_t tid = vm_is_stack(priv->task, vma, is_pid);
174 167
175 if (tid != 0) { 168 if (tid != 0) {
176 pad_len_spaces(m, len); 169 seq_pad(m, ' ');
177 /* 170 /*
178 * Thread stack in /proc/PID/task/TID/maps or 171 * Thread stack in /proc/PID/task/TID/maps or
179 * the main process stack. 172 * the main process stack.