1
2
3
4
5
6
7
8
9
10
11#include <linux/fs.h>
12#include <linux/mm.h>
13#include <linux/err.h>
14#include <linux/module.h>
15#include <linux/slab.h>
16#include <linux/cpu.h>
17#include <linux/vmstat.h>
18#include <linux/sched.h>
19#include <linux/math64.h>
20#include <linux/writeback.h>
21#include <linux/compaction.h>
22
23#ifdef CONFIG_VM_EVENT_COUNTERS
24DEFINE_PER_CPU(struct vm_event_state, vm_event_states) = {{0}};
25EXPORT_PER_CPU_SYMBOL(vm_event_states);
26
27static void sum_vm_events(unsigned long *ret)
28{
29 int cpu;
30 int i;
31
32 memset(ret, 0, NR_VM_EVENT_ITEMS * sizeof(unsigned long));
33
34 for_each_online_cpu(cpu) {
35 struct vm_event_state *this = &per_cpu(vm_event_states, cpu);
36
37 for (i = 0; i < NR_VM_EVENT_ITEMS; i++)
38 ret[i] += this->event[i];
39 }
40}
41
42
43
44
45
46
47void all_vm_events(unsigned long *ret)
48{
49 get_online_cpus();
50 sum_vm_events(ret);
51 put_online_cpus();
52}
53EXPORT_SYMBOL_GPL(all_vm_events);
54
55#ifdef CONFIG_HOTPLUG
56
57
58
59
60
61
62void vm_events_fold_cpu(int cpu)
63{
64 struct vm_event_state *fold_state = &per_cpu(vm_event_states, cpu);
65 int i;
66
67 for (i = 0; i < NR_VM_EVENT_ITEMS; i++) {
68 count_vm_events(i, fold_state->event[i]);
69 fold_state->event[i] = 0;
70 }
71}
72#endif
73
74#endif
75
76
77
78
79
80
81atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS] __cacheline_aligned_in_smp;
82EXPORT_SYMBOL(vm_stat);
83
84#ifdef CONFIG_SMP
85
86int calculate_pressure_threshold(struct zone *zone)
87{
88 int threshold;
89 int watermark_distance;
90
91
92
93
94
95
96
97
98
99 watermark_distance = low_wmark_pages(zone) - min_wmark_pages(zone);
100 threshold = max(1, (int)(watermark_distance / num_online_cpus()));
101
102
103
104
105 threshold = min(125, threshold);
106
107 return threshold;
108}
109
110int calculate_normal_threshold(struct zone *zone)
111{
112 int threshold;
113 int mem;
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145 mem = zone->present_pages >> (27 - PAGE_SHIFT);
146
147 threshold = 2 * fls(num_online_cpus()) * (1 + fls(mem));
148
149
150
151
152 threshold = min(125, threshold);
153
154 return threshold;
155}
156
157
158
159
160void refresh_zone_stat_thresholds(void)
161{
162 struct zone *zone;
163 int cpu;
164 int threshold;
165
166 for_each_populated_zone(zone) {
167 unsigned long max_drift, tolerate_drift;
168
169 threshold = calculate_normal_threshold(zone);
170
171 for_each_online_cpu(cpu)
172 per_cpu_ptr(zone->pageset, cpu)->stat_threshold
173 = threshold;
174
175
176
177
178
179
180 tolerate_drift = low_wmark_pages(zone) - min_wmark_pages(zone);
181 max_drift = num_online_cpus() * threshold;
182 if (max_drift > tolerate_drift)
183 zone->percpu_drift_mark = high_wmark_pages(zone) +
184 max_drift;
185 }
186}
187
188void set_pgdat_percpu_threshold(pg_data_t *pgdat,
189 int (*calculate_pressure)(struct zone *))
190{
191 struct zone *zone;
192 int cpu;
193 int threshold;
194 int i;
195
196 for (i = 0; i < pgdat->nr_zones; i++) {
197 zone = &pgdat->node_zones[i];
198 if (!zone->percpu_drift_mark)
199 continue;
200
201 threshold = (*calculate_pressure)(zone);
202 for_each_possible_cpu(cpu)
203 per_cpu_ptr(zone->pageset, cpu)->stat_threshold
204 = threshold;
205 }
206}
207
208
209
210
211void __mod_zone_page_state(struct zone *zone, enum zone_stat_item item,
212 int delta)
213{
214 struct per_cpu_pageset __percpu *pcp = zone->pageset;
215 s8 __percpu *p = pcp->vm_stat_diff + item;
216 long x;
217 long t;
218
219 x = delta + __this_cpu_read(*p);
220
221 t = __this_cpu_read(pcp->stat_threshold);
222
223 if (unlikely(x > t || x < -t)) {
224 zone_page_state_add(x, zone, item);
225 x = 0;
226 }
227 __this_cpu_write(*p, x);
228}
229EXPORT_SYMBOL(__mod_zone_page_state);
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254void __inc_zone_state(struct zone *zone, enum zone_stat_item item)
255{
256 struct per_cpu_pageset __percpu *pcp = zone->pageset;
257 s8 __percpu *p = pcp->vm_stat_diff + item;
258 s8 v, t;
259
260 v = __this_cpu_inc_return(*p);
261 t = __this_cpu_read(pcp->stat_threshold);
262 if (unlikely(v > t)) {
263 s8 overstep = t >> 1;
264
265 zone_page_state_add(v + overstep, zone, item);
266 __this_cpu_write(*p, -overstep);
267 }
268}
269
270void __inc_zone_page_state(struct page *page, enum zone_stat_item item)
271{
272 __inc_zone_state(page_zone(page), item);
273}
274EXPORT_SYMBOL(__inc_zone_page_state);
275
276void __dec_zone_state(struct zone *zone, enum zone_stat_item item)
277{
278 struct per_cpu_pageset __percpu *pcp = zone->pageset;
279 s8 __percpu *p = pcp->vm_stat_diff + item;
280 s8 v, t;
281
282 v = __this_cpu_dec_return(*p);
283 t = __this_cpu_read(pcp->stat_threshold);
284 if (unlikely(v < - t)) {
285 s8 overstep = t >> 1;
286
287 zone_page_state_add(v - overstep, zone, item);
288 __this_cpu_write(*p, overstep);
289 }
290}
291
292void __dec_zone_page_state(struct page *page, enum zone_stat_item item)
293{
294 __dec_zone_state(page_zone(page), item);
295}
296EXPORT_SYMBOL(__dec_zone_page_state);
297
298#ifdef CONFIG_HAVE_CMPXCHG_LOCAL
299
300
301
302
303
304
305
306
307
308
309
310
311static inline void mod_state(struct zone *zone,
312 enum zone_stat_item item, int delta, int overstep_mode)
313{
314 struct per_cpu_pageset __percpu *pcp = zone->pageset;
315 s8 __percpu *p = pcp->vm_stat_diff + item;
316 long o, n, t, z;
317
318 do {
319 z = 0;
320
321
322
323
324
325
326
327
328
329
330
331 t = this_cpu_read(pcp->stat_threshold);
332
333 o = this_cpu_read(*p);
334 n = delta + o;
335
336 if (n > t || n < -t) {
337 int os = overstep_mode * (t >> 1) ;
338
339
340 z = n + os;
341 n = -os;
342 }
343 } while (this_cpu_cmpxchg(*p, o, n) != o);
344
345 if (z)
346 zone_page_state_add(z, zone, item);
347}
348
349void mod_zone_page_state(struct zone *zone, enum zone_stat_item item,
350 int delta)
351{
352 mod_state(zone, item, delta, 0);
353}
354EXPORT_SYMBOL(mod_zone_page_state);
355
356void inc_zone_state(struct zone *zone, enum zone_stat_item item)
357{
358 mod_state(zone, item, 1, 1);
359}
360
361void inc_zone_page_state(struct page *page, enum zone_stat_item item)
362{
363 mod_state(page_zone(page), item, 1, 1);
364}
365EXPORT_SYMBOL(inc_zone_page_state);
366
367void dec_zone_page_state(struct page *page, enum zone_stat_item item)
368{
369 mod_state(page_zone(page), item, -1, -1);
370}
371EXPORT_SYMBOL(dec_zone_page_state);
372#else
373
374
375
376void mod_zone_page_state(struct zone *zone, enum zone_stat_item item,
377 int delta)
378{
379 unsigned long flags;
380
381 local_irq_save(flags);
382 __mod_zone_page_state(zone, item, delta);
383 local_irq_restore(flags);
384}
385EXPORT_SYMBOL(mod_zone_page_state);
386
387void inc_zone_state(struct zone *zone, enum zone_stat_item item)
388{
389 unsigned long flags;
390
391 local_irq_save(flags);
392 __inc_zone_state(zone, item);
393 local_irq_restore(flags);
394}
395
396void inc_zone_page_state(struct page *page, enum zone_stat_item item)
397{
398 unsigned long flags;
399 struct zone *zone;
400
401 zone = page_zone(page);
402 local_irq_save(flags);
403 __inc_zone_state(zone, item);
404 local_irq_restore(flags);
405}
406EXPORT_SYMBOL(inc_zone_page_state);
407
408void dec_zone_page_state(struct page *page, enum zone_stat_item item)
409{
410 unsigned long flags;
411
412 local_irq_save(flags);
413 __dec_zone_page_state(page, item);
414 local_irq_restore(flags);
415}
416EXPORT_SYMBOL(dec_zone_page_state);
417#endif
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437void refresh_cpu_vm_stats(int cpu)
438{
439 struct zone *zone;
440 int i;
441 int global_diff[NR_VM_ZONE_STAT_ITEMS] = { 0, };
442
443 for_each_populated_zone(zone) {
444 struct per_cpu_pageset *p;
445
446 p = per_cpu_ptr(zone->pageset, cpu);
447
448 for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++)
449 if (p->vm_stat_diff[i]) {
450 unsigned long flags;
451 int v;
452
453 local_irq_save(flags);
454 v = p->vm_stat_diff[i];
455 p->vm_stat_diff[i] = 0;
456 local_irq_restore(flags);
457 atomic_long_add(v, &zone->vm_stat[i]);
458 global_diff[i] += v;
459#ifdef CONFIG_NUMA
460
461 p->expire = 3;
462#endif
463 }
464 cond_resched();
465#ifdef CONFIG_NUMA
466
467
468
469
470
471
472
473 if (!p->expire || !p->pcp.count)
474 continue;
475
476
477
478
479 if (zone_to_nid(zone) == numa_node_id()) {
480 p->expire = 0;
481 continue;
482 }
483
484 p->expire--;
485 if (p->expire)
486 continue;
487
488 if (p->pcp.count)
489 drain_zone_pages(zone, &p->pcp);
490#endif
491 }
492
493 for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++)
494 if (global_diff[i])
495 atomic_long_add(global_diff[i], &vm_stat[i]);
496}
497
498void drain_zonestat(struct zone *zone, struct per_cpu_pageset *pset)
499{
500 int i;
501
502 for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++)
503 if (pset->vm_stat_diff[i]) {
504 int v = pset->vm_stat_diff[i];
505 pset->vm_stat_diff[i] = 0;
506 atomic_long_add(v, &zone->vm_stat[i]);
507 atomic_long_add(v, &vm_stat[i]);
508 }
509}
510#endif
511
512#ifdef CONFIG_NUMA
513
514
515
516
517
518
519
520
521
522
523void zone_statistics(struct zone *preferred_zone, struct zone *z, gfp_t flags)
524{
525 if (z->zone_pgdat == preferred_zone->zone_pgdat) {
526 __inc_zone_state(z, NUMA_HIT);
527 } else {
528 __inc_zone_state(z, NUMA_MISS);
529 __inc_zone_state(preferred_zone, NUMA_FOREIGN);
530 }
531 if (z->node == ((flags & __GFP_OTHER_NODE) ?
532 preferred_zone->node : numa_node_id()))
533 __inc_zone_state(z, NUMA_LOCAL);
534 else
535 __inc_zone_state(z, NUMA_OTHER);
536}
537#endif
538
539#ifdef CONFIG_COMPACTION
540
541struct contig_page_info {
542 unsigned long free_pages;
543 unsigned long free_blocks_total;
544 unsigned long free_blocks_suitable;
545};
546
547
548
549
550
551
552
553
554
555static void fill_contig_page_info(struct zone *zone,
556 unsigned int suitable_order,
557 struct contig_page_info *info)
558{
559 unsigned int order;
560
561 info->free_pages = 0;
562 info->free_blocks_total = 0;
563 info->free_blocks_suitable = 0;
564
565 for (order = 0; order < MAX_ORDER; order++) {
566 unsigned long blocks;
567
568
569 blocks = zone->free_area[order].nr_free;
570 info->free_blocks_total += blocks;
571
572
573 info->free_pages += blocks << order;
574
575
576 if (order >= suitable_order)
577 info->free_blocks_suitable += blocks <<
578 (order - suitable_order);
579 }
580}
581
582
583
584
585
586
587
588
589static int __fragmentation_index(unsigned int order, struct contig_page_info *info)
590{
591 unsigned long requested = 1UL << order;
592
593 if (!info->free_blocks_total)
594 return 0;
595
596
597 if (info->free_blocks_suitable)
598 return -1000;
599
600
601
602
603
604
605
606 return 1000 - div_u64( (1000+(div_u64(info->free_pages * 1000ULL, requested))), info->free_blocks_total);
607}
608
609
610int fragmentation_index(struct zone *zone, unsigned int order)
611{
612 struct contig_page_info info;
613
614 fill_contig_page_info(zone, order, &info);
615 return __fragmentation_index(order, &info);
616}
617#endif
618
619#if defined(CONFIG_PROC_FS) || defined(CONFIG_COMPACTION)
620#include <linux/proc_fs.h>
621#include <linux/seq_file.h>
622
623static char * const migratetype_names[MIGRATE_TYPES] = {
624 "Unmovable",
625 "Reclaimable",
626 "Movable",
627 "Reserve",
628#ifdef CONFIG_CMA
629 "CMA",
630#endif
631 "Isolate",
632};
633
634static void *frag_start(struct seq_file *m, loff_t *pos)
635{
636 pg_data_t *pgdat;
637 loff_t node = *pos;
638 for (pgdat = first_online_pgdat();
639 pgdat && node;
640 pgdat = next_online_pgdat(pgdat))
641 --node;
642
643 return pgdat;
644}
645
646static void *frag_next(struct seq_file *m, void *arg, loff_t *pos)
647{
648 pg_data_t *pgdat = (pg_data_t *)arg;
649
650 (*pos)++;
651 return next_online_pgdat(pgdat);
652}
653
654static void frag_stop(struct seq_file *m, void *arg)
655{
656}
657
658
659static void walk_zones_in_node(struct seq_file *m, pg_data_t *pgdat,
660 void (*print)(struct seq_file *m, pg_data_t *, struct zone *))
661{
662 struct zone *zone;
663 struct zone *node_zones = pgdat->node_zones;
664 unsigned long flags;
665
666 for (zone = node_zones; zone - node_zones < MAX_NR_ZONES; ++zone) {
667 if (!populated_zone(zone))
668 continue;
669
670 spin_lock_irqsave(&zone->lock, flags);
671 print(m, pgdat, zone);
672 spin_unlock_irqrestore(&zone->lock, flags);
673 }
674}
675#endif
676
677#if defined(CONFIG_PROC_FS) || defined(CONFIG_SYSFS) || defined(CONFIG_NUMA)
678#ifdef CONFIG_ZONE_DMA
679#define TEXT_FOR_DMA(xx) xx "_dma",
680#else
681#define TEXT_FOR_DMA(xx)
682#endif
683
684#ifdef CONFIG_ZONE_DMA32
685#define TEXT_FOR_DMA32(xx) xx "_dma32",
686#else
687#define TEXT_FOR_DMA32(xx)
688#endif
689
690#ifdef CONFIG_HIGHMEM
691#define TEXT_FOR_HIGHMEM(xx) xx "_high",
692#else
693#define TEXT_FOR_HIGHMEM(xx)
694#endif
695
696#define TEXTS_FOR_ZONES(xx) TEXT_FOR_DMA(xx) TEXT_FOR_DMA32(xx) xx "_normal", \
697 TEXT_FOR_HIGHMEM(xx) xx "_movable",
698
699const char * const vmstat_text[] = {
700
701 "nr_free_pages",
702 "nr_inactive_anon",
703 "nr_active_anon",
704 "nr_inactive_file",
705 "nr_active_file",
706 "nr_unevictable",
707 "nr_mlock",
708 "nr_anon_pages",
709 "nr_mapped",
710 "nr_file_pages",
711 "nr_dirty",
712 "nr_writeback",
713 "nr_slab_reclaimable",
714 "nr_slab_unreclaimable",
715 "nr_page_table_pages",
716 "nr_kernel_stack",
717 "nr_unstable",
718 "nr_bounce",
719 "nr_vmscan_write",
720 "nr_vmscan_immediate_reclaim",
721 "nr_writeback_temp",
722 "nr_isolated_anon",
723 "nr_isolated_file",
724 "nr_shmem",
725 "nr_dirtied",
726 "nr_written",
727
728#ifdef CONFIG_NUMA
729 "numa_hit",
730 "numa_miss",
731 "numa_foreign",
732 "numa_interleave",
733 "numa_local",
734 "numa_other",
735#endif
736 "nr_anon_transparent_hugepages",
737 "nr_free_cma",
738 "nr_dirty_threshold",
739 "nr_dirty_background_threshold",
740
741#ifdef CONFIG_VM_EVENT_COUNTERS
742 "pgpgin",
743 "pgpgout",
744 "pswpin",
745 "pswpout",
746
747 TEXTS_FOR_ZONES("pgalloc")
748
749 "pgfree",
750 "pgactivate",
751 "pgdeactivate",
752
753 "pgfault",
754 "pgmajfault",
755
756 TEXTS_FOR_ZONES("pgrefill")
757 TEXTS_FOR_ZONES("pgsteal_kswapd")
758 TEXTS_FOR_ZONES("pgsteal_direct")
759 TEXTS_FOR_ZONES("pgscan_kswapd")
760 TEXTS_FOR_ZONES("pgscan_direct")
761 "pgscan_direct_throttle",
762
763#ifdef CONFIG_NUMA
764 "zone_reclaim_failed",
765#endif
766 "pginodesteal",
767 "slabs_scanned",
768 "kswapd_inodesteal",
769 "kswapd_low_wmark_hit_quickly",
770 "kswapd_high_wmark_hit_quickly",
771 "kswapd_skip_congestion_wait",
772 "pageoutrun",
773 "allocstall",
774
775 "pgrotated",
776
777#ifdef CONFIG_COMPACTION
778 "compact_blocks_moved",
779 "compact_pages_moved",
780 "compact_pagemigrate_failed",
781 "compact_stall",
782 "compact_fail",
783 "compact_success",
784#endif
785
786#ifdef CONFIG_HUGETLB_PAGE
787 "htlb_buddy_alloc_success",
788 "htlb_buddy_alloc_fail",
789#endif
790 "unevictable_pgs_culled",
791 "unevictable_pgs_scanned",
792 "unevictable_pgs_rescued",
793 "unevictable_pgs_mlocked",
794 "unevictable_pgs_munlocked",
795 "unevictable_pgs_cleared",
796 "unevictable_pgs_stranded",
797
798#ifdef CONFIG_TRANSPARENT_HUGEPAGE
799 "thp_fault_alloc",
800 "thp_fault_fallback",
801 "thp_collapse_alloc",
802 "thp_collapse_alloc_failed",
803 "thp_split",
804#endif
805
806#endif
807};
808#endif
809
810
811#ifdef CONFIG_PROC_FS
812static void frag_show_print(struct seq_file *m, pg_data_t *pgdat,
813 struct zone *zone)
814{
815 int order;
816
817 seq_printf(m, "Node %d, zone %8s ", pgdat->node_id, zone->name);
818 for (order = 0; order < MAX_ORDER; ++order)
819 seq_printf(m, "%6lu ", zone->free_area[order].nr_free);
820 seq_putc(m, '\n');
821}
822
823
824
825
826static int frag_show(struct seq_file *m, void *arg)
827{
828 pg_data_t *pgdat = (pg_data_t *)arg;
829 walk_zones_in_node(m, pgdat, frag_show_print);
830 return 0;
831}
832
833static void pagetypeinfo_showfree_print(struct seq_file *m,
834 pg_data_t *pgdat, struct zone *zone)
835{
836 int order, mtype;
837
838 for (mtype = 0; mtype < MIGRATE_TYPES; mtype++) {
839 seq_printf(m, "Node %4d, zone %8s, type %12s ",
840 pgdat->node_id,
841 zone->name,
842 migratetype_names[mtype]);
843 for (order = 0; order < MAX_ORDER; ++order) {
844 unsigned long freecount = 0;
845 struct free_area *area;
846 struct list_head *curr;
847
848 area = &(zone->free_area[order]);
849
850 list_for_each(curr, &area->free_list[mtype])
851 freecount++;
852 seq_printf(m, "%6lu ", freecount);
853 }
854 seq_putc(m, '\n');
855 }
856}
857
858
859static int pagetypeinfo_showfree(struct seq_file *m, void *arg)
860{
861 int order;
862 pg_data_t *pgdat = (pg_data_t *)arg;
863
864
865 seq_printf(m, "%-43s ", "Free pages count per migrate type at order");
866 for (order = 0; order < MAX_ORDER; ++order)
867 seq_printf(m, "%6d ", order);
868 seq_putc(m, '\n');
869
870 walk_zones_in_node(m, pgdat, pagetypeinfo_showfree_print);
871
872 return 0;
873}
874
875static void pagetypeinfo_showblockcount_print(struct seq_file *m,
876 pg_data_t *pgdat, struct zone *zone)
877{
878 int mtype;
879 unsigned long pfn;
880 unsigned long start_pfn = zone->zone_start_pfn;
881 unsigned long end_pfn = start_pfn + zone->spanned_pages;
882 unsigned long count[MIGRATE_TYPES] = { 0, };
883
884 for (pfn = start_pfn; pfn < end_pfn; pfn += pageblock_nr_pages) {
885 struct page *page;
886
887 if (!pfn_valid(pfn))
888 continue;
889
890 page = pfn_to_page(pfn);
891
892
893 if (!memmap_valid_within(pfn, page, zone))
894 continue;
895
896 mtype = get_pageblock_migratetype(page);
897
898 if (mtype < MIGRATE_TYPES)
899 count[mtype]++;
900 }
901
902
903 seq_printf(m, "Node %d, zone %8s ", pgdat->node_id, zone->name);
904 for (mtype = 0; mtype < MIGRATE_TYPES; mtype++)
905 seq_printf(m, "%12lu ", count[mtype]);
906 seq_putc(m, '\n');
907}
908
909
910static int pagetypeinfo_showblockcount(struct seq_file *m, void *arg)
911{
912 int mtype;
913 pg_data_t *pgdat = (pg_data_t *)arg;
914
915 seq_printf(m, "\n%-23s", "Number of blocks type ");
916 for (mtype = 0; mtype < MIGRATE_TYPES; mtype++)
917 seq_printf(m, "%12s ", migratetype_names[mtype]);
918 seq_putc(m, '\n');
919 walk_zones_in_node(m, pgdat, pagetypeinfo_showblockcount_print);
920
921 return 0;
922}
923
924
925
926
927
928static int pagetypeinfo_show(struct seq_file *m, void *arg)
929{
930 pg_data_t *pgdat = (pg_data_t *)arg;
931
932
933 if (!node_state(pgdat->node_id, N_HIGH_MEMORY))
934 return 0;
935
936 seq_printf(m, "Page block order: %d\n", pageblock_order);
937 seq_printf(m, "Pages per block: %lu\n", pageblock_nr_pages);
938 seq_putc(m, '\n');
939 pagetypeinfo_showfree(m, pgdat);
940 pagetypeinfo_showblockcount(m, pgdat);
941
942 return 0;
943}
944
945static const struct seq_operations fragmentation_op = {
946 .start = frag_start,
947 .next = frag_next,
948 .stop = frag_stop,
949 .show = frag_show,
950};
951
952static int fragmentation_open(struct inode *inode, struct file *file)
953{
954 return seq_open(file, &fragmentation_op);
955}
956
957static const struct file_operations fragmentation_file_operations = {
958 .open = fragmentation_open,
959 .read = seq_read,
960 .llseek = seq_lseek,
961 .release = seq_release,
962};
963
964static const struct seq_operations pagetypeinfo_op = {
965 .start = frag_start,
966 .next = frag_next,
967 .stop = frag_stop,
968 .show = pagetypeinfo_show,
969};
970
971static int pagetypeinfo_open(struct inode *inode, struct file *file)
972{
973 return seq_open(file, &pagetypeinfo_op);
974}
975
976static const struct file_operations pagetypeinfo_file_ops = {
977 .open = pagetypeinfo_open,
978 .read = seq_read,
979 .llseek = seq_lseek,
980 .release = seq_release,
981};
982
983static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat,
984 struct zone *zone)
985{
986 int i;
987 seq_printf(m, "Node %d, zone %8s", pgdat->node_id, zone->name);
988 seq_printf(m,
989 "\n pages free %lu"
990 "\n min %lu"
991 "\n low %lu"
992 "\n high %lu"
993 "\n scanned %lu"
994 "\n spanned %lu"
995 "\n present %lu",
996 zone_page_state(zone, NR_FREE_PAGES),
997 min_wmark_pages(zone),
998 low_wmark_pages(zone),
999 high_wmark_pages(zone),
1000 zone->pages_scanned,
1001 zone->spanned_pages,
1002 zone->present_pages);
1003
1004 for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++)
1005 seq_printf(m, "\n %-12s %lu", vmstat_text[i],
1006 zone_page_state(zone, i));
1007
1008 seq_printf(m,
1009 "\n protection: (%lu",
1010 zone->lowmem_reserve[0]);
1011 for (i = 1; i < ARRAY_SIZE(zone->lowmem_reserve); i++)
1012 seq_printf(m, ", %lu", zone->lowmem_reserve[i]);
1013 seq_printf(m,
1014 ")"
1015 "\n pagesets");
1016 for_each_online_cpu(i) {
1017 struct per_cpu_pageset *pageset;
1018
1019 pageset = per_cpu_ptr(zone->pageset, i);
1020 seq_printf(m,
1021 "\n cpu: %i"
1022 "\n count: %i"
1023 "\n high: %i"
1024 "\n batch: %i",
1025 i,
1026 pageset->pcp.count,
1027 pageset->pcp.high,
1028 pageset->pcp.batch);
1029#ifdef CONFIG_SMP
1030 seq_printf(m, "\n vm stats threshold: %d",
1031 pageset->stat_threshold);
1032#endif
1033 }
1034 seq_printf(m,
1035 "\n all_unreclaimable: %u"
1036 "\n start_pfn: %lu"
1037 "\n inactive_ratio: %u",
1038 zone->all_unreclaimable,
1039 zone->zone_start_pfn,
1040 zone->inactive_ratio);
1041 seq_putc(m, '\n');
1042}
1043
1044
1045
1046
1047static int zoneinfo_show(struct seq_file *m, void *arg)
1048{
1049 pg_data_t *pgdat = (pg_data_t *)arg;
1050 walk_zones_in_node(m, pgdat, zoneinfo_show_print);
1051 return 0;
1052}
1053
1054static const struct seq_operations zoneinfo_op = {
1055 .start = frag_start,
1056
1057 .next = frag_next,
1058 .stop = frag_stop,
1059 .show = zoneinfo_show,
1060};
1061
1062static int zoneinfo_open(struct inode *inode, struct file *file)
1063{
1064 return seq_open(file, &zoneinfo_op);
1065}
1066
1067static const struct file_operations proc_zoneinfo_file_operations = {
1068 .open = zoneinfo_open,
1069 .read = seq_read,
1070 .llseek = seq_lseek,
1071 .release = seq_release,
1072};
1073
1074enum writeback_stat_item {
1075 NR_DIRTY_THRESHOLD,
1076 NR_DIRTY_BG_THRESHOLD,
1077 NR_VM_WRITEBACK_STAT_ITEMS,
1078};
1079
1080static void *vmstat_start(struct seq_file *m, loff_t *pos)
1081{
1082 unsigned long *v;
1083 int i, stat_items_size;
1084
1085 if (*pos >= ARRAY_SIZE(vmstat_text))
1086 return NULL;
1087 stat_items_size = NR_VM_ZONE_STAT_ITEMS * sizeof(unsigned long) +
1088 NR_VM_WRITEBACK_STAT_ITEMS * sizeof(unsigned long);
1089
1090#ifdef CONFIG_VM_EVENT_COUNTERS
1091 stat_items_size += sizeof(struct vm_event_state);
1092#endif
1093
1094 v = kmalloc(stat_items_size, GFP_KERNEL);
1095 m->private = v;
1096 if (!v)
1097 return ERR_PTR(-ENOMEM);
1098 for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++)
1099 v[i] = global_page_state(i);
1100 v += NR_VM_ZONE_STAT_ITEMS;
1101
1102 global_dirty_limits(v + NR_DIRTY_BG_THRESHOLD,
1103 v + NR_DIRTY_THRESHOLD);
1104 v += NR_VM_WRITEBACK_STAT_ITEMS;
1105
1106#ifdef CONFIG_VM_EVENT_COUNTERS
1107 all_vm_events(v);
1108 v[PGPGIN] /= 2;
1109 v[PGPGOUT] /= 2;
1110#endif
1111 return (unsigned long *)m->private + *pos;
1112}
1113
1114static void *vmstat_next(struct seq_file *m, void *arg, loff_t *pos)
1115{
1116 (*pos)++;
1117 if (*pos >= ARRAY_SIZE(vmstat_text))
1118 return NULL;
1119 return (unsigned long *)m->private + *pos;
1120}
1121
1122static int vmstat_show(struct seq_file *m, void *arg)
1123{
1124 unsigned long *l = arg;
1125 unsigned long off = l - (unsigned long *)m->private;
1126
1127 seq_printf(m, "%s %lu\n", vmstat_text[off], *l);
1128 return 0;
1129}
1130
1131static void vmstat_stop(struct seq_file *m, void *arg)
1132{
1133 kfree(m->private);
1134 m->private = NULL;
1135}
1136
1137static const struct seq_operations vmstat_op = {
1138 .start = vmstat_start,
1139 .next = vmstat_next,
1140 .stop = vmstat_stop,
1141 .show = vmstat_show,
1142};
1143
1144static int vmstat_open(struct inode *inode, struct file *file)
1145{
1146 return seq_open(file, &vmstat_op);
1147}
1148
1149static const struct file_operations proc_vmstat_file_operations = {
1150 .open = vmstat_open,
1151 .read = seq_read,
1152 .llseek = seq_lseek,
1153 .release = seq_release,
1154};
1155#endif
1156
1157#ifdef CONFIG_SMP
1158static DEFINE_PER_CPU(struct delayed_work, vmstat_work);
1159int sysctl_stat_interval __read_mostly = HZ;
1160
1161static void vmstat_update(struct work_struct *w)
1162{
1163 refresh_cpu_vm_stats(smp_processor_id());
1164 schedule_delayed_work(&__get_cpu_var(vmstat_work),
1165 round_jiffies_relative(sysctl_stat_interval));
1166}
1167
1168static void __cpuinit start_cpu_timer(int cpu)
1169{
1170 struct delayed_work *work = &per_cpu(vmstat_work, cpu);
1171
1172 INIT_DEFERRABLE_WORK(work, vmstat_update);
1173 schedule_delayed_work_on(cpu, work, __round_jiffies_relative(HZ, cpu));
1174}
1175
1176
1177
1178
1179
1180static int __cpuinit vmstat_cpuup_callback(struct notifier_block *nfb,
1181 unsigned long action,
1182 void *hcpu)
1183{
1184 long cpu = (long)hcpu;
1185
1186 switch (action) {
1187 case CPU_ONLINE:
1188 case CPU_ONLINE_FROZEN:
1189 refresh_zone_stat_thresholds();
1190 start_cpu_timer(cpu);
1191 node_set_state(cpu_to_node(cpu), N_CPU);
1192 break;
1193 case CPU_DOWN_PREPARE:
1194 case CPU_DOWN_PREPARE_FROZEN:
1195 cancel_delayed_work_sync(&per_cpu(vmstat_work, cpu));
1196 per_cpu(vmstat_work, cpu).work.func = NULL;
1197 break;
1198 case CPU_DOWN_FAILED:
1199 case CPU_DOWN_FAILED_FROZEN:
1200 start_cpu_timer(cpu);
1201 break;
1202 case CPU_DEAD:
1203 case CPU_DEAD_FROZEN:
1204 refresh_zone_stat_thresholds();
1205 break;
1206 default:
1207 break;
1208 }
1209 return NOTIFY_OK;
1210}
1211
1212static struct notifier_block __cpuinitdata vmstat_notifier =
1213 { &vmstat_cpuup_callback, NULL, 0 };
1214#endif
1215
1216static int __init setup_vmstat(void)
1217{
1218#ifdef CONFIG_SMP
1219 int cpu;
1220
1221 register_cpu_notifier(&vmstat_notifier);
1222
1223 for_each_online_cpu(cpu)
1224 start_cpu_timer(cpu);
1225#endif
1226#ifdef CONFIG_PROC_FS
1227 proc_create("buddyinfo", S_IRUGO, NULL, &fragmentation_file_operations);
1228 proc_create("pagetypeinfo", S_IRUGO, NULL, &pagetypeinfo_file_ops);
1229 proc_create("vmstat", S_IRUGO, NULL, &proc_vmstat_file_operations);
1230 proc_create("zoneinfo", S_IRUGO, NULL, &proc_zoneinfo_file_operations);
1231#endif
1232 return 0;
1233}
1234module_init(setup_vmstat)
1235
1236#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_COMPACTION)
1237#include <linux/debugfs.h>
1238
1239
1240
1241
1242
1243
1244static int unusable_free_index(unsigned int order,
1245 struct contig_page_info *info)
1246{
1247
1248 if (info->free_pages == 0)
1249 return 1000;
1250
1251
1252
1253
1254
1255
1256
1257
1258 return div_u64((info->free_pages - (info->free_blocks_suitable << order)) * 1000ULL, info->free_pages);
1259
1260}
1261
1262static void unusable_show_print(struct seq_file *m,
1263 pg_data_t *pgdat, struct zone *zone)
1264{
1265 unsigned int order;
1266 int index;
1267 struct contig_page_info info;
1268
1269 seq_printf(m, "Node %d, zone %8s ",
1270 pgdat->node_id,
1271 zone->name);
1272 for (order = 0; order < MAX_ORDER; ++order) {
1273 fill_contig_page_info(zone, order, &info);
1274 index = unusable_free_index(order, &info);
1275 seq_printf(m, "%d.%03d ", index / 1000, index % 1000);
1276 }
1277
1278 seq_putc(m, '\n');
1279}
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290static int unusable_show(struct seq_file *m, void *arg)
1291{
1292 pg_data_t *pgdat = (pg_data_t *)arg;
1293
1294
1295 if (!node_state(pgdat->node_id, N_HIGH_MEMORY))
1296 return 0;
1297
1298 walk_zones_in_node(m, pgdat, unusable_show_print);
1299
1300 return 0;
1301}
1302
1303static const struct seq_operations unusable_op = {
1304 .start = frag_start,
1305 .next = frag_next,
1306 .stop = frag_stop,
1307 .show = unusable_show,
1308};
1309
1310static int unusable_open(struct inode *inode, struct file *file)
1311{
1312 return seq_open(file, &unusable_op);
1313}
1314
1315static const struct file_operations unusable_file_ops = {
1316 .open = unusable_open,
1317 .read = seq_read,
1318 .llseek = seq_lseek,
1319 .release = seq_release,
1320};
1321
1322static void extfrag_show_print(struct seq_file *m,
1323 pg_data_t *pgdat, struct zone *zone)
1324{
1325 unsigned int order;
1326 int index;
1327
1328
1329 struct contig_page_info info;
1330
1331 seq_printf(m, "Node %d, zone %8s ",
1332 pgdat->node_id,
1333 zone->name);
1334 for (order = 0; order < MAX_ORDER; ++order) {
1335 fill_contig_page_info(zone, order, &info);
1336 index = __fragmentation_index(order, &info);
1337 seq_printf(m, "%d.%03d ", index / 1000, index % 1000);
1338 }
1339
1340 seq_putc(m, '\n');
1341}
1342
1343
1344
1345
1346static int extfrag_show(struct seq_file *m, void *arg)
1347{
1348 pg_data_t *pgdat = (pg_data_t *)arg;
1349
1350 walk_zones_in_node(m, pgdat, extfrag_show_print);
1351
1352 return 0;
1353}
1354
1355static const struct seq_operations extfrag_op = {
1356 .start = frag_start,
1357 .next = frag_next,
1358 .stop = frag_stop,
1359 .show = extfrag_show,
1360};
1361
1362static int extfrag_open(struct inode *inode, struct file *file)
1363{
1364 return seq_open(file, &extfrag_op);
1365}
1366
1367static const struct file_operations extfrag_file_ops = {
1368 .open = extfrag_open,
1369 .read = seq_read,
1370 .llseek = seq_lseek,
1371 .release = seq_release,
1372};
1373
1374static int __init extfrag_debug_init(void)
1375{
1376 struct dentry *extfrag_debug_root;
1377
1378 extfrag_debug_root = debugfs_create_dir("extfrag", NULL);
1379 if (!extfrag_debug_root)
1380 return -ENOMEM;
1381
1382 if (!debugfs_create_file("unusable_index", 0444,
1383 extfrag_debug_root, NULL, &unusable_file_ops))
1384 goto fail;
1385
1386 if (!debugfs_create_file("extfrag_index", 0444,
1387 extfrag_debug_root, NULL, &extfrag_file_ops))
1388 goto fail;
1389
1390 return 0;
1391fail:
1392 debugfs_remove_recursive(extfrag_debug_root);
1393 return -ENOMEM;
1394}
1395
1396module_init(extfrag_debug_init);
1397#endif
1398