[PATCH] pagevec freeze

Hugh Dickins (hugh@veritas.com)
Tue, 15 Oct 2002 22:03:22 +0100 (BST)


refill_inactive_zone stuck circling the one-page active_list with
lru_lock and interrupts disabled, if concurrent release_pages has
done its put_page_testzero and is now spinning for that lru_lock.

(I haven't done a patch for include/linux/pagevec.h, but when working
on this freeze, I noticed that pagevec_add becomes rather unfriendly
once you get into NMIs and BUGs - overshoots PAGEVEC_SIZE and corrupts
beyond. Perhaps you'd say all bets are off then anyway, or perhaps
pagevec_space should be signed, and tested before rather than after?)

--- 2.5.42-mm3/mm/vmscan.c Tue Oct 15 06:43:41 2002
+++ linux/mm/vmscan.c Tue Oct 15 13:14:35 2002
@@ -542,10 +542,13 @@
long mapped_ratio;
long distress;
long swap_tendency;
+ int max_scan;

lru_add_drain();
spin_lock_irq(&zone->lru_lock);
- while (nr_pages && !list_empty(&zone->active_list)) {
+ max_scan = zone->nr_active;
+ while (max_scan && nr_pages && !list_empty(&zone->active_list)) {
+ max_scan--;
page = list_entry(zone->active_list.prev, struct page, lru);
prefetchw_prev_lru_page(page, &zone->active_list, flags);
if (!TestClearPageLRU(page))

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/