[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Swap progress accounting
Hi,
Currently, calling swap_out() on a zone doesn't count progress, and the
result can be that you swap_out() a lot of pages, and still return "no
progress possible" to try_to_free_pages(), which in turn makes a GFP_KERNEL
allocation fail (and that can kill init).
The patch below makes it count as progress, so at least the page allocator
will keep trying harder in this case (and more importantly, will start the
io on the swappage if needed etc)
Comments?
Greetings,
Arjan van de Ven
--- linux/mm/vmscan.c.org Sun Jul 22 21:06:21 2001
+++ linux/mm/vmscan.c Sun Jul 22 21:16:41 2001
@@ -288,7 +288,7 @@
return nr;
}
-static void swap_out(zone_t *zone, unsigned int priority, int gfp_mask)
+static int swap_out(zone_t *zone, unsigned int priority, int gfp_mask)
{
int counter;
int retval = 0;
@@ -321,10 +321,11 @@
retval |= swap_out_mm(zone, mm, swap_amount(mm));
mmput(mm);
} while (--counter >= 0);
- return;
+ return retval;
empty:
spin_unlock(&mmlist_lock);
+ return retval;
}
@@ -949,7 +950,8 @@
}
/* Walk the VM space for a bit.. */
- swap_out(NULL, DEF_PRIORITY, gfp_mask);
+ if (swap_out(NULL, DEF_PRIORITY, gfp_mask))
+ count--; /* count swap progress as progress */
count -= refill_inactive_scan(NULL, DEF_PRIORITY, count);
if (count <= 0)
@@ -973,7 +975,8 @@
maxtry = (1 << DEF_PRIORITY);
do {
- swap_out(zone, DEF_PRIORITY, gfp_mask);
+ if (swap_out(zone, DEF_PRIORITY, gfp_mask))
+ count--; /* count swap progress as progress */
count -= refill_inactive_scan(zone, DEF_PRIORITY, count);
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/