Commit 6a5b18d2 authored by Namhyung Kim's avatar Namhyung Kim Committed by Linus Torvalds

memcg: move page-freeing code out of lock

Move page-freeing code out of swap_cgroup_mutex in the hope that it could
reduce few of theoretical contentions between swapons and/or swapoffs.

This is just a cleanup, no functional changes.
Signed-off-by: default avatarNamhyung Kim <namhyung@gmail.com>
Acked-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Balbir Singh <balbir@linux.vnet.ibm.com>
Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Cc: Michal Hocko <mhocko@suse.cz>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 33278f7f
...@@ -492,8 +492,8 @@ int swap_cgroup_swapon(int type, unsigned long max_pages) ...@@ -492,8 +492,8 @@ int swap_cgroup_swapon(int type, unsigned long max_pages)
/* memory shortage */ /* memory shortage */
ctrl->map = NULL; ctrl->map = NULL;
ctrl->length = 0; ctrl->length = 0;
vfree(array);
mutex_unlock(&swap_cgroup_mutex); mutex_unlock(&swap_cgroup_mutex);
vfree(array);
goto nomem; goto nomem;
} }
mutex_unlock(&swap_cgroup_mutex); mutex_unlock(&swap_cgroup_mutex);
...@@ -508,7 +508,8 @@ int swap_cgroup_swapon(int type, unsigned long max_pages) ...@@ -508,7 +508,8 @@ int swap_cgroup_swapon(int type, unsigned long max_pages)
void swap_cgroup_swapoff(int type) void swap_cgroup_swapoff(int type)
{ {
int i; struct page **map;
unsigned long i, length;
struct swap_cgroup_ctrl *ctrl; struct swap_cgroup_ctrl *ctrl;
if (!do_swap_account) if (!do_swap_account)
...@@ -516,17 +517,20 @@ void swap_cgroup_swapoff(int type) ...@@ -516,17 +517,20 @@ void swap_cgroup_swapoff(int type)
mutex_lock(&swap_cgroup_mutex); mutex_lock(&swap_cgroup_mutex);
ctrl = &swap_cgroup_ctrl[type]; ctrl = &swap_cgroup_ctrl[type];
if (ctrl->map) { map = ctrl->map;
for (i = 0; i < ctrl->length; i++) { length = ctrl->length;
struct page *page = ctrl->map[i]; ctrl->map = NULL;
ctrl->length = 0;
mutex_unlock(&swap_cgroup_mutex);
if (map) {
for (i = 0; i < length; i++) {
struct page *page = map[i];
if (page) if (page)
__free_page(page); __free_page(page);
} }
vfree(ctrl->map); vfree(map);
ctrl->map = NULL;
ctrl->length = 0;
} }
mutex_unlock(&swap_cgroup_mutex);
} }
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment