Commit 891975a1 authored by Andrew Morton's avatar Andrew Morton Committed by Oleg Drokin

[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().
parent 9bdedfce
...@@ -398,10 +398,7 @@ static /* inline */ void refill_inactive(const int nr_pages_in) ...@@ -398,10 +398,7 @@ static /* inline */ void refill_inactive(const int nr_pages_in)
page = list_entry(l_hold.prev, struct page, lru); page = list_entry(l_hold.prev, struct page, lru);
list_del(&page->lru); list_del(&page->lru);
if (page->pte.chain) { if (page->pte.chain) {
if (test_and_set_bit(PG_chainlock, &page->flags)) { pte_chain_lock(page);
list_add(&page->lru, &l_active);
continue;
}
if (page->pte.chain && page_referenced(page)) { if (page->pte.chain && page_referenced(page)) {
pte_chain_unlock(page); pte_chain_unlock(page);
list_add(&page->lru, &l_active); list_add(&page->lru, &l_active);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment