summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morton <akpm@zip.com.au>2002-08-19 06:04:50 -0700
committerOleg Drokin <green@angband.namesys.com>2002-08-19 06:04:50 -0700
commit891975a10ed395bf2997c75e2a6776523404a0ef (patch)
treeb6a5d6b1147eec5dd8bfe06ca81c2422a2007458
parent9bdedfceabd0892444c6581997a34278e41fd80d (diff)
[PATCH] fix uniprocessor lockups
I have a test_and_set_bit(PG_chainlock, page->flags) in page reclaim. Which works fine on SMP. But on uniprocessor, we made pte_chain_unlock() a no-op, so all pages end up with PG_chainlock set. refill_inactive() cannot move any pages onto the inactive list and the machine dies. The patch removes the test_and_set_bit optimisation in there and just uses pte_chain_lock(). If we want that (dubious) optimisation back then let's do it right and create pte_chain_trylock().
-rw-r--r--mm/vmscan.c5
1 files changed, 1 insertions, 4 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 53b337114308..2a28170d78e4 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -398,10 +398,7 @@ static /* inline */ void refill_inactive(const int nr_pages_in)
page = list_entry(l_hold.prev, struct page, lru);
list_del(&page->lru);
if (page->pte.chain) {
- if (test_and_set_bit(PG_chainlock, &page->flags)) {
- list_add(&page->lru, &l_active);
- continue;
- }
+ pte_chain_lock(page);
if (page->pte.chain && page_referenced(page)) {
pte_chain_unlock(page);
list_add(&page->lru, &l_active);