From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
To: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: "linux-mm@kvack.org" <linux-mm@kvack.org>,
"balbir@linux.vnet.ibm.com" <balbir@linux.vnet.ibm.com>,
lizf@cn.fujitsu.com, a.p.zijlstra@chello.nl
Subject: [-mm] [PATCH 2/4] memcg: boost by percpu
Date: Thu, 27 Mar 2008 17:49:25 +0900 [thread overview]
Message-ID: <20080327174925.b79de070.kamezawa.hiroyu@jp.fujitsu.com> (raw)
In-Reply-To: <20080327174435.e69f5b45.kamezawa.hiroyu@jp.fujitsu.com>
This patch adds per-cpu look up cache for get_page_cgroup().
Works well when nearby pages are accessed continuously.
Changelog v1 -> v2:
* avoid inlining by adding function to page_cgroup.h
* set to be cacheline-aligned.
* added hashfunc() macro.
* changed what should be recorded in cache.
This version rememveres pre-caluculated base address, not "head".
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
mm/page_cgroup.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 50 insertions(+), 3 deletions(-)
Index: linux-2.6.25-rc5-mm1-k/mm/page_cgroup.c
===================================================================
--- linux-2.6.25-rc5-mm1-k.orig/mm/page_cgroup.c
+++ linux-2.6.25-rc5-mm1-k/mm/page_cgroup.c
@@ -26,6 +26,7 @@
#include <linux/slab.h>
#include <linux/radix-tree.h>
#include <linux/memcontrol.h>
+#include <linux/interrupt.h>
#include <linux/err.h>
static int page_cgroup_order __read_mostly;
@@ -80,6 +81,47 @@ init_page_cgroup_head(struct page_cgroup
}
}
+#define PCGRP_CACHE_SIZE (0x10)
+#define PCGRP_CACHE_MASK (PCGRP_CACHE_SIZE - 1)
+struct page_cgroup_cache {
+ struct {
+ unsigned long idx;
+ struct page_cgroup *base;
+ } ents[PCGRP_CACHE_SIZE];
+};
+DEFINE_PER_CPU(struct page_cgroup_cache, pcpu_pcgroup_cache) ____cacheline_aligned;
+
+#define hashfunc(idx) ((idx) & PCGRP_CACHE_MASK)
+
+static struct page_cgroup *pcp_lookup(unsigned long pfn, unsigned long idx)
+{
+ struct page_cgroup *ret = NULL;
+ struct page_cgroup_cache *pcp;
+ int hnum = hashfunc(idx);
+
+ pcp = &get_cpu_var(pcpu_pcgroup_cache);
+ if (pcp->ents[hnum].idx == idx && pcp->ents[hnum].base)
+ ret = pcp->ents[hnum].base + pfn;
+ put_cpu_var(pcpu_pcgroup_cache);
+ return ret;
+}
+
+static void cache_result(unsigned long idx, struct page_cgroup_head *head)
+{
+ struct page_cgroup_cache *pcp;
+ int hnum = hashfunc(idx);
+
+ /*
+ * Because look up is done under preempt_disable, don't modifies
+ * an entry in interrupt.
+ */
+ if (in_interrupt())
+ return;
+ pcp = &get_cpu_var(pcpu_pcgroup_cache);
+ pcp->ents[hnum].idx = idx;
+ pcp->ents[hnum].base = &head->pc[0] - (idx << PCGRP_SHIFT);
+ put_cpu_var(pcpu_pcgroup_cache);
+}
struct kmem_cache *page_cgroup_cachep;
@@ -126,6 +168,11 @@ struct page_cgroup *get_page_cgroup(stru
struct page_cgroup *ret = NULL;
unsigned long pfn, idx;
+ pfn = page_to_pfn(page);
+ idx = pfn >> PCGRP_SHIFT;
+ ret = pcp_lookup(pfn, idx);
+ if (ret)
+ return ret;
/*
* NULL can be returned before initialization
*/
@@ -133,8 +180,6 @@ struct page_cgroup *get_page_cgroup(stru
if (unlikely(!root))
return ret;
- pfn = page_to_pfn(page);
- idx = pfn >> PCGRP_SHIFT;
/*
* We don't need lock here because no one deletes this head.
* (Freeing routtine will be added later.)
@@ -143,8 +188,10 @@ struct page_cgroup *get_page_cgroup(stru
head = radix_tree_lookup(&root->root_node, idx);
rcu_read_unlock();
- if (likely(head))
+ if (likely(head)) {
+ cache_result(idx, head);
ret = &head->pc[pfn & PCGRP_MASK];
+ }
return ret;
}
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2008-03-27 8:49 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-27 8:44 [-mm] [PATCH 0/4] memcg : radix-tree page_cgroup v2 KAMEZAWA Hiroyuki
2008-03-27 8:47 ` [-mm] [PATCH 1/4] memcg : radix-tree page_cgroup KAMEZAWA Hiroyuki
2008-03-28 0:55 ` Li Zefan
2008-03-28 1:13 ` KAMEZAWA Hiroyuki
2008-03-27 8:49 ` KAMEZAWA Hiroyuki [this message]
2008-03-27 8:50 ` [-mm] [PATCH 3/4] memcg : shirink page cgroup KAMEZAWA Hiroyuki
2008-03-27 8:51 ` [-mm] [PATCH 4/4] memcg : radix-tree page_cgroup v2 KAMEZAWA Hiroyuki
2008-03-27 8:53 ` KAMEZAWA Hiroyuki
2008-03-27 9:12 ` [-mm] [PATCH 0/4] " KOSAKI Motohiro
2008-03-27 9:34 ` KAMEZAWA Hiroyuki
2008-03-27 9:53 ` Balbir Singh
2008-03-27 10:19 ` KAMEZAWA Hiroyuki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080327174925.b79de070.kamezawa.hiroyu@jp.fujitsu.com \
--to=kamezawa.hiroyu@jp.fujitsu.com \
--cc=a.p.zijlstra@chello.nl \
--cc=balbir@linux.vnet.ibm.com \
--cc=linux-mm@kvack.org \
--cc=lizf@cn.fujitsu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox