diff options
Diffstat (limited to 'fs/proc')
-rw-r--r-- | fs/proc/Kconfig | 4 | ||||
-rw-r--r-- | fs/proc/array.c | 2 | ||||
-rw-r--r-- | fs/proc/consoles.c | 10 | ||||
-rw-r--r-- | fs/proc/inode.c | 20 | ||||
-rw-r--r-- | fs/proc/kcore.c | 3 | ||||
-rw-r--r-- | fs/proc/meminfo.c | 7 | ||||
-rw-r--r-- | fs/proc/nommu.c | 12 | ||||
-rw-r--r-- | fs/proc/proc_devtree.c | 3 | ||||
-rw-r--r-- | fs/proc/self.c | 10 | ||||
-rw-r--r-- | fs/proc/task_mmu.c | 57 | ||||
-rw-r--r-- | fs/proc/task_nommu.c | 19 |
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 | |||
31 | config PROC_KCORE | 31 | config 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 | ||
35 | config PROC_VMCORE | 39 | config 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 | ||
288 | static unsigned long proc_reg_get_unmapped_area(struct file *file, unsigned long orig_addr, unsigned long len, unsigned long pgoff, unsigned long flags) | 288 | static unsigned long |
289 | proc_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 | ||
21 | static inline void set_node_proc_entry(struct device_node *np, | 20 | static 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 | ||
29 | static struct proc_dir_entry *proc_device_tree; | 26 | static 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 | ||
39 | static 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 | |||
47 | static const struct inode_operations proc_self_inode_operations = { | 39 | static 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 | ||
53 | static unsigned self_inum; | 45 | static 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 | ||
86 | static 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 | ||
342 | done: | 335 | done: |
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]); |
1464 | out: | 1461 | out: |
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 | ||
126 | static 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. |