diff for duplicates of <51918846.7090006@jp.fujitsu.com> diff --git a/a/1.txt b/N1/1.txt index 32d78aa..d843eed 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -3,90 +3,3 @@ But, how about starting with this simeple one for your 1st purpose ? doesn't work ? dirty ? == this patch is untested. == - -From 95e405451f56933c4777e64bb02326ec0462f7a7 Mon Sep 17 00:00:00 2001 -From: KAMEZAWA Hiroyuki <kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org> -Date: Tue, 14 May 2013 09:40:55 +0900 -Subject: [PATCH] Allow nesting lock of memcg's page stat accouting. - -Sha Zhengju and Michal Hocko pointed out that -mem_cgroup_begin/end_update_page_stat() should be nested lock. -https://lkml.org/lkml/2013/1/2/48 - -page_remove_rmap - mem_cgroup_begin_update_page_stat <<< 1 - set_page_dirty - __set_page_dirty_buffers - __set_page_dirty - mem_cgroup_begin_update_page_stat <<< 2 - move_lock_mem_cgroup - spin_lock_irqsave(&memcg->move_lock, *flags); - -This patch add a nesting functionality with per-thread counter. - -Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org> ---- - include/linux/sched.h | 1 + - mm/memcontrol.c | 22 +++++++++++++++++++++- - 2 files changed, 22 insertions(+), 1 deletions(-) - -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 84ceef5..cca3229 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1402,6 +1402,7 @@ struct task_struct { - unsigned long memsw_nr_pages; /* uncharged mem+swap usage */ - } memcg_batch; - unsigned int memcg_kmem_skip_account; -+ unsigned int memcg_page_stat_accounting; - #endif - #ifdef CONFIG_HAVE_HW_BREAKPOINT - atomic_t ptrace_bp_refcnt; -diff --git a/mm/memcontrol.c b/mm/memcontrol.c -index 357371a..152f8df 100644 ---- a/mm/memcontrol.c -+++ b/mm/memcontrol.c -@@ -2352,12 +2352,30 @@ again: - */ - if (!mem_cgroup_stolen(memcg)) - return; -+ /* -+ * In some case, we need nested lock of this. -+ * page_remove_rmap -+ * mem_cgroup_begin_update_page_stat <<< 1 -+ * set_page_dirty -+ * __set_page_dirty_buffers -+ * __set_page_dirty -+ * mem_cgroup_begin_update_page_stat <<< 2 -+ * move_lock_mem_cgroup -+ * spin_lock_irqsave(&memcg->move_lock, *flags); -+ * -+ * We avoid this deadlock by having per thread counter. -+ */ -+ if (current->memcg_page_stat_accounting > 0) { -+ current->memcg_page_stat_accounting++; -+ return; -+ } - - move_lock_mem_cgroup(memcg, flags); - if (memcg != pc->mem_cgroup || !PageCgroupUsed(pc)) { - move_unlock_mem_cgroup(memcg, flags); - goto again; - } -+ current->memcg_page_stat_accounting = 1; - *locked = true; - } - -@@ -2370,7 +2388,9 @@ void __mem_cgroup_end_update_page_stat(struct page *page, unsigned long *flags) - * lock is held because a routine modifies pc->mem_cgroup - * should take move_lock_mem_cgroup(). - */ -- move_unlock_mem_cgroup(pc->mem_cgroup, flags); -+ current->memcg_page_stat_accounting--; -+ if (!current->memcg_page_stat_accounting) -+ move_unlock_mem_cgroup(pc->mem_cgroup, flags); - } - - void mem_cgroup_update_page_stat(struct page *page, --- -1.7.4.1 diff --git a/a/content_digest b/N1/content_digest index 9b9176b..fae807f 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,109 +1,21 @@ "ref\01368421410-4795-1-git-send-email-handai.szj@taobao.com\0" - "ref\01368421410-4795-1-git-send-email-handai.szj-3b8fjiQLQpfQT0dZR+AlfA@public.gmane.org\0" - "From\0Kamezawa Hiroyuki <kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org>\0" + "From\0Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>\0" "Subject\0Re: [PATCH V2 0/3] memcg: simply lock of page stat accounting\0" "Date\0Tue, 14 May 2013 09:41:42 +0900\0" - "To\0Sha Zhengju <handai.szj-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>\0" - "Cc\0cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" - linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org - mhocko-AlSwsSmVLrQ@public.gmane.org - akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org - hughd-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org - gthelen-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org - " Sha Zhengju <handai.szj-3b8fjiQLQpfQT0dZR+AlfA@public.gmane.org>\0" + "To\0Sha Zhengju <handai.szj@gmail.com>\0" + "Cc\0cgroups@vger.kernel.org" + linux-mm@kvack.org + mhocko@suse.cz + akpm@linux-foundation.org + hughd@google.com + gthelen@google.com + " Sha Zhengju <handai.szj@taobao.com>\0" "\00:1\0" "b\0" "If you want to rewrite all things and make memcg cleaner, I don't stop it.\n" "But, how about starting with this simeple one for your 1st purpose ? \n" "doesn't work ? dirty ?\n" "\n" - "== this patch is untested. ==\n" - " \n" - "From 95e405451f56933c4777e64bb02326ec0462f7a7 Mon Sep 17 00:00:00 2001\n" - "From: KAMEZAWA Hiroyuki <kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org>\n" - "Date: Tue, 14 May 2013 09:40:55 +0900\n" - "Subject: [PATCH] Allow nesting lock of memcg's page stat accouting.\n" - "\n" - "Sha Zhengju and Michal Hocko pointed out that\n" - "mem_cgroup_begin/end_update_page_stat() should be nested lock.\n" - "https://lkml.org/lkml/2013/1/2/48\n" - "\n" - "page_remove_rmap\n" - " mem_cgroup_begin_update_page_stat\t\t<<< 1\n" - " set_page_dirty\n" - " __set_page_dirty_buffers\n" - " __set_page_dirty\n" - " mem_cgroup_begin_update_page_stat\t<<< 2\n" - " move_lock_mem_cgroup\n" - " spin_lock_irqsave(&memcg->move_lock, *flags);\n" - "\n" - "This patch add a nesting functionality with per-thread counter.\n" - "\n" - "Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org>\n" - "---\n" - " include/linux/sched.h | 1 +\n" - " mm/memcontrol.c | 22 +++++++++++++++++++++-\n" - " 2 files changed, 22 insertions(+), 1 deletions(-)\n" - "\n" - "diff --git a/include/linux/sched.h b/include/linux/sched.h\n" - "index 84ceef5..cca3229 100644\n" - "--- a/include/linux/sched.h\n" - "+++ b/include/linux/sched.h\n" - "@@ -1402,6 +1402,7 @@ struct task_struct {\n" - " \t\tunsigned long memsw_nr_pages; /* uncharged mem+swap usage */\n" - " \t} memcg_batch;\n" - " \tunsigned int memcg_kmem_skip_account;\n" - "+\tunsigned int memcg_page_stat_accounting;\n" - " #endif\n" - " #ifdef CONFIG_HAVE_HW_BREAKPOINT\n" - " \tatomic_t ptrace_bp_refcnt;\n" - "diff --git a/mm/memcontrol.c b/mm/memcontrol.c\n" - "index 357371a..152f8df 100644\n" - "--- a/mm/memcontrol.c\n" - "+++ b/mm/memcontrol.c\n" - "@@ -2352,12 +2352,30 @@ again:\n" - " \t */\n" - " \tif (!mem_cgroup_stolen(memcg))\n" - " \t\treturn;\n" - "+\t/*\n" - "+\t * In some case, we need nested lock of this.\n" - "+\t * page_remove_rmap\n" - "+\t * mem_cgroup_begin_update_page_stat\t\t<<< 1\n" - "+\t * set_page_dirty\n" - "+\t * __set_page_dirty_buffers\n" - "+\t * __set_page_dirty\n" - "+\t * mem_cgroup_begin_update_page_stat\t<<< 2\n" - "+\t * move_lock_mem_cgroup\n" - "+\t * spin_lock_irqsave(&memcg->move_lock, *flags);\n" - "+\t *\n" - "+\t * We avoid this deadlock by having per thread counter.\n" - "+\t */\n" - "+\tif (current->memcg_page_stat_accounting > 0) {\n" - "+\t\tcurrent->memcg_page_stat_accounting++;\n" - "+\t\treturn;\n" - "+\t}\n" - " \n" - " \tmove_lock_mem_cgroup(memcg, flags);\n" - " \tif (memcg != pc->mem_cgroup || !PageCgroupUsed(pc)) {\n" - " \t\tmove_unlock_mem_cgroup(memcg, flags);\n" - " \t\tgoto again;\n" - " \t}\n" - "+\tcurrent->memcg_page_stat_accounting = 1;\n" - " \t*locked = true;\n" - " }\n" - " \n" - "@@ -2370,7 +2388,9 @@ void __mem_cgroup_end_update_page_stat(struct page *page, unsigned long *flags)\n" - " \t * lock is held because a routine modifies pc->mem_cgroup\n" - " \t * should take move_lock_mem_cgroup().\n" - " \t */\n" - "-\tmove_unlock_mem_cgroup(pc->mem_cgroup, flags);\n" - "+\tcurrent->memcg_page_stat_accounting--;\n" - "+\tif (!current->memcg_page_stat_accounting)\n" - "+\t\tmove_unlock_mem_cgroup(pc->mem_cgroup, flags);\n" - " }\n" - " \n" - " void mem_cgroup_update_page_stat(struct page *page,\n" - "-- \n" - 1.7.4.1 + == this patch is untested. == -f482815781fc12096c9184ff9c5e5663d8adfbc2400d37635b89fecb8cbfd8ef +31f53ac70be3ce0f3f291e2a19d15e3957dba457daf796d10ac06eb78c35b7ef
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.