We do not care about races for the expiration logic in refresh_cpu_vm_stats(). Draining is a rare act after all. No need to create too much overhead for that.
Use raw_cpu_ops there. Signed-off-by: Christoph Lameter <[email protected]> Index: linux/mm/vmstat.c =================================================================== --- linux.orig/mm/vmstat.c 2013-09-23 10:20:31.742262228 -0500 +++ linux/mm/vmstat.c 2013-09-23 10:20:31.738262268 -0500 @@ -439,6 +439,10 @@ static inline void fold_diff(int *diff) * statistics in the remote zone struct as well as the global cachelines * with the global counters. These could cause remote node cache line * bouncing and will have to be only done when necessary. + * + * Note that we have to use raw_cpu ops here. The thread is pinned + * to a specific processor but the preempt checking logic does not + * know about this. */ static void refresh_cpu_vm_stats(void) { @@ -459,7 +463,7 @@ static void refresh_cpu_vm_stats(void) global_diff[i] += v; #ifdef CONFIG_NUMA /* 3 seconds idle till flush */ - __this_cpu_write(p->expire, 3); + raw_cpu_write(p->expire, 3); #endif } } @@ -472,23 +476,23 @@ static void refresh_cpu_vm_stats(void) * Check if there are pages remaining in this pageset * if not then there is nothing to expire. */ - if (!__this_cpu_read(p->expire) || - !__this_cpu_read(p->pcp.count)) + if (!raw_cpu_read(p->expire) || + !raw_cpu_read(p->pcp.count)) continue; /* * We never drain zones local to this processor. */ if (zone_to_nid(zone) == numa_node_id()) { - __this_cpu_write(p->expire, 0); + raw_cpu_write(p->expire, 0); continue; } - if (__this_cpu_dec_return(p->expire)) + if (raw_cpu_dec_return(p->expire)) continue; - if (__this_cpu_read(p->pcp.count)) + if (raw_cpu_read(p->pcp.count)) drain_zone_pages(zone, __this_cpu_ptr(&p->pcp)); #endif } -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

