From: Greg Thelen <gthelen@google.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
containers@lists.osdl.org, Andrea Righi <arighi@develer.com>,
Balbir Singh <balbir@linux.vnet.ibm.com>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>,
Greg Thelen <gthelen@google.com>
Subject: [PATCH 07/10] memcg: add dirty limits to mem_cgroup
Date: Sun, 3 Oct 2010 23:58:02 -0700 [thread overview]
Message-ID: <1286175485-30643-8-git-send-email-gthelen@google.com> (raw)
In-Reply-To: <1286175485-30643-1-git-send-email-gthelen@google.com>
Extend mem_cgroup to contain dirty page limits. Also add routines
allowing the kernel to query the dirty usage of a memcg.
These interfaces not used by the kernel yet. A subsequent commit
will add kernel calls to utilize these new routines.
Signed-off-by: Greg Thelen <gthelen@google.com>
Signed-off-by: Andrea Righi <arighi@develer.com>
---
include/linux/memcontrol.h | 44 +++++++++++
mm/memcontrol.c | 180 +++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 223 insertions(+), 1 deletions(-)
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index 6303da1..dc8952d 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -19,6 +19,7 @@
#ifndef _LINUX_MEMCONTROL_H
#define _LINUX_MEMCONTROL_H
+#include <linux/writeback.h>
#include <linux/cgroup.h>
struct mem_cgroup;
struct page_cgroup;
@@ -33,6 +34,30 @@ enum mem_cgroup_write_page_stat_item {
MEMCG_NR_FILE_UNSTABLE_NFS, /* # of NFS unstable pages */
};
+/* Cgroup memory statistics items exported to the kernel */
+enum mem_cgroup_read_page_stat_item {
+ MEMCG_NR_DIRTYABLE_PAGES,
+ MEMCG_NR_RECLAIM_PAGES,
+ MEMCG_NR_WRITEBACK,
+ MEMCG_NR_DIRTY_WRITEBACK_PAGES,
+};
+
+/* Dirty memory parameters */
+struct vm_dirty_param {
+ int dirty_ratio;
+ int dirty_background_ratio;
+ unsigned long dirty_bytes;
+ unsigned long dirty_background_bytes;
+};
+
+static inline void get_global_vm_dirty_param(struct vm_dirty_param *param)
+{
+ param->dirty_ratio = vm_dirty_ratio;
+ param->dirty_bytes = vm_dirty_bytes;
+ param->dirty_background_ratio = dirty_background_ratio;
+ param->dirty_background_bytes = dirty_background_bytes;
+}
+
extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan,
struct list_head *dst,
unsigned long *scanned, int order,
@@ -145,6 +170,10 @@ static inline void mem_cgroup_dec_page_stat(struct page *page,
mem_cgroup_update_page_stat(page, idx, -1);
}
+bool mem_cgroup_has_dirty_limit(void);
+void get_vm_dirty_param(struct vm_dirty_param *param);
+s64 mem_cgroup_page_stat(enum mem_cgroup_read_page_stat_item item);
+
unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
gfp_t gfp_mask);
u64 mem_cgroup_get_limit(struct mem_cgroup *mem);
@@ -326,6 +355,21 @@ static inline void mem_cgroup_dec_page_stat(struct page *page,
{
}
+static inline bool mem_cgroup_has_dirty_limit(void)
+{
+ return false;
+}
+
+static inline void get_vm_dirty_param(struct vm_dirty_param *param)
+{
+ get_global_vm_dirty_param(param);
+}
+
+static inline s64 mem_cgroup_page_stat(enum mem_cgroup_read_page_stat_item item)
+{
+ return -ENOSYS;
+}
+
static inline
unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
gfp_t gfp_mask)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index f40839f..6ec2625 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -233,6 +233,10 @@ struct mem_cgroup {
atomic_t refcnt;
unsigned int swappiness;
+
+ /* control memory cgroup dirty pages */
+ struct vm_dirty_param dirty_param;
+
/* OOM-Killer disable */
int oom_kill_disable;
@@ -1132,6 +1136,172 @@ static unsigned int get_swappiness(struct mem_cgroup *memcg)
return swappiness;
}
+/*
+ * Returns a snapshot of the current dirty limits which is not synchronized with
+ * the routines that change the dirty limits. If this routine races with an
+ * update to the dirty bytes/ratio value, then the caller must handle the case
+ * where both dirty_[background_]_ratio and _bytes are set.
+ */
+static void __mem_cgroup_get_dirty_param(struct vm_dirty_param *param,
+ struct mem_cgroup *mem)
+{
+ if (mem && !mem_cgroup_is_root(mem)) {
+ param->dirty_ratio = mem->dirty_param.dirty_ratio;
+ param->dirty_bytes = mem->dirty_param.dirty_bytes;
+ param->dirty_background_ratio =
+ mem->dirty_param.dirty_background_ratio;
+ param->dirty_background_bytes =
+ mem->dirty_param.dirty_background_bytes;
+ } else {
+ get_global_vm_dirty_param(param);
+ }
+}
+
+/*
+ * Get dirty memory parameters of the current memcg or global values (if memory
+ * cgroups are disabled or querying the root cgroup).
+ */
+void get_vm_dirty_param(struct vm_dirty_param *param)
+{
+ struct mem_cgroup *memcg;
+
+ if (mem_cgroup_disabled()) {
+ get_global_vm_dirty_param(param);
+ return;
+ }
+
+ /*
+ * It's possible that "current" may be moved to other cgroup while we
+ * access cgroup. But precise check is meaningless because the task can
+ * be moved after our access and writeback tends to take long time. At
+ * least, "memcg" will not be freed under rcu_read_lock().
+ */
+ rcu_read_lock();
+ memcg = mem_cgroup_from_task(current);
+ __mem_cgroup_get_dirty_param(param, memcg);
+ rcu_read_unlock();
+}
+
+/*
+ * Check if current memcg has local dirty limits. Return true if the current
+ * memory cgroup has local dirty memory settings.
+ */
+bool mem_cgroup_has_dirty_limit(void)
+{
+ struct mem_cgroup *mem;
+
+ if (mem_cgroup_disabled())
+ return false;
+
+ mem = mem_cgroup_from_task(current);
+ return mem && !mem_cgroup_is_root(mem);
+}
+
+static inline bool mem_cgroup_can_swap(struct mem_cgroup *memcg)
+{
+ if (!do_swap_account)
+ return nr_swap_pages > 0;
+ return !memcg->memsw_is_minimum &&
+ (res_counter_read_u64(&memcg->memsw, RES_LIMIT) > 0);
+}
+
+static s64 mem_cgroup_get_local_page_stat(struct mem_cgroup *mem,
+ enum mem_cgroup_read_page_stat_item item)
+{
+ s64 ret;
+
+ switch (item) {
+ case MEMCG_NR_DIRTYABLE_PAGES:
+ ret = mem_cgroup_read_stat(mem, LRU_ACTIVE_FILE) +
+ mem_cgroup_read_stat(mem, LRU_INACTIVE_FILE);
+ if (mem_cgroup_can_swap(mem))
+ ret += mem_cgroup_read_stat(mem, LRU_ACTIVE_ANON) +
+ mem_cgroup_read_stat(mem, LRU_INACTIVE_ANON);
+ break;
+ case MEMCG_NR_RECLAIM_PAGES:
+ ret = mem_cgroup_read_stat(mem, MEM_CGROUP_STAT_FILE_DIRTY) +
+ mem_cgroup_read_stat(mem,
+ MEM_CGROUP_STAT_FILE_UNSTABLE_NFS);
+ break;
+ case MEMCG_NR_WRITEBACK:
+ ret = mem_cgroup_read_stat(mem, MEM_CGROUP_STAT_FILE_WRITEBACK);
+ break;
+ case MEMCG_NR_DIRTY_WRITEBACK_PAGES:
+ ret = mem_cgroup_read_stat(mem,
+ MEM_CGROUP_STAT_FILE_WRITEBACK) +
+ mem_cgroup_read_stat(mem,
+ MEM_CGROUP_STAT_FILE_UNSTABLE_NFS);
+ break;
+ default:
+ BUG();
+ break;
+ }
+ return ret;
+}
+
+static unsigned long long
+memcg_get_hierarchical_free_pages(struct mem_cgroup *mem)
+{
+ struct cgroup *cgroup;
+ unsigned long long min_free, free;
+
+ min_free = res_counter_read_u64(&mem->res, RES_LIMIT) -
+ res_counter_read_u64(&mem->res, RES_USAGE);
+ cgroup = mem->css.cgroup;
+ if (!mem->use_hierarchy)
+ goto out;
+
+ while (cgroup->parent) {
+ cgroup = cgroup->parent;
+ mem = mem_cgroup_from_cont(cgroup);
+ if (!mem->use_hierarchy)
+ break;
+ free = res_counter_read_u64(&mem->res, RES_LIMIT) -
+ res_counter_read_u64(&mem->res, RES_USAGE);
+ min_free = min(min_free, free);
+ }
+out:
+ /* Translate free memory in pages */
+ return min_free >> PAGE_SHIFT;
+}
+
+/*
+ * mem_cgroup_page_stat() - get memory cgroup file cache statistics
+ * @item: memory statistic item exported to the kernel
+ *
+ * Return the accounted statistic value.
+ */
+s64 mem_cgroup_page_stat(enum mem_cgroup_read_page_stat_item item)
+{
+ struct mem_cgroup *mem;
+ struct mem_cgroup *iter;
+ s64 value;
+
+ rcu_read_lock();
+ mem = mem_cgroup_from_task(current);
+ if (mem && !mem_cgroup_is_root(mem)) {
+ /*
+ * If we're looking for dirtyable pages we need to evaluate
+ * free pages depending on the limit and usage of the parents
+ * first of all.
+ */
+ if (item == MEMCG_NR_DIRTYABLE_PAGES)
+ value = memcg_get_hierarchical_free_pages(mem);
+ else
+ value = 0;
+ /*
+ * Recursively evaluate page statistics against all cgroup
+ * under hierarchy tree
+ */
+ for_each_mem_cgroup_tree(iter, mem)
+ value += mem_cgroup_get_local_page_stat(iter, item);
+ } else
+ value = -EINVAL;
+ rcu_read_unlock();
+
+ return value;
+}
+
static void mem_cgroup_start_move(struct mem_cgroup *mem)
{
int cpu;
@@ -4444,8 +4614,16 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
spin_lock_init(&mem->reclaim_param_lock);
INIT_LIST_HEAD(&mem->oom_notify);
- if (parent)
+ if (parent) {
mem->swappiness = get_swappiness(parent);
+ __mem_cgroup_get_dirty_param(&mem->dirty_param, parent);
+ } else {
+ /*
+ * The root cgroup dirty_param field is not used, instead,
+ * system-wide dirty limits are used.
+ */
+ }
+
atomic_set(&mem->refcnt, 1);
mem->move_charge_at_immigrate = 0;
mutex_init(&mem->thresholds_lock);
--
1.7.1
--
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>
WARNING: multiple messages have this Message-ID (diff)
From: Greg Thelen <gthelen@google.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
containers@lists.osdl.org, Andrea Righi <arighi@develer.com>,
Balbir Singh <balbir@linux.vnet.ibm.com>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>,
Greg Thelen <gthelen@google.com>
Subject: [PATCH 07/10] memcg: add dirty limits to mem_cgroup
Date: Sun, 3 Oct 2010 23:58:02 -0700 [thread overview]
Message-ID: <1286175485-30643-8-git-send-email-gthelen@google.com> (raw)
In-Reply-To: <1286175485-30643-1-git-send-email-gthelen@google.com>
Extend mem_cgroup to contain dirty page limits. Also add routines
allowing the kernel to query the dirty usage of a memcg.
These interfaces not used by the kernel yet. A subsequent commit
will add kernel calls to utilize these new routines.
Signed-off-by: Greg Thelen <gthelen@google.com>
Signed-off-by: Andrea Righi <arighi@develer.com>
---
include/linux/memcontrol.h | 44 +++++++++++
mm/memcontrol.c | 180 +++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 223 insertions(+), 1 deletions(-)
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index 6303da1..dc8952d 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -19,6 +19,7 @@
#ifndef _LINUX_MEMCONTROL_H
#define _LINUX_MEMCONTROL_H
+#include <linux/writeback.h>
#include <linux/cgroup.h>
struct mem_cgroup;
struct page_cgroup;
@@ -33,6 +34,30 @@ enum mem_cgroup_write_page_stat_item {
MEMCG_NR_FILE_UNSTABLE_NFS, /* # of NFS unstable pages */
};
+/* Cgroup memory statistics items exported to the kernel */
+enum mem_cgroup_read_page_stat_item {
+ MEMCG_NR_DIRTYABLE_PAGES,
+ MEMCG_NR_RECLAIM_PAGES,
+ MEMCG_NR_WRITEBACK,
+ MEMCG_NR_DIRTY_WRITEBACK_PAGES,
+};
+
+/* Dirty memory parameters */
+struct vm_dirty_param {
+ int dirty_ratio;
+ int dirty_background_ratio;
+ unsigned long dirty_bytes;
+ unsigned long dirty_background_bytes;
+};
+
+static inline void get_global_vm_dirty_param(struct vm_dirty_param *param)
+{
+ param->dirty_ratio = vm_dirty_ratio;
+ param->dirty_bytes = vm_dirty_bytes;
+ param->dirty_background_ratio = dirty_background_ratio;
+ param->dirty_background_bytes = dirty_background_bytes;
+}
+
extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan,
struct list_head *dst,
unsigned long *scanned, int order,
@@ -145,6 +170,10 @@ static inline void mem_cgroup_dec_page_stat(struct page *page,
mem_cgroup_update_page_stat(page, idx, -1);
}
+bool mem_cgroup_has_dirty_limit(void);
+void get_vm_dirty_param(struct vm_dirty_param *param);
+s64 mem_cgroup_page_stat(enum mem_cgroup_read_page_stat_item item);
+
unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
gfp_t gfp_mask);
u64 mem_cgroup_get_limit(struct mem_cgroup *mem);
@@ -326,6 +355,21 @@ static inline void mem_cgroup_dec_page_stat(struct page *page,
{
}
+static inline bool mem_cgroup_has_dirty_limit(void)
+{
+ return false;
+}
+
+static inline void get_vm_dirty_param(struct vm_dirty_param *param)
+{
+ get_global_vm_dirty_param(param);
+}
+
+static inline s64 mem_cgroup_page_stat(enum mem_cgroup_read_page_stat_item item)
+{
+ return -ENOSYS;
+}
+
static inline
unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
gfp_t gfp_mask)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index f40839f..6ec2625 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -233,6 +233,10 @@ struct mem_cgroup {
atomic_t refcnt;
unsigned int swappiness;
+
+ /* control memory cgroup dirty pages */
+ struct vm_dirty_param dirty_param;
+
/* OOM-Killer disable */
int oom_kill_disable;
@@ -1132,6 +1136,172 @@ static unsigned int get_swappiness(struct mem_cgroup *memcg)
return swappiness;
}
+/*
+ * Returns a snapshot of the current dirty limits which is not synchronized with
+ * the routines that change the dirty limits. If this routine races with an
+ * update to the dirty bytes/ratio value, then the caller must handle the case
+ * where both dirty_[background_]_ratio and _bytes are set.
+ */
+static void __mem_cgroup_get_dirty_param(struct vm_dirty_param *param,
+ struct mem_cgroup *mem)
+{
+ if (mem && !mem_cgroup_is_root(mem)) {
+ param->dirty_ratio = mem->dirty_param.dirty_ratio;
+ param->dirty_bytes = mem->dirty_param.dirty_bytes;
+ param->dirty_background_ratio =
+ mem->dirty_param.dirty_background_ratio;
+ param->dirty_background_bytes =
+ mem->dirty_param.dirty_background_bytes;
+ } else {
+ get_global_vm_dirty_param(param);
+ }
+}
+
+/*
+ * Get dirty memory parameters of the current memcg or global values (if memory
+ * cgroups are disabled or querying the root cgroup).
+ */
+void get_vm_dirty_param(struct vm_dirty_param *param)
+{
+ struct mem_cgroup *memcg;
+
+ if (mem_cgroup_disabled()) {
+ get_global_vm_dirty_param(param);
+ return;
+ }
+
+ /*
+ * It's possible that "current" may be moved to other cgroup while we
+ * access cgroup. But precise check is meaningless because the task can
+ * be moved after our access and writeback tends to take long time. At
+ * least, "memcg" will not be freed under rcu_read_lock().
+ */
+ rcu_read_lock();
+ memcg = mem_cgroup_from_task(current);
+ __mem_cgroup_get_dirty_param(param, memcg);
+ rcu_read_unlock();
+}
+
+/*
+ * Check if current memcg has local dirty limits. Return true if the current
+ * memory cgroup has local dirty memory settings.
+ */
+bool mem_cgroup_has_dirty_limit(void)
+{
+ struct mem_cgroup *mem;
+
+ if (mem_cgroup_disabled())
+ return false;
+
+ mem = mem_cgroup_from_task(current);
+ return mem && !mem_cgroup_is_root(mem);
+}
+
+static inline bool mem_cgroup_can_swap(struct mem_cgroup *memcg)
+{
+ if (!do_swap_account)
+ return nr_swap_pages > 0;
+ return !memcg->memsw_is_minimum &&
+ (res_counter_read_u64(&memcg->memsw, RES_LIMIT) > 0);
+}
+
+static s64 mem_cgroup_get_local_page_stat(struct mem_cgroup *mem,
+ enum mem_cgroup_read_page_stat_item item)
+{
+ s64 ret;
+
+ switch (item) {
+ case MEMCG_NR_DIRTYABLE_PAGES:
+ ret = mem_cgroup_read_stat(mem, LRU_ACTIVE_FILE) +
+ mem_cgroup_read_stat(mem, LRU_INACTIVE_FILE);
+ if (mem_cgroup_can_swap(mem))
+ ret += mem_cgroup_read_stat(mem, LRU_ACTIVE_ANON) +
+ mem_cgroup_read_stat(mem, LRU_INACTIVE_ANON);
+ break;
+ case MEMCG_NR_RECLAIM_PAGES:
+ ret = mem_cgroup_read_stat(mem, MEM_CGROUP_STAT_FILE_DIRTY) +
+ mem_cgroup_read_stat(mem,
+ MEM_CGROUP_STAT_FILE_UNSTABLE_NFS);
+ break;
+ case MEMCG_NR_WRITEBACK:
+ ret = mem_cgroup_read_stat(mem, MEM_CGROUP_STAT_FILE_WRITEBACK);
+ break;
+ case MEMCG_NR_DIRTY_WRITEBACK_PAGES:
+ ret = mem_cgroup_read_stat(mem,
+ MEM_CGROUP_STAT_FILE_WRITEBACK) +
+ mem_cgroup_read_stat(mem,
+ MEM_CGROUP_STAT_FILE_UNSTABLE_NFS);
+ break;
+ default:
+ BUG();
+ break;
+ }
+ return ret;
+}
+
+static unsigned long long
+memcg_get_hierarchical_free_pages(struct mem_cgroup *mem)
+{
+ struct cgroup *cgroup;
+ unsigned long long min_free, free;
+
+ min_free = res_counter_read_u64(&mem->res, RES_LIMIT) -
+ res_counter_read_u64(&mem->res, RES_USAGE);
+ cgroup = mem->css.cgroup;
+ if (!mem->use_hierarchy)
+ goto out;
+
+ while (cgroup->parent) {
+ cgroup = cgroup->parent;
+ mem = mem_cgroup_from_cont(cgroup);
+ if (!mem->use_hierarchy)
+ break;
+ free = res_counter_read_u64(&mem->res, RES_LIMIT) -
+ res_counter_read_u64(&mem->res, RES_USAGE);
+ min_free = min(min_free, free);
+ }
+out:
+ /* Translate free memory in pages */
+ return min_free >> PAGE_SHIFT;
+}
+
+/*
+ * mem_cgroup_page_stat() - get memory cgroup file cache statistics
+ * @item: memory statistic item exported to the kernel
+ *
+ * Return the accounted statistic value.
+ */
+s64 mem_cgroup_page_stat(enum mem_cgroup_read_page_stat_item item)
+{
+ struct mem_cgroup *mem;
+ struct mem_cgroup *iter;
+ s64 value;
+
+ rcu_read_lock();
+ mem = mem_cgroup_from_task(current);
+ if (mem && !mem_cgroup_is_root(mem)) {
+ /*
+ * If we're looking for dirtyable pages we need to evaluate
+ * free pages depending on the limit and usage of the parents
+ * first of all.
+ */
+ if (item == MEMCG_NR_DIRTYABLE_PAGES)
+ value = memcg_get_hierarchical_free_pages(mem);
+ else
+ value = 0;
+ /*
+ * Recursively evaluate page statistics against all cgroup
+ * under hierarchy tree
+ */
+ for_each_mem_cgroup_tree(iter, mem)
+ value += mem_cgroup_get_local_page_stat(iter, item);
+ } else
+ value = -EINVAL;
+ rcu_read_unlock();
+
+ return value;
+}
+
static void mem_cgroup_start_move(struct mem_cgroup *mem)
{
int cpu;
@@ -4444,8 +4614,16 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
spin_lock_init(&mem->reclaim_param_lock);
INIT_LIST_HEAD(&mem->oom_notify);
- if (parent)
+ if (parent) {
mem->swappiness = get_swappiness(parent);
+ __mem_cgroup_get_dirty_param(&mem->dirty_param, parent);
+ } else {
+ /*
+ * The root cgroup dirty_param field is not used, instead,
+ * system-wide dirty limits are used.
+ */
+ }
+
atomic_set(&mem->refcnt, 1);
mem->move_charge_at_immigrate = 0;
mutex_init(&mem->thresholds_lock);
--
1.7.1
next prev parent reply other threads:[~2010-10-04 6:58 UTC|newest]
Thread overview: 194+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-04 6:57 [PATCH 00/10] memcg: per cgroup dirty page accounting Greg Thelen
2010-10-04 6:57 ` Greg Thelen
2010-10-04 6:57 ` [PATCH 01/10] memcg: add page_cgroup flags for dirty page tracking Greg Thelen
2010-10-04 6:57 ` Greg Thelen
2010-10-05 6:20 ` KAMEZAWA Hiroyuki
2010-10-05 6:20 ` KAMEZAWA Hiroyuki
2010-10-06 0:37 ` Daisuke Nishimura
2010-10-06 0:37 ` Daisuke Nishimura
2010-10-06 11:07 ` Balbir Singh
2010-10-06 11:07 ` Balbir Singh
2010-10-04 6:57 ` [PATCH 02/10] memcg: document cgroup dirty memory interfaces Greg Thelen
2010-10-04 6:57 ` Greg Thelen
2010-10-05 6:48 ` KAMEZAWA Hiroyuki
2010-10-05 6:48 ` KAMEZAWA Hiroyuki
2010-10-06 0:49 ` Daisuke Nishimura
2010-10-06 0:49 ` Daisuke Nishimura
2010-10-06 11:12 ` Balbir Singh
2010-10-06 11:12 ` Balbir Singh
2010-10-04 6:57 ` [PATCH 03/10] memcg: create extensible page stat update routines Greg Thelen
2010-10-04 6:57 ` Greg Thelen
2010-10-04 13:48 ` Ciju Rajan K
2010-10-04 13:48 ` Ciju Rajan K
2010-10-04 15:43 ` Greg Thelen
2010-10-04 15:43 ` Greg Thelen
2010-10-04 17:35 ` Ciju Rajan K
2010-10-04 17:35 ` Ciju Rajan K
2010-10-05 6:51 ` KAMEZAWA Hiroyuki
2010-10-05 6:51 ` KAMEZAWA Hiroyuki
2010-10-05 7:10 ` Greg Thelen
2010-10-05 7:10 ` Greg Thelen
2010-10-05 15:42 ` Minchan Kim
2010-10-05 15:42 ` Minchan Kim
2010-10-05 19:59 ` Greg Thelen
2010-10-05 19:59 ` Greg Thelen
2010-10-05 23:57 ` Minchan Kim
2010-10-05 23:57 ` Minchan Kim
2010-10-06 0:48 ` Greg Thelen
2010-10-06 0:48 ` Greg Thelen
2010-10-06 16:19 ` Balbir Singh
2010-10-06 16:19 ` Balbir Singh
2010-10-04 6:57 ` [PATCH 04/10] memcg: disable local interrupts in lock_page_cgroup() Greg Thelen
2010-10-04 6:57 ` Greg Thelen
2010-10-05 6:54 ` KAMEZAWA Hiroyuki
2010-10-05 6:54 ` KAMEZAWA Hiroyuki
2010-10-05 7:18 ` Greg Thelen
2010-10-05 7:18 ` Greg Thelen
2010-10-05 16:03 ` Minchan Kim
2010-10-05 16:03 ` Minchan Kim
2010-10-05 23:26 ` Greg Thelen
2010-10-05 23:26 ` Greg Thelen
2010-10-06 0:15 ` Minchan Kim
2010-10-06 0:15 ` Minchan Kim
2010-10-07 0:35 ` KAMEZAWA Hiroyuki
2010-10-07 0:35 ` KAMEZAWA Hiroyuki
2010-10-07 1:54 ` Daisuke Nishimura
2010-10-07 1:54 ` Daisuke Nishimura
2010-10-07 2:17 ` KAMEZAWA Hiroyuki
2010-10-07 2:17 ` KAMEZAWA Hiroyuki
2010-10-07 6:21 ` [PATCH] memcg: reduce lock time at move charge (Was " KAMEZAWA Hiroyuki
2010-10-07 6:21 ` KAMEZAWA Hiroyuki
2010-10-07 6:24 ` [PATCH] memcg: lock-free clear page writeback " KAMEZAWA Hiroyuki
2010-10-07 6:24 ` KAMEZAWA Hiroyuki
2010-10-07 9:05 ` KAMEZAWA Hiroyuki
2010-10-07 9:05 ` KAMEZAWA Hiroyuki
2010-10-07 23:35 ` Minchan Kim
2010-10-07 23:35 ` Minchan Kim
2010-10-08 4:41 ` KAMEZAWA Hiroyuki
2010-10-08 4:41 ` KAMEZAWA Hiroyuki
2010-10-08 4:41 ` KAMEZAWA Hiroyuki
2010-10-07 7:28 ` [PATCH] memcg: reduce lock time at move charge " Daisuke Nishimura
2010-10-07 7:28 ` Daisuke Nishimura
2010-10-07 7:42 ` KAMEZAWA Hiroyuki
2010-10-07 7:42 ` KAMEZAWA Hiroyuki
2010-10-07 8:04 ` [PATCH v2] " KAMEZAWA Hiroyuki
2010-10-07 8:04 ` KAMEZAWA Hiroyuki
2010-10-07 23:14 ` Andrew Morton
2010-10-07 23:14 ` Andrew Morton
2010-10-08 1:12 ` Daisuke Nishimura
2010-10-08 1:12 ` Daisuke Nishimura
2010-10-08 4:37 ` KAMEZAWA Hiroyuki
2010-10-08 4:37 ` KAMEZAWA Hiroyuki
2010-10-08 4:55 ` Andrew Morton
2010-10-08 4:55 ` Andrew Morton
2010-10-08 5:12 ` KAMEZAWA Hiroyuki
2010-10-08 5:12 ` KAMEZAWA Hiroyuki
2010-10-08 10:41 ` KAMEZAWA Hiroyuki
2010-10-08 10:41 ` KAMEZAWA Hiroyuki
2010-10-12 3:39 ` Balbir Singh
2010-10-12 3:39 ` Balbir Singh
2010-10-12 3:42 ` KAMEZAWA Hiroyuki
2010-10-12 3:42 ` KAMEZAWA Hiroyuki
2010-10-12 3:54 ` Balbir Singh
2010-10-12 3:54 ` Balbir Singh
2010-10-12 3:56 ` Daisuke Nishimura
2010-10-12 3:56 ` Daisuke Nishimura
2010-10-12 5:01 ` KAMEZAWA Hiroyuki
2010-10-12 5:01 ` KAMEZAWA Hiroyuki
2010-10-12 5:48 ` [PATCH v4] memcg: reduce lock time at move charge KAMEZAWA Hiroyuki
2010-10-12 5:48 ` KAMEZAWA Hiroyuki
2010-10-12 6:23 ` Daisuke Nishimura
2010-10-12 6:23 ` Daisuke Nishimura
2010-10-12 5:39 ` [PATCH 04/10] memcg: disable local interrupts in lock_page_cgroup() Balbir Singh
2010-10-12 5:39 ` Balbir Singh
2010-10-04 6:58 ` [PATCH 05/10] memcg: add dirty page accounting infrastructure Greg Thelen
2010-10-04 6:58 ` Greg Thelen
2010-10-05 7:22 ` KAMEZAWA Hiroyuki
2010-10-05 7:22 ` KAMEZAWA Hiroyuki
[not found] ` <20101005162205.3908952a.kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
2010-10-05 7:35 ` Greg Thelen
2010-10-05 7:35 ` Greg Thelen
2010-10-05 7:35 ` Greg Thelen
2010-10-05 16:09 ` Minchan Kim
2010-10-05 16:09 ` Minchan Kim
2010-10-05 20:06 ` Greg Thelen
2010-10-05 20:06 ` Greg Thelen
2010-10-04 6:58 ` [PATCH 06/10] memcg: add kernel calls for memcg dirty page stats Greg Thelen
2010-10-04 6:58 ` Greg Thelen
2010-10-05 6:55 ` KAMEZAWA Hiroyuki
2010-10-05 6:55 ` KAMEZAWA Hiroyuki
2010-10-04 6:58 ` Greg Thelen [this message]
2010-10-04 6:58 ` [PATCH 07/10] memcg: add dirty limits to mem_cgroup Greg Thelen
2010-10-05 7:07 ` KAMEZAWA Hiroyuki
2010-10-05 7:07 ` KAMEZAWA Hiroyuki
2010-10-05 9:43 ` Andrea Righi
2010-10-05 9:43 ` Andrea Righi
2010-10-05 19:00 ` Greg Thelen
2010-10-05 19:00 ` Greg Thelen
2010-10-07 0:13 ` KAMEZAWA Hiroyuki
2010-10-07 0:13 ` KAMEZAWA Hiroyuki
2010-10-07 0:27 ` Greg Thelen
2010-10-07 0:27 ` Greg Thelen
2010-10-07 0:48 ` KAMEZAWA Hiroyuki
2010-10-07 0:48 ` KAMEZAWA Hiroyuki
2010-10-12 0:24 ` Greg Thelen
2010-10-12 0:24 ` Greg Thelen
2010-10-12 0:55 ` KAMEZAWA Hiroyuki
2010-10-12 0:55 ` KAMEZAWA Hiroyuki
2010-10-12 7:32 ` Greg Thelen
2010-10-12 7:32 ` Greg Thelen
2010-10-12 8:38 ` KAMEZAWA Hiroyuki
2010-10-12 8:38 ` KAMEZAWA Hiroyuki
2010-10-04 6:58 ` [PATCH 08/10] memcg: add cgroupfs interface to memcg dirty limits Greg Thelen
2010-10-04 6:58 ` Greg Thelen
2010-10-05 7:13 ` KAMEZAWA Hiroyuki
2010-10-05 7:13 ` KAMEZAWA Hiroyuki
2010-10-05 7:33 ` Greg Thelen
2010-10-05 7:33 ` Greg Thelen
2010-10-05 7:31 ` KAMEZAWA Hiroyuki
2010-10-05 7:31 ` KAMEZAWA Hiroyuki
2010-10-05 9:18 ` Andrea Righi
2010-10-05 9:18 ` Andrea Righi
2010-10-05 18:31 ` David Rientjes
2010-10-05 18:31 ` David Rientjes
2010-10-06 18:34 ` Greg Thelen
2010-10-06 18:34 ` Greg Thelen
2010-10-06 20:54 ` Andrea Righi
2010-10-06 20:54 ` Andrea Righi
2010-10-06 13:30 ` Balbir Singh
2010-10-06 13:30 ` Balbir Singh
2010-10-06 13:32 ` Balbir Singh
2010-10-06 13:32 ` Balbir Singh
2010-10-06 16:21 ` Greg Thelen
2010-10-06 16:21 ` Greg Thelen
2010-10-06 16:24 ` Balbir Singh
2010-10-06 16:24 ` Balbir Singh
2010-10-07 6:23 ` Ciju Rajan K
2010-10-07 6:23 ` Ciju Rajan K
2010-10-07 17:46 ` Greg Thelen
2010-10-07 17:46 ` Greg Thelen
2010-10-04 6:58 ` [PATCH 09/10] writeback: make determine_dirtyable_memory() static Greg Thelen
2010-10-04 6:58 ` Greg Thelen
2010-10-05 7:15 ` KAMEZAWA Hiroyuki
2010-10-05 7:15 ` KAMEZAWA Hiroyuki
2010-10-04 6:58 ` [PATCH 10/10] memcg: check memcg dirty limits in page writeback Greg Thelen
2010-10-04 6:58 ` Greg Thelen
2010-10-05 7:29 ` KAMEZAWA Hiroyuki
2010-10-05 7:29 ` KAMEZAWA Hiroyuki
2010-10-06 0:32 ` Minchan Kim
2010-10-06 0:32 ` Minchan Kim
2010-10-05 4:20 ` [PATCH 00/10] memcg: per cgroup dirty page accounting Balbir Singh
2010-10-05 4:20 ` Balbir Singh
2010-10-05 4:50 ` Balbir Singh
2010-10-05 4:50 ` Balbir Singh
2010-10-05 5:50 ` Greg Thelen
2010-10-05 5:50 ` Greg Thelen
2010-10-05 8:37 ` Ciju Rajan K
2010-10-05 8:37 ` Ciju Rajan K
2010-10-05 22:15 ` Andrea Righi
2010-10-05 22:15 ` Andrea Righi
2010-10-06 3:23 ` Balbir Singh
2010-10-06 3:23 ` Balbir Singh
2010-10-18 5:56 ` KAMEZAWA Hiroyuki
2010-10-18 5:56 ` KAMEZAWA Hiroyuki
2010-10-18 18:09 ` Greg Thelen
2010-10-18 18:09 ` Greg Thelen
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=1286175485-30643-8-git-send-email-gthelen@google.com \
--to=gthelen@google.com \
--cc=akpm@linux-foundation.org \
--cc=arighi@develer.com \
--cc=balbir@linux.vnet.ibm.com \
--cc=containers@lists.osdl.org \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=nishimura@mxp.nes.nec.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 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.