From 41a1bf7d5c1d5f10561d32a2750f9488f37336a6 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:13 -0500 Subject: [PATCH] mm: make vmstat -rt aware commit 4734c21672244d21bb667e6179c1acee54f8640d in tip. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner Signed-off-by: Paul Gortmaker --- include/linux/vmstat.h | 10 ++++++++++ mm/vmstat.c | 20 ++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index 117f0dd..1463fc7 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h @@ -78,7 +78,12 @@ DECLARE_PER_CPU(struct vm_event_state, vm_event_states); static inline void __count_vm_event(enum vm_event_item item) { +#ifdef CONFIG_PREEMPT_RT + get_cpu_var(vm_event_states).event[item]++; + put_cpu(); +#else __this_cpu_inc(vm_event_states.event[item]); +#endif } static inline void count_vm_event(enum vm_event_item item) @@ -88,7 +93,12 @@ static inline void count_vm_event(enum vm_event_item item) static inline void __count_vm_events(enum vm_event_item item, long delta) { +#ifdef CONFIG_PREEMPT_RT + get_cpu_var(vm_event_states).event[item] += delta; + put_cpu(); +#else __this_cpu_add(vm_event_states.event[item], delta); +#endif } static inline void count_vm_events(enum vm_event_item item, long delta) diff --git a/mm/vmstat.c b/mm/vmstat.c index fa12ea3..2828d29 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -151,8 +151,7 @@ static void refresh_zone_stat_thresholds(void) void __mod_zone_page_state(struct zone *zone, enum zone_stat_item item, int delta) { - struct per_cpu_pageset *pcp = this_cpu_ptr(zone->pageset); - + struct per_cpu_pageset *pcp = per_cpu_ptr(zone->pageset, get_cpu()); s8 *p = pcp->vm_stat_diff + item; long x; @@ -163,6 +162,7 @@ void __mod_zone_page_state(struct zone *zone, enum zone_stat_item item, x = 0; } *p = x; + put_cpu(); } EXPORT_SYMBOL(__mod_zone_page_state); @@ -205,7 +205,7 @@ EXPORT_SYMBOL(mod_zone_page_state); */ void __inc_zone_state(struct zone *zone, enum zone_stat_item item) { - struct per_cpu_pageset *pcp = this_cpu_ptr(zone->pageset); + struct per_cpu_pageset *pcp = per_cpu_ptr(zone->pageset, get_cpu()); s8 *p = pcp->vm_stat_diff + item; (*p)++; @@ -216,17 +216,28 @@ void __inc_zone_state(struct zone *zone, enum zone_stat_item item) zone_page_state_add(*p + overstep, zone, item); *p = -overstep; } + put_cpu(); } void __inc_zone_page_state(struct page *page, enum zone_stat_item item) { +#ifdef CONFIG_PREEMPT_RT + unsigned long flags; + struct zone *zone; + + zone = page_zone(page); + local_irq_save(flags); + __inc_zone_state(zone, item); + local_irq_restore(flags); +#else __inc_zone_state(page_zone(page), item); +#endif } EXPORT_SYMBOL(__inc_zone_page_state); void __dec_zone_state(struct zone *zone, enum zone_stat_item item) { - struct per_cpu_pageset *pcp = this_cpu_ptr(zone->pageset); + struct per_cpu_pageset *pcp = per_cpu_ptr(zone->pageset, get_cpu()); s8 *p = pcp->vm_stat_diff + item; (*p)--; @@ -237,6 +248,7 @@ void __dec_zone_state(struct zone *zone, enum zone_stat_item item) zone_page_state_add(*p - overstep, zone, item); *p = overstep; } + put_cpu(); } void __dec_zone_page_state(struct page *page, enum zone_stat_item item) -- 1.7.0.4