| From a2ed80549e96cdd31551fc9757850cb6deec710a Mon Sep 17 00:00:00 2001 |
| From: Ingo Molnar <mingo@elte.hu> |
| 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 <mingo@elte.hu> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| 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 fc5aa18..cc39100 100644 |
| --- a/mm/vmstat.c |
| +++ b/mm/vmstat.c |
| @@ -150,8 +150,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; |
| |
| @@ -162,6 +161,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); |
| |
| @@ -204,7 +204,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)++; |
| @@ -215,17 +215,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)--; |
| @@ -236,6 +247,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.1.1 |
| |