blob: d63e0615284bdad09ba3c545dfdf61b3bc745f9b [file] [log] [blame]
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