diff options
| author | Andrew Morton <akpm@zip.com.au> | 2002-08-19 06:04:50 -0700 |
|---|---|---|
| committer | Oleg Drokin <green@angband.namesys.com> | 2002-08-19 06:04:50 -0700 |
| commit | 891975a10ed395bf2997c75e2a6776523404a0ef (patch) | |
| tree | b6a5d6b1147eec5dd8bfe06ca81c2422a2007458 | |
| parent | 9bdedfceabd0892444c6581997a34278e41fd80d (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.c | 5 |
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); |
