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>,
xemul@openvz.org,
"yamamoto@valinux.co.jp" <yamamoto@valinux.co.jp>,
menage@google.com
Subject: [-mm][PATCH 2/6] boost by per_cpu
Date: Tue, 1 Apr 2008 17:31:08 +0900 [thread overview]
Message-ID: <20080401173108.93f7400c.kamezawa.hiroyu@jp.fujitsu.com> (raw)
In-Reply-To: <20080401172837.2c92000d.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.
Changeloc v2 -> v3:
* added prefetch.
Changelog v1 -> v2:
* avoid inlining by adding function to page_cgroup.h
* set to be cacheline-aligned.
* added hashfunc() macro.
* changed what should be remembered in cache.
This version rememvers base address, not "head".
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
mm/page_cgroup.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 52 insertions(+), 3 deletions(-)
Index: mm-2.6.25-rc5-mm1-k/mm/page_cgroup.c
===================================================================
--- mm-2.6.25-rc5-mm1-k.orig/mm/page_cgroup.c
+++ mm-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,49 @@ 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;
+ prefetchw(ret);
+ }
+ 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 +170,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 +182,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 +190,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-04-01 8:31 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-01 8:28 [-mm][PATCH 0/6] memcg: radix tree page_cgroup v3 KAMEZAWA Hiroyuki
2008-04-01 8:30 ` [-mm][PATCH 1/6] memcg: radix-tree lookup for page_cgroup KAMEZAWA Hiroyuki
2008-04-01 8:31 ` KAMEZAWA Hiroyuki [this message]
2008-04-01 8:32 ` [-mm][PATCH 3/6] try_to_shirink page cgroup KAMEZAWA Hiroyuki
2008-04-01 8:33 ` [-mm][PATCH 4/6] remove unnecessary page_cgroup_zoneinfo KAMEZAWA Hiroyuki
2008-04-01 8:34 ` [-mm][PATCH 5/6] remove refcnt use mapcount KAMEZAWA Hiroyuki
2008-04-01 8:35 ` [-mm][PATCH 6/6] mem_cgroup_map/new_charge 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=20080401173108.93f7400c.kamezawa.hiroyu@jp.fujitsu.com \
--to=kamezawa.hiroyu@jp.fujitsu.com \
--cc=balbir@linux.vnet.ibm.com \
--cc=linux-mm@kvack.org \
--cc=menage@google.com \
--cc=xemul@openvz.org \
--cc=yamamoto@valinux.co.jp \
/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