diff options
Diffstat (limited to 'mm/vmstat.c')
-rw-r--r-- | mm/vmstat.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/mm/vmstat.c b/mm/vmstat.c index 0c3b5048773e..897ea9e88238 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c | |||
@@ -321,9 +321,12 @@ static inline void mod_state(struct zone *zone, | |||
321 | /* | 321 | /* |
322 | * The fetching of the stat_threshold is racy. We may apply | 322 | * The fetching of the stat_threshold is racy. We may apply |
323 | * a counter threshold to the wrong the cpu if we get | 323 | * a counter threshold to the wrong the cpu if we get |
324 | * rescheduled while executing here. However, the following | 324 | * rescheduled while executing here. However, the next |
325 | * will apply the threshold again and therefore bring the | 325 | * counter update will apply the threshold again and |
326 | * counter under the threshold. | 326 | * therefore bring the counter under the threshold again. |
327 | * | ||
328 | * Most of the time the thresholds are the same anyways | ||
329 | * for all cpus in a zone. | ||
327 | */ | 330 | */ |
328 | t = this_cpu_read(pcp->stat_threshold); | 331 | t = this_cpu_read(pcp->stat_threshold); |
329 | 332 | ||
@@ -500,8 +503,12 @@ void refresh_cpu_vm_stats(int cpu) | |||
500 | * z = the zone from which the allocation occurred. | 503 | * z = the zone from which the allocation occurred. |
501 | * | 504 | * |
502 | * Must be called with interrupts disabled. | 505 | * Must be called with interrupts disabled. |
506 | * | ||
507 | * When __GFP_OTHER_NODE is set assume the node of the preferred | ||
508 | * zone is the local node. This is useful for daemons who allocate | ||
509 | * memory on behalf of other processes. | ||
503 | */ | 510 | */ |
504 | void zone_statistics(struct zone *preferred_zone, struct zone *z) | 511 | void zone_statistics(struct zone *preferred_zone, struct zone *z, gfp_t flags) |
505 | { | 512 | { |
506 | if (z->zone_pgdat == preferred_zone->zone_pgdat) { | 513 | if (z->zone_pgdat == preferred_zone->zone_pgdat) { |
507 | __inc_zone_state(z, NUMA_HIT); | 514 | __inc_zone_state(z, NUMA_HIT); |
@@ -509,7 +516,8 @@ void zone_statistics(struct zone *preferred_zone, struct zone *z) | |||
509 | __inc_zone_state(z, NUMA_MISS); | 516 | __inc_zone_state(z, NUMA_MISS); |
510 | __inc_zone_state(preferred_zone, NUMA_FOREIGN); | 517 | __inc_zone_state(preferred_zone, NUMA_FOREIGN); |
511 | } | 518 | } |
512 | if (z->node == numa_node_id()) | 519 | if (z->node == ((flags & __GFP_OTHER_NODE) ? |
520 | preferred_zone->node : numa_node_id())) | ||
513 | __inc_zone_state(z, NUMA_LOCAL); | 521 | __inc_zone_state(z, NUMA_LOCAL); |
514 | else | 522 | else |
515 | __inc_zone_state(z, NUMA_OTHER); | 523 | __inc_zone_state(z, NUMA_OTHER); |
@@ -940,7 +948,16 @@ static const char * const vmstat_text[] = { | |||
940 | "unevictable_pgs_cleared", | 948 | "unevictable_pgs_cleared", |
941 | "unevictable_pgs_stranded", | 949 | "unevictable_pgs_stranded", |
942 | "unevictable_pgs_mlockfreed", | 950 | "unevictable_pgs_mlockfreed", |
951 | |||
952 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
953 | "thp_fault_alloc", | ||
954 | "thp_fault_fallback", | ||
955 | "thp_collapse_alloc", | ||
956 | "thp_collapse_alloc_failed", | ||
957 | "thp_split", | ||
943 | #endif | 958 | #endif |
959 | |||
960 | #endif /* CONFIG_VM_EVENTS_COUNTERS */ | ||
944 | }; | 961 | }; |
945 | 962 | ||
946 | static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat, | 963 | static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat, |