diff options
author | Namhyung Kim <namhyung@gmail.com> | 2011-05-26 19:25:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-26 20:12:35 -0400 |
commit | 6a5b18d2bd79795407bf65451a2013bf4dfb588b (patch) | |
tree | 0db53d8192c1beedf1628918feb91bec93e2537f /mm | |
parent | 33278f7f0a9e5a9b29f59e07b7e3182d27769ac2 (diff) |
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: Namhyung Kim <namhyung@gmail.com>
Acked-by: KAMEZAWA 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: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/page_cgroup.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c index 5524e8bd7437..74ccff61d1be 100644 --- a/mm/page_cgroup.c +++ b/mm/page_cgroup.c | |||
@@ -492,8 +492,8 @@ int swap_cgroup_swapon(int type, unsigned long max_pages) | |||
492 | /* memory shortage */ | 492 | /* memory shortage */ |
493 | ctrl->map = NULL; | 493 | ctrl->map = NULL; |
494 | ctrl->length = 0; | 494 | ctrl->length = 0; |
495 | vfree(array); | ||
496 | mutex_unlock(&swap_cgroup_mutex); | 495 | mutex_unlock(&swap_cgroup_mutex); |
496 | vfree(array); | ||
497 | goto nomem; | 497 | goto nomem; |
498 | } | 498 | } |
499 | mutex_unlock(&swap_cgroup_mutex); | 499 | mutex_unlock(&swap_cgroup_mutex); |
@@ -508,7 +508,8 @@ nomem: | |||
508 | 508 | ||
509 | void swap_cgroup_swapoff(int type) | 509 | void swap_cgroup_swapoff(int type) |
510 | { | 510 | { |
511 | int i; | 511 | struct page **map; |
512 | unsigned long i, length; | ||
512 | struct swap_cgroup_ctrl *ctrl; | 513 | struct swap_cgroup_ctrl *ctrl; |
513 | 514 | ||
514 | if (!do_swap_account) | 515 | if (!do_swap_account) |
@@ -516,17 +517,20 @@ void swap_cgroup_swapoff(int type) | |||
516 | 517 | ||
517 | mutex_lock(&swap_cgroup_mutex); | 518 | mutex_lock(&swap_cgroup_mutex); |
518 | ctrl = &swap_cgroup_ctrl[type]; | 519 | ctrl = &swap_cgroup_ctrl[type]; |
519 | if (ctrl->map) { | 520 | map = ctrl->map; |
520 | for (i = 0; i < ctrl->length; i++) { | 521 | length = ctrl->length; |
521 | struct page *page = ctrl->map[i]; | 522 | ctrl->map = NULL; |
523 | ctrl->length = 0; | ||
524 | mutex_unlock(&swap_cgroup_mutex); | ||
525 | |||
526 | if (map) { | ||
527 | for (i = 0; i < length; i++) { | ||
528 | struct page *page = map[i]; | ||
522 | if (page) | 529 | if (page) |
523 | __free_page(page); | 530 | __free_page(page); |
524 | } | 531 | } |
525 | vfree(ctrl->map); | 532 | vfree(map); |
526 | ctrl->map = NULL; | ||
527 | ctrl->length = 0; | ||
528 | } | 533 | } |
529 | mutex_unlock(&swap_cgroup_mutex); | ||
530 | } | 534 | } |
531 | 535 | ||
532 | #endif | 536 | #endif |