diff for duplicates of <20100302110058.GA1921@linux> diff --git a/a/1.txt b/N1/1.txt index 58988ba..a79d1c3 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -2,111 +2,111 @@ On Tue, Mar 02, 2010 at 12:04:53PM +0200, Kirill A. Shutemov wrote: [snip] > > +static inline s64 mem_cgroup_page_stat(enum mem_cgroup_page_stat_item item) > > +{ -> > + return -ENOMEM; +> > + return -ENOMEM; > > Why ENOMEM? Probably, EINVAL or ENOSYS? OK, ENOSYS is more appropriate IMHO. > > +static s64 mem_cgroup_get_local_page_stat(struct mem_cgroup *memcg, -> > + enum mem_cgroup_page_stat_item item) +> > + enum mem_cgroup_page_stat_item item) > > +{ -> > + s64 ret; +> > + s64 ret; > > + -> > + switch (item) { -> > + case MEMCG_NR_DIRTYABLE_PAGES: -> > + ret = res_counter_read_u64(&memcg->res, RES_LIMIT) - -> > + res_counter_read_u64(&memcg->res, RES_USAGE); -> > + /* Translate free memory in pages */ -> > + ret >>= PAGE_SHIFT; -> > + ret += mem_cgroup_read_stat(memcg, LRU_ACTIVE_FILE) + -> > + mem_cgroup_read_stat(memcg, LRU_INACTIVE_FILE); -> > + if (mem_cgroup_can_swap(memcg)) -> > + ret += mem_cgroup_read_stat(memcg, LRU_ACTIVE_ANON) + -> > + mem_cgroup_read_stat(memcg, LRU_INACTIVE_ANON); -> > + break; -> > + case MEMCG_NR_RECLAIM_PAGES: -> > + ret = mem_cgroup_read_stat(memcg, MEM_CGROUP_STAT_FILE_DIRTY) + -> > + mem_cgroup_read_stat(memcg, -> > + MEM_CGROUP_STAT_UNSTABLE_NFS); -> > + break; -> > + case MEMCG_NR_WRITEBACK: -> > + ret = mem_cgroup_read_stat(memcg, MEM_CGROUP_STAT_WRITEBACK); -> > + break; -> > + case MEMCG_NR_DIRTY_WRITEBACK_PAGES: -> > + ret = mem_cgroup_read_stat(memcg, MEM_CGROUP_STAT_WRITEBACK) + -> > + mem_cgroup_read_stat(memcg, -> > + MEM_CGROUP_STAT_UNSTABLE_NFS); -> > + break; -> > + default: -> > + ret = 0; -> > + WARN_ON_ONCE(1); +> > + switch (item) { +> > + case MEMCG_NR_DIRTYABLE_PAGES: +> > + ret = res_counter_read_u64(&memcg->res, RES_LIMIT) - +> > + res_counter_read_u64(&memcg->res, RES_USAGE); +> > + /* Translate free memory in pages */ +> > + ret >>= PAGE_SHIFT; +> > + ret += mem_cgroup_read_stat(memcg, LRU_ACTIVE_FILE) + +> > + mem_cgroup_read_stat(memcg, LRU_INACTIVE_FILE); +> > + if (mem_cgroup_can_swap(memcg)) +> > + ret += mem_cgroup_read_stat(memcg, LRU_ACTIVE_ANON) + +> > + mem_cgroup_read_stat(memcg, LRU_INACTIVE_ANON); +> > + break; +> > + case MEMCG_NR_RECLAIM_PAGES: +> > + ret = mem_cgroup_read_stat(memcg, MEM_CGROUP_STAT_FILE_DIRTY) + +> > + mem_cgroup_read_stat(memcg, +> > + MEM_CGROUP_STAT_UNSTABLE_NFS); +> > + break; +> > + case MEMCG_NR_WRITEBACK: +> > + ret = mem_cgroup_read_stat(memcg, MEM_CGROUP_STAT_WRITEBACK); +> > + break; +> > + case MEMCG_NR_DIRTY_WRITEBACK_PAGES: +> > + ret = mem_cgroup_read_stat(memcg, MEM_CGROUP_STAT_WRITEBACK) + +> > + mem_cgroup_read_stat(memcg, +> > + MEM_CGROUP_STAT_UNSTABLE_NFS); +> > + break; +> > + default: +> > + ret = 0; +> > + WARN_ON_ONCE(1); > > I think it's a bug, not warning. OK. -> > + } -> > + return ret; +> > + } +> > + return ret; > > +} > > + > > +static int mem_cgroup_page_stat_cb(struct mem_cgroup *mem, void *data) > > +{ -> > + struct mem_cgroup_page_stat *stat = (struct mem_cgroup_page_stat *)data; +> > + struct mem_cgroup_page_stat *stat = (struct mem_cgroup_page_stat *)data; > > + -> > + stat->value += mem_cgroup_get_local_page_stat(mem, stat->item); -> > + return 0; +> > + stat->value += mem_cgroup_get_local_page_stat(mem, stat->item); +> > + return 0; > > +} > > + > > +s64 mem_cgroup_page_stat(enum mem_cgroup_page_stat_item item) > > +{ -> > + struct mem_cgroup_page_stat stat = {}; -> > + struct mem_cgroup *memcg; +> > + struct mem_cgroup_page_stat stat = {}; +> > + struct mem_cgroup *memcg; > > + -> > + if (mem_cgroup_disabled()) -> > + return -ENOMEM; +> > + if (mem_cgroup_disabled()) +> > + return -ENOMEM; > > EINVAL/ENOSYS? OK. > -> > + rcu_read_lock(); -> > + memcg = mem_cgroup_from_task(current); -> > + if (memcg) { -> > + /* -> > + * Recursively evaulate page statistics against all cgroup -> > + * under hierarchy tree -> > + */ -> > + stat.item = item; -> > + mem_cgroup_walk_tree(memcg, &stat, mem_cgroup_page_stat_cb); -> > + } else -> > + stat.value = -ENOMEM; +> > + rcu_read_lock(); +> > + memcg = mem_cgroup_from_task(current); +> > + if (memcg) { +> > + /* +> > + * Recursively evaulate page statistics against all cgroup +> > + * under hierarchy tree +> > + */ +> > + stat.item = item; +> > + mem_cgroup_walk_tree(memcg, &stat, mem_cgroup_page_stat_cb); +> > + } else +> > + stat.value = -ENOMEM; > > ditto. OK. > -> > + rcu_read_unlock(); +> > + rcu_read_unlock(); > > + -> > + return stat.value; +> > + return stat.value; > > +} > > + -> > static int mem_cgroup_count_children_cb(struct mem_cgroup *mem, void *data) -> > { -> > int *val = data; +> > static int mem_cgroup_count_children_cb(struct mem_cgroup *mem, void *data) +> > { +> > int *val = data; > > @@ -1263,14 +1418,16 @@ static void record_last_oom(struct mem_cgroup *mem) -> > } +> > } > > -> > /* +> > /* > > - * Currently used to update mapped file statistics, but the routine can be > > - * generalized to update other statistics as well. > > + * Generalized routine to update memory cgroup statistics. -> > */ +> > */ > > -void mem_cgroup_update_file_mapped(struct page *page, int val) > > +void mem_cgroup_update_stat(struct page *page, -> > + enum mem_cgroup_stat_index idx, int val) +> > + enum mem_cgroup_stat_index idx, int val) > > EXPORT_SYMBOL_GPL(mem_cgroup_update_stat) is needed, since > it uses by filesystems. @@ -116,13 +116,13 @@ Agreed. > > +static int > > +mem_cgroup_dirty_write(struct cgroup *cgrp, struct cftype *cft, u64 val) > > +{ -> > + struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp); -> > + int type = cft->private; +> > + struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp); +> > + int type = cft->private; > > + -> > + if (cgrp->parent == NULL) -> > + return -EINVAL; -> > + if (((type == MEM_CGROUP_DIRTY_RATIO) || -> > + (type == MEM_CGROUP_DIRTY_BACKGROUND_RATIO)) && (val > 100)) +> > + if (cgrp->parent == NULL) +> > + return -EINVAL; +> > + if (((type == MEM_CGROUP_DIRTY_RATIO) || +> > + (type == MEM_CGROUP_DIRTY_BACKGROUND_RATIO)) && (val > 100)) > > Too many unnecessary brackets > @@ -134,3 +134,9 @@ OK. Thanks, -Andrea + +-- +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> diff --git a/a/content_digest b/N1/content_digest index 2f34344..b14c53f 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -20,111 +20,111 @@ "[snip]\n" "> > +static inline s64 mem_cgroup_page_stat(enum mem_cgroup_page_stat_item item)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 return -ENOMEM;\n" + "> > + return -ENOMEM;\n" "> \n" "> Why ENOMEM? Probably, EINVAL or ENOSYS?\n" "\n" "OK, ENOSYS is more appropriate IMHO.\n" "\n" "> > +static s64 mem_cgroup_get_local_page_stat(struct mem_cgroup *memcg,\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 enum mem_cgroup_page_stat_item item)\n" + "> > + enum mem_cgroup_page_stat_item item)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 s64 ret;\n" + "> > + s64 ret;\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 switch (item) {\n" - "> > + \302\240 \302\240 \302\240 case MEMCG_NR_DIRTYABLE_PAGES:\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret = res_counter_read_u64(&memcg->res, RES_LIMIT) -\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 res_counter_read_u64(&memcg->res, RES_USAGE);\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 /* Translate free memory in pages */\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret >>= PAGE_SHIFT;\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret += mem_cgroup_read_stat(memcg, LRU_ACTIVE_FILE) +\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 mem_cgroup_read_stat(memcg, LRU_INACTIVE_FILE);\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 if (mem_cgroup_can_swap(memcg))\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret += mem_cgroup_read_stat(memcg, LRU_ACTIVE_ANON) +\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 mem_cgroup_read_stat(memcg, LRU_INACTIVE_ANON);\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - "> > + \302\240 \302\240 \302\240 case MEMCG_NR_RECLAIM_PAGES:\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret = mem_cgroup_read_stat(memcg, MEM_CGROUP_STAT_FILE_DIRTY) +\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 mem_cgroup_read_stat(memcg,\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 MEM_CGROUP_STAT_UNSTABLE_NFS);\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - "> > + \302\240 \302\240 \302\240 case MEMCG_NR_WRITEBACK:\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret = mem_cgroup_read_stat(memcg, MEM_CGROUP_STAT_WRITEBACK);\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - "> > + \302\240 \302\240 \302\240 case MEMCG_NR_DIRTY_WRITEBACK_PAGES:\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret = mem_cgroup_read_stat(memcg, MEM_CGROUP_STAT_WRITEBACK) +\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 mem_cgroup_read_stat(memcg,\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 MEM_CGROUP_STAT_UNSTABLE_NFS);\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - "> > + \302\240 \302\240 \302\240 default:\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret = 0;\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 WARN_ON_ONCE(1);\n" + "> > + switch (item) {\n" + "> > + case MEMCG_NR_DIRTYABLE_PAGES:\n" + "> > + ret = res_counter_read_u64(&memcg->res, RES_LIMIT) -\n" + "> > + res_counter_read_u64(&memcg->res, RES_USAGE);\n" + "> > + /* Translate free memory in pages */\n" + "> > + ret >>= PAGE_SHIFT;\n" + "> > + ret += mem_cgroup_read_stat(memcg, LRU_ACTIVE_FILE) +\n" + "> > + mem_cgroup_read_stat(memcg, LRU_INACTIVE_FILE);\n" + "> > + if (mem_cgroup_can_swap(memcg))\n" + "> > + ret += mem_cgroup_read_stat(memcg, LRU_ACTIVE_ANON) +\n" + "> > + mem_cgroup_read_stat(memcg, LRU_INACTIVE_ANON);\n" + "> > + break;\n" + "> > + case MEMCG_NR_RECLAIM_PAGES:\n" + "> > + ret = mem_cgroup_read_stat(memcg, MEM_CGROUP_STAT_FILE_DIRTY) +\n" + "> > + mem_cgroup_read_stat(memcg,\n" + "> > + MEM_CGROUP_STAT_UNSTABLE_NFS);\n" + "> > + break;\n" + "> > + case MEMCG_NR_WRITEBACK:\n" + "> > + ret = mem_cgroup_read_stat(memcg, MEM_CGROUP_STAT_WRITEBACK);\n" + "> > + break;\n" + "> > + case MEMCG_NR_DIRTY_WRITEBACK_PAGES:\n" + "> > + ret = mem_cgroup_read_stat(memcg, MEM_CGROUP_STAT_WRITEBACK) +\n" + "> > + mem_cgroup_read_stat(memcg,\n" + "> > + MEM_CGROUP_STAT_UNSTABLE_NFS);\n" + "> > + break;\n" + "> > + default:\n" + "> > + ret = 0;\n" + "> > + WARN_ON_ONCE(1);\n" "> \n" "> I think it's a bug, not warning.\n" "\n" "OK.\n" "\n" - "> > + \302\240 \302\240 \302\240 }\n" - "> > + \302\240 \302\240 \302\240 return ret;\n" + "> > + }\n" + "> > + return ret;\n" "> > +}\n" "> > +\n" "> > +static int mem_cgroup_page_stat_cb(struct mem_cgroup *mem, void *data)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 struct mem_cgroup_page_stat *stat = (struct mem_cgroup_page_stat *)data;\n" + "> > + struct mem_cgroup_page_stat *stat = (struct mem_cgroup_page_stat *)data;\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 stat->value += mem_cgroup_get_local_page_stat(mem, stat->item);\n" - "> > + \302\240 \302\240 \302\240 return 0;\n" + "> > + stat->value += mem_cgroup_get_local_page_stat(mem, stat->item);\n" + "> > + return 0;\n" "> > +}\n" "> > +\n" "> > +s64 mem_cgroup_page_stat(enum mem_cgroup_page_stat_item item)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 struct mem_cgroup_page_stat stat = {};\n" - "> > + \302\240 \302\240 \302\240 struct mem_cgroup *memcg;\n" + "> > + struct mem_cgroup_page_stat stat = {};\n" + "> > + struct mem_cgroup *memcg;\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 if (mem_cgroup_disabled())\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 return -ENOMEM;\n" + "> > + if (mem_cgroup_disabled())\n" + "> > + return -ENOMEM;\n" "> \n" "> EINVAL/ENOSYS?\n" "\n" "OK.\n" "\n" "> \n" - "> > + \302\240 \302\240 \302\240 rcu_read_lock();\n" - "> > + \302\240 \302\240 \302\240 memcg = mem_cgroup_from_task(current);\n" - "> > + \302\240 \302\240 \302\240 if (memcg) {\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 /*\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240* Recursively evaulate page statistics against all cgroup\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240* under hierarchy tree\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240*/\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 stat.item = item;\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 mem_cgroup_walk_tree(memcg, &stat, mem_cgroup_page_stat_cb);\n" - "> > + \302\240 \302\240 \302\240 } else\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 stat.value = -ENOMEM;\n" + "> > + rcu_read_lock();\n" + "> > + memcg = mem_cgroup_from_task(current);\n" + "> > + if (memcg) {\n" + "> > + /*\n" + "> > + * Recursively evaulate page statistics against all cgroup\n" + "> > + * under hierarchy tree\n" + "> > + */\n" + "> > + stat.item = item;\n" + "> > + mem_cgroup_walk_tree(memcg, &stat, mem_cgroup_page_stat_cb);\n" + "> > + } else\n" + "> > + stat.value = -ENOMEM;\n" "> \n" "> ditto.\n" "\n" "OK.\n" "\n" "> \n" - "> > + \302\240 \302\240 \302\240 rcu_read_unlock();\n" + "> > + rcu_read_unlock();\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 return stat.value;\n" + "> > + return stat.value;\n" "> > +}\n" "> > +\n" - "> > \302\240static int mem_cgroup_count_children_cb(struct mem_cgroup *mem, void *data)\n" - "> > \302\240{\n" - "> > \302\240 \302\240 \302\240 \302\240int *val = data;\n" + "> > static int mem_cgroup_count_children_cb(struct mem_cgroup *mem, void *data)\n" + "> > {\n" + "> > int *val = data;\n" "> > @@ -1263,14 +1418,16 @@ static void record_last_oom(struct mem_cgroup *mem)\n" - "> > \302\240}\n" + "> > }\n" "> >\n" - "> > \302\240/*\n" + "> > /*\n" "> > - * Currently used to update mapped file statistics, but the routine can be\n" "> > - * generalized to update other statistics as well.\n" "> > + * Generalized routine to update memory cgroup statistics.\n" - "> > \302\240*/\n" + "> > */\n" "> > -void mem_cgroup_update_file_mapped(struct page *page, int val)\n" "> > +void mem_cgroup_update_stat(struct page *page,\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 enum mem_cgroup_stat_index idx, int val)\n" + "> > + enum mem_cgroup_stat_index idx, int val)\n" "> \n" "> EXPORT_SYMBOL_GPL(mem_cgroup_update_stat) is needed, since\n" "> it uses by filesystems.\n" @@ -134,13 +134,13 @@ "> > +static int\n" "> > +mem_cgroup_dirty_write(struct cgroup *cgrp, struct cftype *cft, u64 val)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp);\n" - "> > + \302\240 \302\240 \302\240 int type = cft->private;\n" + "> > + struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp);\n" + "> > + int type = cft->private;\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 if (cgrp->parent == NULL)\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 return -EINVAL;\n" - "> > + \302\240 \302\240 \302\240 if (((type == MEM_CGROUP_DIRTY_RATIO) ||\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 (type == MEM_CGROUP_DIRTY_BACKGROUND_RATIO)) && (val > 100))\n" + "> > + if (cgrp->parent == NULL)\n" + "> > + return -EINVAL;\n" + "> > + if (((type == MEM_CGROUP_DIRTY_RATIO) ||\n" + "> > + (type == MEM_CGROUP_DIRTY_BACKGROUND_RATIO)) && (val > 100))\n" "> \n" "> Too many unnecessary brackets\n" "> \n" @@ -151,6 +151,12 @@ "OK.\n" "\n" "Thanks,\n" - -Andrea + "-Andrea\n" + "\n" + "--\n" + "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n" + "the body to majordomo@kvack.org. For more info on Linux MM,\n" + "see: http://www.linux-mm.org/ .\n" + "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>" -02534379cbe3a2f80e457f4e79854566863420b62a2647b2d3c15ef6da4df7df +8acd810280b800d5da4e2c5a646c2d2914d617183c5cce6c3339daeaa0d4c792
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.