From: Hugh Dickins 2.6.5-rc3-mjb1 kswapd died with divide by zero in refill_inactive_zone, I think it must have been shortly before swapoff completed, so totalswap was low, then swap_centile = i.freeswap / (min(i.totalswap, i.totalram) / 100); is liable to divide by zero. Or would swap_centile = (i.freeswap * 100) / min(i.totalswap, i.totalram); be better? Perhaps not: I think that won't overflow (with MAX_SWAPFILES 32 plus 1 bit free for !pte_present plus 1 bit free for !pte_file), but that feels too fragile. diff -upN reference/mm/vmscan.c current/mm/vmscan.c --- reference/mm/vmscan.c 2004-04-29 10:39:19.000000000 -0700 +++ current/mm/vmscan.c 2004-04-29 10:39:19.000000000 -0700 @@ -638,7 +638,7 @@ refill_inactive_zone(struct zone *zone, mapped_ratio = (ps->nr_mapped * 100) / total_memory; si_swapinfo(&i); - if (likely(i.totalswap)) { + if (likely(i.totalswap >= 100)) { int app_centile, swap_centile; /*