int order = swap_entry_order(entry_order);
unsigned long size = 1 << order;
struct swap_info_struct *si, *next;
- long avail_pgs;
int n_ret = 0;
int node;
spin_lock(&swap_avail_lock);
-
- avail_pgs = atomic_long_read(&nr_swap_pages) / size;
- if (avail_pgs <= 0) {
- spin_unlock(&swap_avail_lock);
- goto noswap;
- }
-
- n_goal = min3((long)n_goal, (long)SWAP_BATCH, avail_pgs);
-
- atomic_long_sub(n_goal * size, &nr_swap_pages);
-
start_over:
node = numa_node_id();
plist_for_each_entry_safe(si, next, &swap_avail_heads[node], avail_lists[node]) {
spin_unlock(&swap_avail_lock);
check_out:
- if (n_ret < n_goal)
- atomic_long_add((long)(n_goal - n_ret) * size,
- &nr_swap_pages);
-noswap:
+ atomic_long_sub(n_ret * size, &nr_swap_pages);
+
return n_ret;
}