96 lines
2.4 KiB
Diff
96 lines
2.4 KiB
Diff
From 4273e198ba30a1ea79be5cfe508340fb93362381 Mon Sep 17 00:00:00 2001
|
|
From: Thomas Gleixner <tglx@linutronix.de>
|
|
Date: Wed, 19 Aug 2009 09:56:42 +0200
|
|
Subject: [076/254] mm: Replace cgroup_page bit spinlock
|
|
|
|
Bit spinlocks are not working on RT. Replace them.
|
|
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
---
|
|
include/linux/page_cgroup.h | 15 +++++++++++++++
|
|
mm/page_cgroup.c | 11 +++++++++++
|
|
2 files changed, 26 insertions(+)
|
|
|
|
diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h
|
|
index a88cdba..5f0fe2d 100644
|
|
--- a/include/linux/page_cgroup.h
|
|
+++ b/include/linux/page_cgroup.h
|
|
@@ -24,6 +24,9 @@ enum {
|
|
*/
|
|
struct page_cgroup {
|
|
unsigned long flags;
|
|
+#ifdef CONFIG_PREEMPT_RT_BASE
|
|
+ spinlock_t pcg_lock;
|
|
+#endif
|
|
struct mem_cgroup *mem_cgroup;
|
|
};
|
|
|
|
@@ -74,12 +77,20 @@ static inline void lock_page_cgroup(struct page_cgroup *pc)
|
|
* Don't take this lock in IRQ context.
|
|
* This lock is for pc->mem_cgroup, USED, MIGRATION
|
|
*/
|
|
+#ifndef CONFIG_PREEMPT_RT_BASE
|
|
bit_spin_lock(PCG_LOCK, &pc->flags);
|
|
+#else
|
|
+ spin_lock(&pc->pcg_lock);
|
|
+#endif
|
|
}
|
|
|
|
static inline void unlock_page_cgroup(struct page_cgroup *pc)
|
|
{
|
|
+#ifndef CONFIG_PREEMPT_RT_BASE
|
|
bit_spin_unlock(PCG_LOCK, &pc->flags);
|
|
+#else
|
|
+ spin_unlock(&pc->pcg_lock);
|
|
+#endif
|
|
}
|
|
|
|
#else /* CONFIG_CGROUP_MEM_RES_CTLR */
|
|
@@ -102,6 +113,10 @@ static inline void __init page_cgroup_init_flatmem(void)
|
|
{
|
|
}
|
|
|
|
+static inline void page_cgroup_lock_init(struct page_cgroup *pc)
|
|
+{
|
|
+}
|
|
+
|
|
#endif /* CONFIG_CGROUP_MEM_RES_CTLR */
|
|
|
|
#include <linux/swap.h>
|
|
diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c
|
|
index 1ccbd71..84f3ce8 100644
|
|
--- a/mm/page_cgroup.c
|
|
+++ b/mm/page_cgroup.c
|
|
@@ -13,6 +13,14 @@
|
|
|
|
static unsigned long total_usage;
|
|
|
|
+static void page_cgroup_lock_init(struct page_cgroup *pc, int nr_pages)
|
|
+{
|
|
+#ifdef CONFIG_PREEMPT_RT_BASE
|
|
+ for (; nr_pages; nr_pages--, pc++)
|
|
+ spin_lock_init(&pc->pcg_lock);
|
|
+#endif
|
|
+}
|
|
+
|
|
#if !defined(CONFIG_SPARSEMEM)
|
|
|
|
|
|
@@ -60,6 +68,7 @@ static int __init alloc_node_page_cgroup(int nid)
|
|
return -ENOMEM;
|
|
NODE_DATA(nid)->node_page_cgroup = base;
|
|
total_usage += table_size;
|
|
+ page_cgroup_lock_init(base, nr_pages);
|
|
return 0;
|
|
}
|
|
|
|
@@ -150,6 +159,8 @@ static int __meminit init_section_page_cgroup(unsigned long pfn, int nid)
|
|
return -ENOMEM;
|
|
}
|
|
|
|
+ page_cgroup_lock_init(base, PAGES_PER_SECTION);
|
|
+
|
|
/*
|
|
* The passed "pfn" may not be aligned to SECTION. For the calculation
|
|
* we need to apply a mask.
|