summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-05-22 07:59:45 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-05-22 07:59:45 -0700
commitb6c418dc809fb3ab4eb2b11f7caec7d98a1eaae7 (patch)
tree96ae4985ec7d992419fe3b016bd526ffa04f2000
parenta20a9deece83ea13989595792665dd9da925b09c (diff)
[PATCH] Make swapper_space tree_lock irq-safe
->tree_lock is supposed to be IRQ-safe. Hugh worked out that with his changes, we never actually take it from interrupt context, so spin_lock() is sufficient. Apart from kinda freaking me out, the analysis which led to this decision becomes untrue with later patches. So make it irq-safe.
-rw-r--r--mm/swap_state.c16
-rw-r--r--mm/swapfile.c12
2 files changed, 14 insertions, 14 deletions
diff --git a/mm/swap_state.c b/mm/swap_state.c
index d76b2d1bcf79..fd18d031e8e7 100644
--- a/mm/swap_state.c
+++ b/mm/swap_state.c
@@ -69,7 +69,7 @@ static int __add_to_swap_cache(struct page *page,
error = radix_tree_preload(gfp_mask);
if (!error) {
page_cache_get(page);
- spin_lock(&swapper_space.tree_lock);
+ spin_lock_irq(&swapper_space.tree_lock);
error = radix_tree_insert(&swapper_space.page_tree,
entry.val, page);
if (!error) {
@@ -80,7 +80,7 @@ static int __add_to_swap_cache(struct page *page,
pagecache_acct(1);
} else
page_cache_release(page);
- spin_unlock(&swapper_space.tree_lock);
+ spin_unlock_irq(&swapper_space.tree_lock);
radix_tree_preload_end();
}
return error;
@@ -207,9 +207,9 @@ void delete_from_swap_cache(struct page *page)
entry.val = page->private;
- spin_lock(&swapper_space.tree_lock);
+ spin_lock_irq(&swapper_space.tree_lock);
__delete_from_swap_cache(page);
- spin_unlock(&swapper_space.tree_lock);
+ spin_unlock_irq(&swapper_space.tree_lock);
swap_free(entry);
page_cache_release(page);
@@ -308,13 +308,13 @@ struct page * lookup_swap_cache(swp_entry_t entry)
{
struct page *page;
- spin_lock(&swapper_space.tree_lock);
+ spin_lock_irq(&swapper_space.tree_lock);
page = radix_tree_lookup(&swapper_space.page_tree, entry.val);
if (page) {
page_cache_get(page);
INC_CACHE_INFO(find_success);
}
- spin_unlock(&swapper_space.tree_lock);
+ spin_unlock_irq(&swapper_space.tree_lock);
INC_CACHE_INFO(find_total);
return page;
}
@@ -336,12 +336,12 @@ struct page * read_swap_cache_async(swp_entry_t entry)
* called after lookup_swap_cache() failed, re-calling
* that would confuse statistics.
*/
- spin_lock(&swapper_space.tree_lock);
+ spin_lock_irq(&swapper_space.tree_lock);
found_page = radix_tree_lookup(&swapper_space.page_tree,
entry.val);
if (found_page)
page_cache_get(found_page);
- spin_unlock(&swapper_space.tree_lock);
+ spin_unlock_irq(&swapper_space.tree_lock);
if (found_page)
break;
diff --git a/mm/swapfile.c b/mm/swapfile.c
index a65e385fd8bc..659245aa1a3b 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -289,10 +289,10 @@ static int exclusive_swap_page(struct page *page)
/* Is the only swap cache user the cache itself? */
if (p->swap_map[swp_offset(entry)] == 1) {
/* Recheck the page count with the swapcache lock held.. */
- spin_lock(&swapper_space.tree_lock);
+ spin_lock_irq(&swapper_space.tree_lock);
if (page_count(page) == 2)
retval = 1;
- spin_unlock(&swapper_space.tree_lock);
+ spin_unlock_irq(&swapper_space.tree_lock);
}
swap_info_put(p);
}
@@ -360,13 +360,13 @@ int remove_exclusive_swap_page(struct page *page)
retval = 0;
if (p->swap_map[swp_offset(entry)] == 1) {
/* Recheck the page count with the swapcache lock held.. */
- spin_lock(&swapper_space.tree_lock);
+ spin_lock_irq(&swapper_space.tree_lock);
if ((page_count(page) == 2) && !PageWriteback(page)) {
__delete_from_swap_cache(page);
SetPageDirty(page);
retval = 1;
}
- spin_unlock(&swapper_space.tree_lock);
+ spin_unlock_irq(&swapper_space.tree_lock);
}
swap_info_put(p);
@@ -390,12 +390,12 @@ void free_swap_and_cache(swp_entry_t entry)
p = swap_info_get(entry);
if (p) {
if (swap_entry_free(p, swp_offset(entry)) == 1) {
- spin_lock(&swapper_space.tree_lock);
+ spin_lock_irq(&swapper_space.tree_lock);
page = radix_tree_lookup(&swapper_space.page_tree,
entry.val);
if (page && TestSetPageLocked(page))
page = NULL;
- spin_unlock(&swapper_space.tree_lock);
+ spin_unlock_irq(&swapper_space.tree_lock);
}
swap_info_put(p);
}