summaryrefslogtreecommitdiff
path: root/mm/swapfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/swapfile.c')
-rw-r--r--mm/swapfile.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/mm/swapfile.c b/mm/swapfile.c
index d12332423a06..8116f36e440b 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -1387,9 +1387,10 @@ static bool swap_sync_discard(void)
bool ret = false;
struct swap_info_struct *si, *next;
- spin_lock(&swap_avail_lock);
- plist_for_each_entry_safe(si, next, &swap_avail_head, avail_list) {
- spin_unlock(&swap_avail_lock);
+ spin_lock(&swap_lock);
+start_over:
+ plist_for_each_entry_safe(si, next, &swap_active_head, list) {
+ spin_unlock(&swap_lock);
if (get_swap_device_info(si)) {
if (si->flags & SWP_PAGE_DISCARD)
ret = swap_do_scheduled_discard(si);
@@ -1397,9 +1398,12 @@ static bool swap_sync_discard(void)
}
if (ret)
return true;
- spin_lock(&swap_avail_lock);
+
+ spin_lock(&swap_lock);
+ if (plist_node_empty(&next->list))
+ goto start_over;
}
- spin_unlock(&swap_avail_lock);
+ spin_unlock(&swap_lock);
return false;
}