Skip to content

Commit

Permalink
memcg: move page-freeing code out of lock
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: KAMEZAWA Hiroyuki <[email protected]>
Cc: Balbir Singh <[email protected]>
Cc: Daisuke Nishimura <[email protected]>
Cc: Michal Hocko <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
namhyung authored and torvalds committed May 27, 2011
1 parent 33278f7 commit 6a5b18d
Showing 1 changed file with 13 additions and 9 deletions.
22 changes: 13 additions & 9 deletions mm/page_cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -492,8 +492,8 @@ int swap_cgroup_swapon(int type, unsigned long max_pages)
/* memory shortage */
ctrl->map = NULL;
ctrl->length = 0;
vfree(array);
mutex_unlock(&swap_cgroup_mutex);
vfree(array);
goto nomem;
}
mutex_unlock(&swap_cgroup_mutex);
Expand All @@ -508,25 +508,29 @@ int swap_cgroup_swapon(int type, unsigned long max_pages)

void swap_cgroup_swapoff(int type)
{
int i;
struct page **map;
unsigned long i, length;
struct swap_cgroup_ctrl *ctrl;

if (!do_swap_account)
return;

mutex_lock(&swap_cgroup_mutex);
ctrl = &swap_cgroup_ctrl[type];
if (ctrl->map) {
for (i = 0; i < ctrl->length; i++) {
struct page *page = ctrl->map[i];
map = ctrl->map;
length = ctrl->length;
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)
__free_page(page);
}
vfree(ctrl->map);
ctrl->map = NULL;
ctrl->length = 0;
vfree(map);
}
mutex_unlock(&swap_cgroup_mutex);
}

#endif

0 comments on commit 6a5b18d

Please sign in to comment.