Merge branch 'stable-3.2' into pandora-3.2
[pandora-kernel.git] / fs / proc / task_mmu.c
1 #include <linux/mm.h>
2 #include <linux/hugetlb.h>
3 #include <linux/huge_mm.h>
4 #include <linux/mount.h>
5 #include <linux/seq_file.h>
6 #include <linux/highmem.h>
7 #include <linux/ptrace.h>
8 #include <linux/slab.h>
9 #include <linux/pagemap.h>
10 #include <linux/mempolicy.h>
11 #include <linux/rmap.h>
12 #include <linux/swap.h>
13 #include <linux/swapops.h>
14 #include <linux/security.h>
15
16 #include <asm/elf.h>
17 #include <asm/uaccess.h>
18 #include <asm/tlbflush.h>
19 #include "internal.h"
20
21 void task_mem(struct seq_file *m, struct mm_struct *mm)
22 {
23         unsigned long data, text, lib, swap;
24         unsigned long hiwater_vm, total_vm, hiwater_rss, total_rss;
25
26         /*
27          * Note: to minimize their overhead, mm maintains hiwater_vm and
28          * hiwater_rss only when about to *lower* total_vm or rss.  Any
29          * collector of these hiwater stats must therefore get total_vm
30          * and rss too, which will usually be the higher.  Barriers? not
31          * worth the effort, such snapshots can always be inconsistent.
32          */
33         hiwater_vm = total_vm = mm->total_vm;
34         if (hiwater_vm < mm->hiwater_vm)
35                 hiwater_vm = mm->hiwater_vm;
36         hiwater_rss = total_rss = get_mm_rss(mm);
37         if (hiwater_rss < mm->hiwater_rss)
38                 hiwater_rss = mm->hiwater_rss;
39
40         data = mm->total_vm - mm->shared_vm - mm->stack_vm;
41         text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) >> 10;
42         lib = (mm->exec_vm << (PAGE_SHIFT-10)) - text;
43         swap = get_mm_counter(mm, MM_SWAPENTS);
44         seq_printf(m,
45                 "VmPeak:\t%8lu kB\n"
46                 "VmSize:\t%8lu kB\n"
47                 "VmLck:\t%8lu kB\n"
48                 "VmPin:\t%8lu kB\n"
49                 "VmHWM:\t%8lu kB\n"
50                 "VmRSS:\t%8lu kB\n"
51                 "VmData:\t%8lu kB\n"
52                 "VmStk:\t%8lu kB\n"
53                 "VmExe:\t%8lu kB\n"
54                 "VmLib:\t%8lu kB\n"
55                 "VmPTE:\t%8lu kB\n"
56                 "VmSwap:\t%8lu kB\n",
57                 hiwater_vm << (PAGE_SHIFT-10),
58                 (total_vm - mm->reserved_vm) << (PAGE_SHIFT-10),
59                 mm->locked_vm << (PAGE_SHIFT-10),
60                 mm->pinned_vm << (PAGE_SHIFT-10),
61                 hiwater_rss << (PAGE_SHIFT-10),
62                 total_rss << (PAGE_SHIFT-10),
63                 data << (PAGE_SHIFT-10),
64                 mm->stack_vm << (PAGE_SHIFT-10), text, lib,
65                 (PTRS_PER_PTE*sizeof(pte_t)*mm->nr_ptes) >> 10,
66                 swap << (PAGE_SHIFT-10));
67 }
68
69 unsigned long task_vsize(struct mm_struct *mm)
70 {
71         return PAGE_SIZE * mm->total_vm;
72 }
73
74 unsigned long task_statm(struct mm_struct *mm,
75                          unsigned long *shared, unsigned long *text,
76                          unsigned long *data, unsigned long *resident)
77 {
78         *shared = get_mm_counter(mm, MM_FILEPAGES);
79         *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK))
80                                                                 >> PAGE_SHIFT;
81         *data = mm->total_vm - mm->shared_vm;
82         *resident = *shared + get_mm_counter(mm, MM_ANONPAGES);
83         return mm->total_vm;
84 }
85
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 static void vma_stop(struct proc_maps_private *priv, struct vm_area_struct *vma)
95 {
96         if (vma && vma != priv->tail_vma) {
97                 struct mm_struct *mm = vma->vm_mm;
98                 up_read(&mm->mmap_sem);
99                 mmput(mm);
100         }
101 }
102
103 static void *m_start(struct seq_file *m, loff_t *pos)
104 {
105         struct proc_maps_private *priv = m->private;
106         unsigned long last_addr = m->version;
107         struct mm_struct *mm;
108         struct vm_area_struct *vma, *tail_vma = NULL;
109         loff_t l = *pos;
110
111         /* Clear the per syscall fields in priv */
112         priv->task = NULL;
113         priv->tail_vma = NULL;
114
115         /*
116          * We remember last_addr rather than next_addr to hit with
117          * mmap_cache most of the time. We have zero last_addr at
118          * the beginning and also after lseek. We will have -1 last_addr
119          * after the end of the vmas.
120          */
121
122         if (last_addr == -1UL)
123                 return NULL;
124
125         priv->task = get_pid_task(priv->pid, PIDTYPE_PID);
126         if (!priv->task)
127                 return ERR_PTR(-ESRCH);
128
129         mm = mm_for_maps(priv->task);
130         if (!mm || IS_ERR(mm))
131                 return mm;
132         down_read(&mm->mmap_sem);
133
134         tail_vma = get_gate_vma(priv->task->mm);
135         priv->tail_vma = tail_vma;
136
137         /* Start with last addr hint */
138         vma = find_vma(mm, last_addr);
139         if (last_addr && vma) {
140                 vma = vma->vm_next;
141                 goto out;
142         }
143
144         /*
145          * Check the vma index is within the range and do
146          * sequential scan until m_index.
147          */
148         vma = NULL;
149         if ((unsigned long)l < mm->map_count) {
150                 vma = mm->mmap;
151                 while (l-- && vma)
152                         vma = vma->vm_next;
153                 goto out;
154         }
155
156         if (l != mm->map_count)
157                 tail_vma = NULL; /* After gate vma */
158
159 out:
160         if (vma)
161                 return vma;
162
163         /* End of vmas has been reached */
164         m->version = (tail_vma != NULL)? 0: -1UL;
165         up_read(&mm->mmap_sem);
166         mmput(mm);
167         return tail_vma;
168 }
169
170 static void *m_next(struct seq_file *m, void *v, loff_t *pos)
171 {
172         struct proc_maps_private *priv = m->private;
173         struct vm_area_struct *vma = v;
174         struct vm_area_struct *tail_vma = priv->tail_vma;
175
176         (*pos)++;
177         if (vma && (vma != tail_vma) && vma->vm_next)
178                 return vma->vm_next;
179         vma_stop(priv, vma);
180         return (vma != tail_vma)? tail_vma: NULL;
181 }
182
183 static void m_stop(struct seq_file *m, void *v)
184 {
185         struct proc_maps_private *priv = m->private;
186         struct vm_area_struct *vma = v;
187
188         if (!IS_ERR(vma))
189                 vma_stop(priv, vma);
190         if (priv->task)
191                 put_task_struct(priv->task);
192 }
193
194 static int do_maps_open(struct inode *inode, struct file *file,
195                         const struct seq_operations *ops)
196 {
197         struct proc_maps_private *priv;
198         int ret = -ENOMEM;
199         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
200         if (priv) {
201                 priv->pid = proc_pid(inode);
202                 ret = seq_open(file, ops);
203                 if (!ret) {
204                         struct seq_file *m = file->private_data;
205                         m->private = priv;
206                 } else {
207                         kfree(priv);
208                 }
209         }
210         return ret;
211 }
212
213 #ifdef __arm__
214 static void show_arm_map_vma(struct seq_file *m, struct vm_area_struct *vma)
215 {
216         static const char *cache_attrs4[4] = { "noC", "WB-WA", "WT-noWA", "WB-noWA" };
217         struct mm_struct *mm = vma->vm_mm;
218         struct file *file = vma->vm_file;
219         vm_flags_t flags = vma->vm_flags;
220         unsigned long start, end, end_b;
221         const char *name = NULL;
222         u32 *arm_pgd;
223         u32 *cpt, *cpt_e;
224         u32 desc1, desc2;
225         u32 tex_cb = 0;
226         u32 prrr, nmrr = 0;
227         u32 control = 0;
228         u32 xn = 1, ap = 0;
229         int desc_type;
230         int type;
231         char buf[64];
232         char rw[4];
233         int len;
234         int s;
235
236         if (mm == NULL)
237                 return;
238
239         if (!file) {
240                 name = arch_vma_name(vma);
241                 if (!name) {
242                         if (vma->vm_start <= mm->brk &&
243                                         vma->vm_end >= mm->start_brk) {
244                                 name = "[heap]";
245                         } else if (vma->vm_start <= mm->start_stack &&
246                                    vma->vm_end >= mm->start_stack) {
247                                 name = "[stack]";
248                         }
249                 }
250         }
251
252         arm_pgd = (u32 *)mm->pgd;
253
254         asm ("mrc p15, 0, %0, c1, c0, 0" : "=r"(control));
255         asm ("mrc p15, 0, %0, c10, c2, 0" : "=r"(prrr)); // primary region RR
256         asm ("mrc p15, 0, %0, c10, c2, 1" : "=r"(nmrr)); // normal memory RR
257
258         start = vma->vm_start;
259         end = vma->vm_end;
260
261         while (start < end) {
262                 desc_type = '-';
263
264                 desc1 = arm_pgd[start >> 20];
265
266                 end_b = (start & ~0xfffff) + 0x100000;
267                 for (; end_b < end; end_b += 0x100000)
268                         if ((arm_pgd[end_b >> 20] ^ desc1) & 0xfffff)
269                                 break;
270
271                 switch (desc1 & 3) {
272                 case 0:
273                         sprintf(buf, "l1_fault");
274                         goto do_output;
275                 case 1:
276                         break;
277                 case 2:
278                         tex_cb = ((desc1 >> 2) & 0x03) | ((desc1 >> 10) & 0x1c);
279                         s = (desc1 >> 16) & 1;
280                         xn = (desc1 >> 4) & 1;
281                         ap = ((desc1 >> 10) & 3) | ((desc1 >> 13) & 4);
282                         desc_type = (desc1 & (1 << 18)) ? 's' : 'h';
283                         goto do_tex_cb;
284                 case 3:
285                         sprintf(buf, "reserved");
286                         goto do_output;
287                 }
288
289                 cpt = __va(desc1 & 0xfffffc00);
290                 desc2 = cpt[(start >> 12) & 0xff];
291
292                 // find end
293                 cpt_e = cpt;
294                 for (end_b = start + 0x1000; end_b < end; end_b += 0x1000) {
295                         if ((end_b & 0x000ff000) == 0) {
296                                 cpt_e = __va(arm_pgd[end_b >> 20] & 0xfffffc00);
297                                 if ((arm_pgd[end_b >> 20] ^ desc1) & 0x3ff)
298                                         break;
299                         }
300
301                         // assume small pages
302                         if ((cpt_e[(end_b >> 12) & 0xff] ^ desc2) & 0xfff)
303                                 break;
304                 }
305
306                 switch (desc2 & 3) {
307                 case 0:
308                         sprintf(buf, "l2_fault");
309                         goto do_output;
310                 case 1:
311                         tex_cb = ((desc2 >> 2) & 0x03) | ((desc2 >> 10) & 0x1c);
312                         s = (desc2 >> 10) & 1;
313                         xn = (desc2 >> 15) & 1;
314                         ap = ((desc2 >> 4) & 3) | ((desc2 >> 7) & 4);
315                         break;
316                 case 2:
317                 case 3:
318                         tex_cb = ((desc2 >> 2) & 0x03) | ((desc2 >> 4) & 0x1c);
319                         s = (desc2 >> 10) & 1;
320                         xn = desc2 & 1;
321                         ap = ((desc2 >> 4) & 3) | ((desc2 >> 7) & 4);
322                         break;
323                 }
324
325 do_tex_cb:
326                 if (control & (1 << 28)) { // TEX remap
327                         // S (shareable) bit remapping
328                         char s_normal[2] = { (prrr >> 18) & 1, (prrr >> 19) & 1 };
329                         char s_device[2] = { (prrr >> 16) & 1, (prrr >> 17) & 1 };
330
331                         buf[0] = 0;
332                         tex_cb &= 7;
333                         type = (prrr >> tex_cb * 2) & 3;
334                         switch (type) {
335                         case 0:
336                                 sprintf(buf, "strongly-ordered");
337                                 break;
338                         case 1:
339                                 sprintf(buf, "device");
340                                 s = s_device[s];
341                                 break;
342                         case 3:
343                                 sprintf(buf, "reserved/normal");
344                         case 2:
345                                 s = s_normal[s];
346                                 sprintf(buf + strlen(buf), "inner-%s-outer-%s",
347                                         cache_attrs4[(nmrr >> tex_cb * 2) & 3],
348                                         cache_attrs4[(nmrr >> (tex_cb * 2 + 16)) & 3]);
349                         }
350                 }
351                 else if (tex_cb & 0x10) { // TEX[2] set
352                         sprintf(buf, "inner-%s-outer-%s",
353                                 cache_attrs4[tex_cb & 3], cache_attrs4[(tex_cb >> 2) & 3]);
354                 }
355                 else {
356                         switch (tex_cb) {
357                         case 0x00: sprintf(buf, "strongly-ordered"); s = 1; break;
358                         case 0x01: sprintf(buf, "shareable-device"); s = 1; break;
359                         case 0x02: sprintf(buf, "inner-outer-WT-noWA"); break;
360                         case 0x03: sprintf(buf, "inner-outer-WB-noWA"); break;
361                         case 0x04: sprintf(buf, "inner-outer-non-cacheable"); break;
362                         case 0x06: sprintf(buf, "implementation-defined"); break;
363                         case 0x07: sprintf(buf, "inner-outer-WB-WA"); break;
364                         case 0x08: sprintf(buf, "non-shareable-device"); s = 0; break;
365                         default:   sprintf(buf, "reserved"); break;
366                         }
367                 }
368
369                 if (s)
370                         sprintf(buf + strlen(buf), "-shareable");
371
372 do_output:
373                 // use user permissions here
374                 if (control & (1 << 29)) // AFE
375                         sprintf(rw, "%c%c", (ap & 2) ? 'r' : '-',
376                                 ((ap & 2) && !(ap & 4)) ? 'w' : '-');
377                 else
378                         sprintf(rw, "%c%c", (ap & 2) ? 'r' : '-',
379                                 (ap == 3) ? 'w' : '-');
380
381                 seq_printf(m, "%08lx-%08lx %s%c%c%c %-28s %n",
382                                 start, end_b,
383                                 rw,
384                                 xn ? '-' : 'x',
385                                 flags & VM_MAYSHARE ? 's' : 'p',
386                                 desc_type,
387                                 buf, &len);
388
389                 if (file) {
390                         pad_len_spaces(m, len);
391                         seq_path(m, &file->f_path, "\n");
392                 } else if (name) {
393                         pad_len_spaces(m, len);
394                         seq_puts(m, name);
395                 }
396                 seq_putc(m, '\n');
397
398                 start = end_b;
399         }
400 }
401 #endif
402
403 static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
404 {
405         struct mm_struct *mm = vma->vm_mm;
406         struct file *file = vma->vm_file;
407         vm_flags_t flags = vma->vm_flags;
408         unsigned long ino = 0;
409         unsigned long long pgoff = 0;
410         unsigned long start, end;
411         dev_t dev = 0;
412         int len;
413
414         if (file) {
415                 struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
416                 dev = inode->i_sb->s_dev;
417                 ino = inode->i_ino;
418                 pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT;
419         }
420
421         /* We don't show the stack guard page in /proc/maps */
422         start = vma->vm_start;
423         if (stack_guard_page_start(vma, start))
424                 start += PAGE_SIZE;
425         end = vma->vm_end;
426         if (stack_guard_page_end(vma, end))
427                 end -= PAGE_SIZE;
428
429         seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n",
430                         start,
431                         end,
432                         flags & VM_READ ? 'r' : '-',
433                         flags & VM_WRITE ? 'w' : '-',
434                         flags & VM_EXEC ? 'x' : '-',
435                         flags & VM_MAYSHARE ? 's' : 'p',
436                         pgoff,
437                         MAJOR(dev), MINOR(dev), ino, &len);
438
439         /*
440          * Print the dentry name for named mappings, and a
441          * special [heap] marker for the heap:
442          */
443         if (file) {
444                 pad_len_spaces(m, len);
445                 seq_path(m, &file->f_path, "\n");
446         } else {
447                 const char *name = arch_vma_name(vma);
448                 if (!name) {
449                         if (mm) {
450                                 if (vma->vm_start <= mm->brk &&
451                                                 vma->vm_end >= mm->start_brk) {
452                                         name = "[heap]";
453                                 } else if (vma->vm_start <= mm->start_stack &&
454                                            vma->vm_end >= mm->start_stack) {
455                                         name = "[stack]";
456                                 }
457                         } else {
458                                 name = "[vdso]";
459                         }
460                 }
461                 if (name) {
462                         pad_len_spaces(m, len);
463                         seq_puts(m, name);
464                 }
465         }
466         seq_putc(m, '\n');
467 }
468
469 static int show_map(struct seq_file *m, void *v)
470 {
471         struct vm_area_struct *vma = v;
472         struct proc_maps_private *priv = m->private;
473         struct task_struct *task = priv->task;
474
475         show_map_vma(m, vma);
476
477         if (m->count < m->size)  /* vma is copied successfully */
478                 m->version = (vma != get_gate_vma(task->mm))
479                         ? vma->vm_start : 0;
480         return 0;
481 }
482
483 static const struct seq_operations proc_pid_maps_op = {
484         .start  = m_start,
485         .next   = m_next,
486         .stop   = m_stop,
487         .show   = show_map
488 };
489
490 static int maps_open(struct inode *inode, struct file *file)
491 {
492         return do_maps_open(inode, file, &proc_pid_maps_op);
493 }
494
495 const struct file_operations proc_maps_operations = {
496         .open           = maps_open,
497         .read           = seq_read,
498         .llseek         = seq_lseek,
499         .release        = seq_release_private,
500 };
501
502 #ifdef __arm__
503 static int show_armv7_map(struct seq_file *m, void *v)
504 {
505         struct vm_area_struct *vma = v;
506         struct proc_maps_private *priv = m->private;
507         struct task_struct *task = priv->task;
508
509         show_arm_map_vma(m, vma);
510
511         if (m->count < m->size)  /* vma is copied successfully */
512                 m->version = (vma != get_gate_vma(task->mm))
513                         ? vma->vm_start : 0;
514         return 0;
515 }
516
517 static const struct seq_operations proc_pid_armv7_maps_op = {
518         .start  = m_start,
519         .next   = m_next,
520         .stop   = m_stop,
521         .show   = show_armv7_map
522 };
523 #endif
524
525 static int armv7_maps_open(struct inode *inode, struct file *file)
526 {
527         return do_maps_open(inode, file, &proc_pid_armv7_maps_op);
528 }
529
530 const struct file_operations proc_armv7_maps_operations = {
531         .open           = armv7_maps_open,
532         .read           = seq_read,
533         .llseek         = seq_lseek,
534         .release        = seq_release_private,
535 };
536
537 /*
538  * Proportional Set Size(PSS): my share of RSS.
539  *
540  * PSS of a process is the count of pages it has in memory, where each
541  * page is divided by the number of processes sharing it.  So if a
542  * process has 1000 pages all to itself, and 1000 shared with one other
543  * process, its PSS will be 1500.
544  *
545  * To keep (accumulated) division errors low, we adopt a 64bit
546  * fixed-point pss counter to minimize division errors. So (pss >>
547  * PSS_SHIFT) would be the real byte count.
548  *
549  * A shift of 12 before division means (assuming 4K page size):
550  *      - 1M 3-user-pages add up to 8KB errors;
551  *      - supports mapcount up to 2^24, or 16M;
552  *      - supports PSS up to 2^52 bytes, or 4PB.
553  */
554 #define PSS_SHIFT 12
555
556 #ifdef CONFIG_PROC_PAGE_MONITOR
557 struct mem_size_stats {
558         struct vm_area_struct *vma;
559         unsigned long resident;
560         unsigned long shared_clean;
561         unsigned long shared_dirty;
562         unsigned long private_clean;
563         unsigned long private_dirty;
564         unsigned long referenced;
565         unsigned long anonymous;
566         unsigned long anonymous_thp;
567         unsigned long swap;
568         u64 pss;
569 };
570
571
572 static void smaps_pte_entry(pte_t ptent, unsigned long addr,
573                 unsigned long ptent_size, struct mm_walk *walk)
574 {
575         struct mem_size_stats *mss = walk->private;
576         struct vm_area_struct *vma = mss->vma;
577         struct page *page;
578         int mapcount;
579
580         if (is_swap_pte(ptent)) {
581                 mss->swap += ptent_size;
582                 return;
583         }
584
585         if (!pte_present(ptent))
586                 return;
587
588         page = vm_normal_page(vma, addr, ptent);
589         if (!page)
590                 return;
591
592         if (PageAnon(page))
593                 mss->anonymous += ptent_size;
594
595         mss->resident += ptent_size;
596         /* Accumulate the size in pages that have been accessed. */
597         if (pte_young(ptent) || PageReferenced(page))
598                 mss->referenced += ptent_size;
599         mapcount = page_mapcount(page);
600         if (mapcount >= 2) {
601                 if (pte_dirty(ptent) || PageDirty(page))
602                         mss->shared_dirty += ptent_size;
603                 else
604                         mss->shared_clean += ptent_size;
605                 mss->pss += (ptent_size << PSS_SHIFT) / mapcount;
606         } else {
607                 if (pte_dirty(ptent) || PageDirty(page))
608                         mss->private_dirty += ptent_size;
609                 else
610                         mss->private_clean += ptent_size;
611                 mss->pss += (ptent_size << PSS_SHIFT);
612         }
613 }
614
615 static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
616                            struct mm_walk *walk)
617 {
618         struct mem_size_stats *mss = walk->private;
619         struct vm_area_struct *vma = mss->vma;
620         pte_t *pte;
621         spinlock_t *ptl;
622
623         spin_lock(&walk->mm->page_table_lock);
624         if (pmd_trans_huge(*pmd)) {
625                 if (pmd_trans_splitting(*pmd)) {
626                         spin_unlock(&walk->mm->page_table_lock);
627                         wait_split_huge_page(vma->anon_vma, pmd);
628                 } else {
629                         smaps_pte_entry(*(pte_t *)pmd, addr,
630                                         HPAGE_PMD_SIZE, walk);
631                         spin_unlock(&walk->mm->page_table_lock);
632                         mss->anonymous_thp += HPAGE_PMD_SIZE;
633                         return 0;
634                 }
635         } else {
636                 spin_unlock(&walk->mm->page_table_lock);
637         }
638
639         if (pmd_trans_unstable(pmd))
640                 return 0;
641         /*
642          * The mmap_sem held all the way back in m_start() is what
643          * keeps khugepaged out of here and from collapsing things
644          * in here.
645          */
646         pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
647         for (; addr != end; pte++, addr += PAGE_SIZE)
648                 smaps_pte_entry(*pte, addr, PAGE_SIZE, walk);
649         pte_unmap_unlock(pte - 1, ptl);
650         cond_resched();
651         return 0;
652 }
653
654 static int show_smap(struct seq_file *m, void *v)
655 {
656         struct proc_maps_private *priv = m->private;
657         struct task_struct *task = priv->task;
658         struct vm_area_struct *vma = v;
659         struct mem_size_stats mss;
660         struct mm_walk smaps_walk = {
661                 .pmd_entry = smaps_pte_range,
662                 .mm = vma->vm_mm,
663                 .private = &mss,
664         };
665
666         memset(&mss, 0, sizeof mss);
667         mss.vma = vma;
668         /* mmap_sem is held in m_start */
669         if (vma->vm_mm && !is_vm_hugetlb_page(vma))
670                 walk_page_range(vma->vm_start, vma->vm_end, &smaps_walk);
671
672         show_map_vma(m, vma);
673
674         seq_printf(m,
675                    "Size:           %8lu kB\n"
676                    "Rss:            %8lu kB\n"
677                    "Pss:            %8lu kB\n"
678                    "Shared_Clean:   %8lu kB\n"
679                    "Shared_Dirty:   %8lu kB\n"
680                    "Private_Clean:  %8lu kB\n"
681                    "Private_Dirty:  %8lu kB\n"
682                    "Referenced:     %8lu kB\n"
683                    "Anonymous:      %8lu kB\n"
684                    "AnonHugePages:  %8lu kB\n"
685                    "Swap:           %8lu kB\n"
686                    "KernelPageSize: %8lu kB\n"
687                    "MMUPageSize:    %8lu kB\n"
688                    "Locked:         %8lu kB\n",
689                    (vma->vm_end - vma->vm_start) >> 10,
690                    mss.resident >> 10,
691                    (unsigned long)(mss.pss >> (10 + PSS_SHIFT)),
692                    mss.shared_clean  >> 10,
693                    mss.shared_dirty  >> 10,
694                    mss.private_clean >> 10,
695                    mss.private_dirty >> 10,
696                    mss.referenced >> 10,
697                    mss.anonymous >> 10,
698                    mss.anonymous_thp >> 10,
699                    mss.swap >> 10,
700                    vma_kernel_pagesize(vma) >> 10,
701                    vma_mmu_pagesize(vma) >> 10,
702                    (vma->vm_flags & VM_LOCKED) ?
703                         (unsigned long)(mss.pss >> (10 + PSS_SHIFT)) : 0);
704
705         if (m->count < m->size)  /* vma is copied successfully */
706                 m->version = (vma != get_gate_vma(task->mm))
707                         ? vma->vm_start : 0;
708         return 0;
709 }
710
711 static const struct seq_operations proc_pid_smaps_op = {
712         .start  = m_start,
713         .next   = m_next,
714         .stop   = m_stop,
715         .show   = show_smap
716 };
717
718 static int smaps_open(struct inode *inode, struct file *file)
719 {
720         return do_maps_open(inode, file, &proc_pid_smaps_op);
721 }
722
723 const struct file_operations proc_smaps_operations = {
724         .open           = smaps_open,
725         .read           = seq_read,
726         .llseek         = seq_lseek,
727         .release        = seq_release_private,
728 };
729
730 static int clear_refs_pte_range(pmd_t *pmd, unsigned long addr,
731                                 unsigned long end, struct mm_walk *walk)
732 {
733         struct vm_area_struct *vma = walk->private;
734         pte_t *pte, ptent;
735         spinlock_t *ptl;
736         struct page *page;
737
738         split_huge_page_pmd(walk->mm, pmd);
739         if (pmd_trans_unstable(pmd))
740                 return 0;
741
742         pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
743         for (; addr != end; pte++, addr += PAGE_SIZE) {
744                 ptent = *pte;
745                 if (!pte_present(ptent))
746                         continue;
747
748                 page = vm_normal_page(vma, addr, ptent);
749                 if (!page)
750                         continue;
751
752                 if (PageReserved(page))
753                         continue;
754
755                 /* Clear accessed and referenced bits. */
756                 ptep_test_and_clear_young(vma, addr, pte);
757                 ClearPageReferenced(page);
758         }
759         pte_unmap_unlock(pte - 1, ptl);
760         cond_resched();
761         return 0;
762 }
763
764 #define CLEAR_REFS_ALL 1
765 #define CLEAR_REFS_ANON 2
766 #define CLEAR_REFS_MAPPED 3
767
768 static ssize_t clear_refs_write(struct file *file, const char __user *buf,
769                                 size_t count, loff_t *ppos)
770 {
771         struct task_struct *task;
772         char buffer[PROC_NUMBUF];
773         struct mm_struct *mm;
774         struct vm_area_struct *vma;
775         int type;
776         int rv;
777
778         memset(buffer, 0, sizeof(buffer));
779         if (count > sizeof(buffer) - 1)
780                 count = sizeof(buffer) - 1;
781         if (copy_from_user(buffer, buf, count))
782                 return -EFAULT;
783         rv = kstrtoint(strstrip(buffer), 10, &type);
784         if (rv < 0)
785                 return rv;
786         if (type < CLEAR_REFS_ALL || type > CLEAR_REFS_MAPPED)
787                 return -EINVAL;
788         task = get_proc_task(file->f_path.dentry->d_inode);
789         if (!task)
790                 return -ESRCH;
791         mm = get_task_mm(task);
792         if (mm) {
793                 struct mm_walk clear_refs_walk = {
794                         .pmd_entry = clear_refs_pte_range,
795                         .mm = mm,
796                 };
797                 down_read(&mm->mmap_sem);
798                 for (vma = mm->mmap; vma; vma = vma->vm_next) {
799                         clear_refs_walk.private = vma;
800                         if (is_vm_hugetlb_page(vma))
801                                 continue;
802                         /*
803                          * Writing 1 to /proc/pid/clear_refs affects all pages.
804                          *
805                          * Writing 2 to /proc/pid/clear_refs only affects
806                          * Anonymous pages.
807                          *
808                          * Writing 3 to /proc/pid/clear_refs only affects file
809                          * mapped pages.
810                          */
811                         if (type == CLEAR_REFS_ANON && vma->vm_file)
812                                 continue;
813                         if (type == CLEAR_REFS_MAPPED && !vma->vm_file)
814                                 continue;
815                         walk_page_range(vma->vm_start, vma->vm_end,
816                                         &clear_refs_walk);
817                 }
818                 flush_tlb_mm(mm);
819                 up_read(&mm->mmap_sem);
820                 mmput(mm);
821         }
822         put_task_struct(task);
823
824         return count;
825 }
826
827 const struct file_operations proc_clear_refs_operations = {
828         .write          = clear_refs_write,
829         .llseek         = noop_llseek,
830 };
831
832 struct pagemapread {
833         int pos, len;           /* units: PM_ENTRY_BYTES, not bytes */
834         u64 *buffer;
835         bool show_pfn;
836 };
837
838 #define PM_ENTRY_BYTES      sizeof(u64)
839 #define PM_STATUS_BITS      3
840 #define PM_STATUS_OFFSET    (64 - PM_STATUS_BITS)
841 #define PM_STATUS_MASK      (((1LL << PM_STATUS_BITS) - 1) << PM_STATUS_OFFSET)
842 #define PM_STATUS(nr)       (((nr) << PM_STATUS_OFFSET) & PM_STATUS_MASK)
843 #define PM_PSHIFT_BITS      6
844 #define PM_PSHIFT_OFFSET    (PM_STATUS_OFFSET - PM_PSHIFT_BITS)
845 #define PM_PSHIFT_MASK      (((1LL << PM_PSHIFT_BITS) - 1) << PM_PSHIFT_OFFSET)
846 #define PM_PSHIFT(x)        (((u64) (x) << PM_PSHIFT_OFFSET) & PM_PSHIFT_MASK)
847 #define PM_PFRAME_MASK      ((1LL << PM_PSHIFT_OFFSET) - 1)
848 #define PM_PFRAME(x)        ((x) & PM_PFRAME_MASK)
849
850 #define PM_PRESENT          PM_STATUS(4LL)
851 #define PM_SWAP             PM_STATUS(2LL)
852 #define PM_NOT_PRESENT      PM_PSHIFT(PAGE_SHIFT)
853 #define PM_END_OF_BUFFER    1
854
855 static int add_to_pagemap(unsigned long addr, u64 pfn,
856                           struct pagemapread *pm)
857 {
858         pm->buffer[pm->pos++] = pfn;
859         if (pm->pos >= pm->len)
860                 return PM_END_OF_BUFFER;
861         return 0;
862 }
863
864 static int pagemap_pte_hole(unsigned long start, unsigned long end,
865                                 struct mm_walk *walk)
866 {
867         struct pagemapread *pm = walk->private;
868         unsigned long addr;
869         int err = 0;
870         for (addr = start; addr < end; addr += PAGE_SIZE) {
871                 err = add_to_pagemap(addr, PM_NOT_PRESENT, pm);
872                 if (err)
873                         break;
874         }
875         return err;
876 }
877
878 static u64 swap_pte_to_pagemap_entry(pte_t pte)
879 {
880         swp_entry_t e = pte_to_swp_entry(pte);
881         return swp_type(e) | (swp_offset(e) << MAX_SWAPFILES_SHIFT);
882 }
883
884 static u64 pte_to_pagemap_entry(struct pagemapread *pm, pte_t pte)
885 {
886         u64 pme = 0;
887         if (is_swap_pte(pte))
888                 pme = PM_PFRAME(swap_pte_to_pagemap_entry(pte))
889                         | PM_PSHIFT(PAGE_SHIFT) | PM_SWAP;
890         else if (pte_present(pte))
891                 pme = (pm->show_pfn ? PM_PFRAME(pte_pfn(pte)) : 0)
892                         | PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT;
893         return pme;
894 }
895
896 static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
897                              struct mm_walk *walk)
898 {
899         struct vm_area_struct *vma;
900         struct pagemapread *pm = walk->private;
901         pte_t *pte;
902         int err = 0;
903
904         split_huge_page_pmd(walk->mm, pmd);
905         if (pmd_trans_unstable(pmd))
906                 return 0;
907
908         /* find the first VMA at or above 'addr' */
909         vma = find_vma(walk->mm, addr);
910         for (; addr != end; addr += PAGE_SIZE) {
911                 u64 pfn = PM_NOT_PRESENT;
912
913                 /* check to see if we've left 'vma' behind
914                  * and need a new, higher one */
915                 if (vma && (addr >= vma->vm_end))
916                         vma = find_vma(walk->mm, addr);
917
918                 /* check that 'vma' actually covers this address,
919                  * and that it isn't a huge page vma */
920                 if (vma && (vma->vm_start <= addr) &&
921                     !is_vm_hugetlb_page(vma)) {
922                         pte = pte_offset_map(pmd, addr);
923                         pfn = pte_to_pagemap_entry(pm, *pte);
924                         /* unmap before userspace copy */
925                         pte_unmap(pte);
926                 }
927                 err = add_to_pagemap(addr, pfn, pm);
928                 if (err)
929                         return err;
930         }
931
932         cond_resched();
933
934         return err;
935 }
936
937 #ifdef CONFIG_HUGETLB_PAGE
938 static u64 huge_pte_to_pagemap_entry(struct pagemapread *pm, pte_t pte, int offset)
939 {
940         u64 pme = 0;
941         if (pte_present(pte))
942                 pme = (pm->show_pfn ? PM_PFRAME(pte_pfn(pte) + offset) : 0)
943                         | PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT;
944         return pme;
945 }
946
947 /* This function walks within one hugetlb entry in the single call */
948 static int pagemap_hugetlb_range(pte_t *pte, unsigned long hmask,
949                                  unsigned long addr, unsigned long end,
950                                  struct mm_walk *walk)
951 {
952         struct pagemapread *pm = walk->private;
953         int err = 0;
954         u64 pfn;
955
956         for (; addr != end; addr += PAGE_SIZE) {
957                 int offset = (addr & ~hmask) >> PAGE_SHIFT;
958                 pfn = huge_pte_to_pagemap_entry(pm, *pte, offset);
959                 err = add_to_pagemap(addr, pfn, pm);
960                 if (err)
961                         return err;
962         }
963
964         cond_resched();
965
966         return err;
967 }
968 #endif /* HUGETLB_PAGE */
969
970 /*
971  * /proc/pid/pagemap - an array mapping virtual pages to pfns
972  *
973  * For each page in the address space, this file contains one 64-bit entry
974  * consisting of the following:
975  *
976  * Bits 0-55  page frame number (PFN) if present
977  * Bits 0-4   swap type if swapped
978  * Bits 5-55  swap offset if swapped
979  * Bits 55-60 page shift (page size = 1<<page shift)
980  * Bit  61    reserved for future use
981  * Bit  62    page swapped
982  * Bit  63    page present
983  *
984  * If the page is not present but in swap, then the PFN contains an
985  * encoding of the swap file number and the page's offset into the
986  * swap. Unmapped pages return a null PFN. This allows determining
987  * precisely which pages are mapped (or in swap) and comparing mapped
988  * pages between processes.
989  *
990  * Efficient users of this interface will use /proc/pid/maps to
991  * determine which areas of memory are actually mapped and llseek to
992  * skip over unmapped regions.
993  */
994 #define PAGEMAP_WALK_SIZE       (PMD_SIZE)
995 #define PAGEMAP_WALK_MASK       (PMD_MASK)
996 static ssize_t pagemap_read(struct file *file, char __user *buf,
997                             size_t count, loff_t *ppos)
998 {
999         struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode);
1000         struct mm_struct *mm;
1001         struct pagemapread pm;
1002         int ret = -ESRCH;
1003         struct mm_walk pagemap_walk = {};
1004         unsigned long src;
1005         unsigned long svpfn;
1006         unsigned long start_vaddr;
1007         unsigned long end_vaddr;
1008         int copied = 0;
1009
1010         if (!task)
1011                 goto out;
1012
1013         ret = -EINVAL;
1014         /* file position must be aligned */
1015         if ((*ppos % PM_ENTRY_BYTES) || (count % PM_ENTRY_BYTES))
1016                 goto out_task;
1017
1018         ret = 0;
1019         if (!count)
1020                 goto out_task;
1021
1022         /* do not disclose physical addresses: attack vector */
1023         pm.show_pfn = !security_capable(&init_user_ns, file->f_cred, 
1024                                         CAP_SYS_ADMIN);
1025
1026         pm.len = (PAGEMAP_WALK_SIZE >> PAGE_SHIFT);
1027         pm.buffer = kmalloc(pm.len * PM_ENTRY_BYTES, GFP_TEMPORARY);
1028         ret = -ENOMEM;
1029         if (!pm.buffer)
1030                 goto out_task;
1031
1032         mm = mm_for_maps(task);
1033         ret = PTR_ERR(mm);
1034         if (!mm || IS_ERR(mm))
1035                 goto out_free;
1036
1037         pagemap_walk.pmd_entry = pagemap_pte_range;
1038         pagemap_walk.pte_hole = pagemap_pte_hole;
1039 #ifdef CONFIG_HUGETLB_PAGE
1040         pagemap_walk.hugetlb_entry = pagemap_hugetlb_range;
1041 #endif
1042         pagemap_walk.mm = mm;
1043         pagemap_walk.private = &pm;
1044
1045         src = *ppos;
1046         svpfn = src / PM_ENTRY_BYTES;
1047         start_vaddr = svpfn << PAGE_SHIFT;
1048         end_vaddr = TASK_SIZE_OF(task);
1049
1050         /* watch out for wraparound */
1051         if (svpfn > TASK_SIZE_OF(task) >> PAGE_SHIFT)
1052                 start_vaddr = end_vaddr;
1053
1054         /*
1055          * The odds are that this will stop walking way
1056          * before end_vaddr, because the length of the
1057          * user buffer is tracked in "pm", and the walk
1058          * will stop when we hit the end of the buffer.
1059          */
1060         ret = 0;
1061         while (count && (start_vaddr < end_vaddr)) {
1062                 int len;
1063                 unsigned long end;
1064
1065                 pm.pos = 0;
1066                 end = (start_vaddr + PAGEMAP_WALK_SIZE) & PAGEMAP_WALK_MASK;
1067                 /* overflow ? */
1068                 if (end < start_vaddr || end > end_vaddr)
1069                         end = end_vaddr;
1070                 down_read(&mm->mmap_sem);
1071                 ret = walk_page_range(start_vaddr, end, &pagemap_walk);
1072                 up_read(&mm->mmap_sem);
1073                 start_vaddr = end;
1074
1075                 len = min(count, PM_ENTRY_BYTES * pm.pos);
1076                 if (copy_to_user(buf, pm.buffer, len)) {
1077                         ret = -EFAULT;
1078                         goto out_mm;
1079                 }
1080                 copied += len;
1081                 buf += len;
1082                 count -= len;
1083         }
1084         *ppos += copied;
1085         if (!ret || ret == PM_END_OF_BUFFER)
1086                 ret = copied;
1087
1088 out_mm:
1089         mmput(mm);
1090 out_free:
1091         kfree(pm.buffer);
1092 out_task:
1093         put_task_struct(task);
1094 out:
1095         return ret;
1096 }
1097
1098 const struct file_operations proc_pagemap_operations = {
1099         .llseek         = mem_lseek, /* borrow this */
1100         .read           = pagemap_read,
1101 };
1102 #endif /* CONFIG_PROC_PAGE_MONITOR */
1103
1104 #ifdef CONFIG_NUMA
1105
1106 struct numa_maps {
1107         struct vm_area_struct *vma;
1108         unsigned long pages;
1109         unsigned long anon;
1110         unsigned long active;
1111         unsigned long writeback;
1112         unsigned long mapcount_max;
1113         unsigned long dirty;
1114         unsigned long swapcache;
1115         unsigned long node[MAX_NUMNODES];
1116 };
1117
1118 struct numa_maps_private {
1119         struct proc_maps_private proc_maps;
1120         struct numa_maps md;
1121 };
1122
1123 static void gather_stats(struct page *page, struct numa_maps *md, int pte_dirty,
1124                         unsigned long nr_pages)
1125 {
1126         int count = page_mapcount(page);
1127
1128         md->pages += nr_pages;
1129         if (pte_dirty || PageDirty(page))
1130                 md->dirty += nr_pages;
1131
1132         if (PageSwapCache(page))
1133                 md->swapcache += nr_pages;
1134
1135         if (PageActive(page) || PageUnevictable(page))
1136                 md->active += nr_pages;
1137
1138         if (PageWriteback(page))
1139                 md->writeback += nr_pages;
1140
1141         if (PageAnon(page))
1142                 md->anon += nr_pages;
1143
1144         if (count > md->mapcount_max)
1145                 md->mapcount_max = count;
1146
1147         md->node[page_to_nid(page)] += nr_pages;
1148 }
1149
1150 static struct page *can_gather_numa_stats(pte_t pte, struct vm_area_struct *vma,
1151                 unsigned long addr)
1152 {
1153         struct page *page;
1154         int nid;
1155
1156         if (!pte_present(pte))
1157                 return NULL;
1158
1159         page = vm_normal_page(vma, addr, pte);
1160         if (!page)
1161                 return NULL;
1162
1163         if (PageReserved(page))
1164                 return NULL;
1165
1166         nid = page_to_nid(page);
1167         if (!node_isset(nid, node_states[N_HIGH_MEMORY]))
1168                 return NULL;
1169
1170         return page;
1171 }
1172
1173 static int gather_pte_stats(pmd_t *pmd, unsigned long addr,
1174                 unsigned long end, struct mm_walk *walk)
1175 {
1176         struct numa_maps *md;
1177         spinlock_t *ptl;
1178         pte_t *orig_pte;
1179         pte_t *pte;
1180
1181         md = walk->private;
1182         spin_lock(&walk->mm->page_table_lock);
1183         if (pmd_trans_huge(*pmd)) {
1184                 if (pmd_trans_splitting(*pmd)) {
1185                         spin_unlock(&walk->mm->page_table_lock);
1186                         wait_split_huge_page(md->vma->anon_vma, pmd);
1187                 } else {
1188                         pte_t huge_pte = *(pte_t *)pmd;
1189                         struct page *page;
1190
1191                         page = can_gather_numa_stats(huge_pte, md->vma, addr);
1192                         if (page)
1193                                 gather_stats(page, md, pte_dirty(huge_pte),
1194                                                 HPAGE_PMD_SIZE/PAGE_SIZE);
1195                         spin_unlock(&walk->mm->page_table_lock);
1196                         return 0;
1197                 }
1198         } else {
1199                 spin_unlock(&walk->mm->page_table_lock);
1200         }
1201
1202         if (pmd_trans_unstable(pmd))
1203                 return 0;
1204         orig_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
1205         do {
1206                 struct page *page = can_gather_numa_stats(*pte, md->vma, addr);
1207                 if (!page)
1208                         continue;
1209                 gather_stats(page, md, pte_dirty(*pte), 1);
1210
1211         } while (pte++, addr += PAGE_SIZE, addr != end);
1212         pte_unmap_unlock(orig_pte, ptl);
1213         return 0;
1214 }
1215 #ifdef CONFIG_HUGETLB_PAGE
1216 static int gather_hugetbl_stats(pte_t *pte, unsigned long hmask,
1217                 unsigned long addr, unsigned long end, struct mm_walk *walk)
1218 {
1219         struct numa_maps *md;
1220         struct page *page;
1221
1222         if (pte_none(*pte))
1223                 return 0;
1224
1225         page = pte_page(*pte);
1226         if (!page)
1227                 return 0;
1228
1229         md = walk->private;
1230         gather_stats(page, md, pte_dirty(*pte), 1);
1231         return 0;
1232 }
1233
1234 #else
1235 static int gather_hugetbl_stats(pte_t *pte, unsigned long hmask,
1236                 unsigned long addr, unsigned long end, struct mm_walk *walk)
1237 {
1238         return 0;
1239 }
1240 #endif
1241
1242 /*
1243  * Display pages allocated per node and memory policy via /proc.
1244  */
1245 static int show_numa_map(struct seq_file *m, void *v)
1246 {
1247         struct numa_maps_private *numa_priv = m->private;
1248         struct proc_maps_private *proc_priv = &numa_priv->proc_maps;
1249         struct vm_area_struct *vma = v;
1250         struct numa_maps *md = &numa_priv->md;
1251         struct file *file = vma->vm_file;
1252         struct mm_struct *mm = vma->vm_mm;
1253         struct mm_walk walk = {};
1254         struct mempolicy *pol;
1255         int n;
1256         char buffer[50];
1257
1258         if (!mm)
1259                 return 0;
1260
1261         /* Ensure we start with an empty set of numa_maps statistics. */
1262         memset(md, 0, sizeof(*md));
1263
1264         md->vma = vma;
1265
1266         walk.hugetlb_entry = gather_hugetbl_stats;
1267         walk.pmd_entry = gather_pte_stats;
1268         walk.private = md;
1269         walk.mm = mm;
1270
1271         pol = get_vma_policy(proc_priv->task, vma, vma->vm_start);
1272         mpol_to_str(buffer, sizeof(buffer), pol, 0);
1273         mpol_cond_put(pol);
1274
1275         seq_printf(m, "%08lx %s", vma->vm_start, buffer);
1276
1277         if (file) {
1278                 seq_printf(m, " file=");
1279                 seq_path(m, &file->f_path, "\n\t= ");
1280         } else if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk) {
1281                 seq_printf(m, " heap");
1282         } else if (vma->vm_start <= mm->start_stack &&
1283                         vma->vm_end >= mm->start_stack) {
1284                 seq_printf(m, " stack");
1285         }
1286
1287         if (is_vm_hugetlb_page(vma))
1288                 seq_printf(m, " huge");
1289
1290         walk_page_range(vma->vm_start, vma->vm_end, &walk);
1291
1292         if (!md->pages)
1293                 goto out;
1294
1295         if (md->anon)
1296                 seq_printf(m, " anon=%lu", md->anon);
1297
1298         if (md->dirty)
1299                 seq_printf(m, " dirty=%lu", md->dirty);
1300
1301         if (md->pages != md->anon && md->pages != md->dirty)
1302                 seq_printf(m, " mapped=%lu", md->pages);
1303
1304         if (md->mapcount_max > 1)
1305                 seq_printf(m, " mapmax=%lu", md->mapcount_max);
1306
1307         if (md->swapcache)
1308                 seq_printf(m, " swapcache=%lu", md->swapcache);
1309
1310         if (md->active < md->pages && !is_vm_hugetlb_page(vma))
1311                 seq_printf(m, " active=%lu", md->active);
1312
1313         if (md->writeback)
1314                 seq_printf(m, " writeback=%lu", md->writeback);
1315
1316         for_each_node_state(n, N_HIGH_MEMORY)
1317                 if (md->node[n])
1318                         seq_printf(m, " N%d=%lu", n, md->node[n]);
1319 out:
1320         seq_putc(m, '\n');
1321
1322         if (m->count < m->size)
1323                 m->version = (vma != proc_priv->tail_vma) ? vma->vm_start : 0;
1324         return 0;
1325 }
1326
1327 static const struct seq_operations proc_pid_numa_maps_op = {
1328         .start  = m_start,
1329         .next   = m_next,
1330         .stop   = m_stop,
1331         .show   = show_numa_map,
1332 };
1333
1334 static int numa_maps_open(struct inode *inode, struct file *file)
1335 {
1336         struct numa_maps_private *priv;
1337         int ret = -ENOMEM;
1338         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
1339         if (priv) {
1340                 priv->proc_maps.pid = proc_pid(inode);
1341                 ret = seq_open(file, &proc_pid_numa_maps_op);
1342                 if (!ret) {
1343                         struct seq_file *m = file->private_data;
1344                         m->private = priv;
1345                 } else {
1346                         kfree(priv);
1347                 }
1348         }
1349         return ret;
1350 }
1351
1352 const struct file_operations proc_numa_maps_operations = {
1353         .open           = numa_maps_open,
1354         .read           = seq_read,
1355         .llseek         = seq_lseek,
1356         .release        = seq_release_private,
1357 };
1358 #endif /* CONFIG_NUMA */