From: Li Zefan <lizf@cn.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, "hugh@veritas.com" <hugh@veritas.com>
Subject: Re: [PATCH 6/7] memcg: speed up by percpu
Date: Mon, 17 Mar 2008 12:03:26 +0900 [thread overview]
Message-ID: <47DDDF7E.7030804@cn.fujitsu.com> (raw)
In-Reply-To: <20080314191852.50b4b569.kamezawa.hiroyu@jp.fujitsu.com>
KAMEZAWA Hiroyuki wrote:
> This patch adds per-cpu look up cache for get_page_cgroup().
> Works well when nearby pages are accessed continuously.
> (And it's an usual case under buddy allocator.
>
> Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
>
>
> include/linux/page_cgroup.h | 37 +++++++++++++++++++++++++++++++++++--
> mm/page_cgroup.c | 26 +++++++++++++++++++++-----
> 2 files changed, 56 insertions(+), 7 deletions(-)
>
> Index: mm-2.6.25-rc5-mm1/mm/page_cgroup.c
> ===================================================================
> --- mm-2.6.25-rc5-mm1.orig/mm/page_cgroup.c
> +++ mm-2.6.25-rc5-mm1/mm/page_cgroup.c
> @@ -17,11 +17,10 @@
> #include <linux/memcontrol.h>
> #include <linux/page_cgroup.h>
> #include <linux/err.h>
> +#include <linux/interrupt.h>
>
>
> -
> -#define PCGRP_SHIFT (CONFIG_CGROUP_PAGE_CGROUP_ORDER)
> -#define PCGRP_SIZE (1 << PCGRP_SHIFT)
> +DEFINE_PER_CPU(struct page_cgroup_cache, pcpu_page_cgroup_cache);
>
> struct page_cgroup_head {
> struct page_cgroup pc[PCGRP_SIZE];
> @@ -71,6 +70,19 @@ void free_page_cgroup(struct page_cgroup
> }
>
>
redundant empty line.
> +static void save_result(struct page_cgroup *base, unsigned long idx)
> +{
> + int hash = idx & (PAGE_CGROUP_NR_CACHE - 1);
> + struct page_cgroup_cache *pcp;
> + /* look up is done under preempt_disable(). then, don't call
> + this under interrupt(). */
> + preempt_disable();
> + pcp = &__get_cpu_var(pcpu_page_cgroup_cache);
> + pcp->ents[hash].idx = idx;
> + pcp->ents[hash].base = base;
> + preempt_enable();
> +}
> +
> /*
> * Look up page_cgroup struct for struct page (page's pfn)
> * if (allocate == true), look up and allocate new one if necessary.
> @@ -78,7 +90,7 @@ void free_page_cgroup(struct page_cgroup
> */
>
> struct page_cgroup *
> -get_page_cgroup(struct page *page, gfp_t gfpmask, bool allocate)
> +__get_page_cgroup(struct page *page, gfp_t gfpmask, bool allocate)
> {
> struct page_cgroup_root *root;
> struct page_cgroup_head *head;
> @@ -107,8 +119,12 @@ retry:
> head = radix_tree_lookup(&root->root_node, idx);
> rcu_read_unlock();
>
> - if (likely(head))
> + if (likely(head)) {
> + if (!in_interrupt())
> + save_result(&head->pc[0], idx);
> return &head->pc[pfn - base_pfn];
> + }
> +
> if (allocate == false)
> return NULL;
>
> Index: mm-2.6.25-rc5-mm1/include/linux/page_cgroup.h
> ===================================================================
> --- mm-2.6.25-rc5-mm1.orig/include/linux/page_cgroup.h
> +++ mm-2.6.25-rc5-mm1/include/linux/page_cgroup.h
> @@ -25,6 +25,20 @@ struct page_cgroup {
> #define PAGE_CGROUP_FLAG_ACTIVE (0x2) /* is on active list */
> #define PAGE_CGROUP_FLAG_MIGRATION (0x4) /* is on active list */
>
> +/* per cpu cashing for fast access */
> +#define PAGE_CGROUP_NR_CACHE (0x8)
> +struct page_cgroup_cache {
> + struct {
> + unsigned long idx;
> + struct page_cgroup *base;
> + } ents[PAGE_CGROUP_NR_CACHE];
> +};
> +
> +DECLARE_PER_CPU(struct page_cgroup_cache, pcpu_page_cgroup_cache);
> +
> +#define PCGRP_SHIFT (CONFIG_CGROUP_PAGE_CGROUP_ORDER)
> +#define PCGRP_SIZE (1 << PCGRP_SHIFT)
> +
> /*
> * Lookup and return page_cgroup struct.
> * returns NULL when
> @@ -33,9 +47,28 @@ struct page_cgroup {
> * return -ENOMEM if cannot allocate memory.
> * If allocate==false, gfpmask will be ignored as a result.
> */
> -
> struct page_cgroup *
> -get_page_cgroup(struct page *page, gfp_t gfpmask, bool allocate);
> +__get_page_cgroup(struct page *page, gfp_t gfpmask, bool allocate);
> +
> +static inline struct page_cgroup *
> +get_page_cgroup(struct page *page, gfp_t gfpmask, bool allocate)
This function is too big to be inline
> +{
> + unsigned long pfn = page_to_pfn(page);
> + struct page_cgroup_cache *pcp;
> + struct page_cgroup *ret;
> + unsigned long idx = pfn >> PCGRP_SHIFT;
> + int hnum = (idx) & (PAGE_CGROUP_NR_CACHE - 1);
> +
> + preempt_disable();
> + pcp = &__get_cpu_var(pcpu_page_cgroup_cache);
> + if (pcp->ents[hnum].idx == idx && pcp->ents[hnum].base)
> + ret = pcp->ents[hnum].base + (pfn - (idx << PCGRP_SHIFT));
> + else
> + ret = NULL;
> + preempt_enable();
> +
> + return (ret)? ret : __get_page_cgroup(page, gfpmask, allocate);
> +}
>
> #else
>
>
--
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-17 3:03 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-14 9:59 [PATCH 0/7] memcg: radix-tree page_cgroup KAMEZAWA Hiroyuki
2008-03-14 10:03 ` [PATCH 1/7] re-define page_cgroup KAMEZAWA Hiroyuki
2008-03-16 14:15 ` Balbir Singh
2008-03-18 1:10 ` KAMEZAWA Hiroyuki
2008-03-17 0:21 ` Li Zefan
2008-03-18 1:12 ` KAMEZAWA Hiroyuki
2008-03-17 2:07 ` Li Zefan
2008-03-18 1:11 ` KAMEZAWA Hiroyuki
2008-03-14 10:06 ` [PATCH 2/7] charge/uncharge KAMEZAWA Hiroyuki
2008-03-17 1:46 ` Balbir Singh
2008-03-18 1:14 ` KAMEZAWA Hiroyuki
2008-03-17 2:26 ` Li Zefan
2008-03-18 1:15 ` KAMEZAWA Hiroyuki
2008-03-14 10:07 ` [PATCH 3/7] memcg: move_lists KAMEZAWA Hiroyuki
2008-03-18 16:44 ` Balbir Singh
2008-03-19 2:34 ` KAMEZAWA Hiroyuki
2008-03-14 10:15 ` [PATCH 4/7] memcg: page migration KAMEZAWA Hiroyuki
2008-03-17 2:36 ` Li Zefan
2008-03-18 1:17 ` KAMEZAWA Hiroyuki
2008-03-18 18:11 ` Balbir Singh
2008-03-19 2:44 ` KAMEZAWA Hiroyuki
2008-03-14 10:17 ` [PATCH 5/7] radix-tree page cgroup KAMEZAWA Hiroyuki
2008-03-17 2:56 ` Li Zefan
2008-03-17 3:26 ` Li Zefan
2008-03-18 1:18 ` KAMEZAWA Hiroyuki
2008-03-18 1:23 ` KAMEZAWA Hiroyuki
2008-03-19 2:05 ` Balbir Singh
2008-03-19 2:51 ` KAMEZAWA Hiroyuki
2008-03-19 3:14 ` Balbir Singh
2008-03-19 3:24 ` KAMEZAWA Hiroyuki
2008-03-19 21:11 ` Peter Zijlstra
2008-03-20 4:45 ` KAMEZAWA Hiroyuki
2008-03-20 5:09 ` KAMEZAWA Hiroyuki
2008-03-14 10:18 ` [PATCH 6/7] memcg: speed up by percpu KAMEZAWA Hiroyuki
2008-03-17 3:03 ` Li Zefan [this message]
2008-03-18 1:25 ` KAMEZAWA Hiroyuki
2008-03-18 23:55 ` Li Zefan
2008-03-19 2:51 ` KAMEZAWA Hiroyuki
2008-03-19 21:19 ` Peter Zijlstra
2008-03-19 21:41 ` Peter Zijlstra
2008-03-20 9:08 ` Andy Whitcroft
2008-03-20 4:46 ` KAMEZAWA Hiroyuki
2008-03-14 10:22 ` [PATCH 7/7] memcg: freeing page_cgroup at suitable chance KAMEZAWA Hiroyuki
2008-03-17 3:10 ` Li Zefan
2008-03-18 1:30 ` KAMEZAWA Hiroyuki
2008-03-19 21:33 ` Peter Zijlstra
2008-03-20 5:07 ` KAMEZAWA Hiroyuki
2008-03-20 7:55 ` Peter Zijlstra
2008-03-20 14:49 ` kamezawa.hiroyu
2008-03-20 16:04 ` kamezawa.hiroyu
2008-03-20 16:09 ` Peter Zijlstra
2008-03-20 16:15 ` kamezawa.hiroyu
2008-03-15 6:15 ` [PATCH 0/7] memcg: radix-tree page_cgroup Balbir Singh
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=47DDDF7E.7030804@cn.fujitsu.com \
--to=lizf@cn.fujitsu.com \
--cc=balbir@linux.vnet.ibm.com \
--cc=hugh@veritas.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-mm@kvack.org \
--cc=xemul@openvz.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.