|
@@ -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);
|
|
@@ -508,7 +508,8 @@ nomem:
|
|
|
|
|
|
void swap_cgroup_swapoff(int type)
|
|
|
{
|
|
|
- int i;
|
|
|
+ struct page **map;
|
|
|
+ unsigned long i, length;
|
|
|
struct swap_cgroup_ctrl *ctrl;
|
|
|
|
|
|
if (!do_swap_account)
|
|
@@ -516,17 +517,20 @@ void swap_cgroup_swapoff(int type)
|
|
|
|
|
|
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
|