git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mm/backing-dev.c: remove recently-added WARN_ON()
[pandora-kernel.git]
/
mm
/
swap_state.c
diff --git
a/mm/swap_state.c
b/mm/swap_state.c
index
d8aadaf
..
797c383
100644
(file)
--- a/
mm/swap_state.c
+++ b/
mm/swap_state.c
@@
-39,7
+39,7
@@
static struct backing_dev_info swap_backing_dev_info = {
struct address_space swapper_space = {
.page_tree = RADIX_TREE_INIT(GFP_ATOMIC|__GFP_NOWARN),
struct address_space swapper_space = {
.page_tree = RADIX_TREE_INIT(GFP_ATOMIC|__GFP_NOWARN),
- .tree_lock = __
RW
_LOCK_UNLOCKED(swapper_space.tree_lock),
+ .tree_lock = __
SPIN
_LOCK_UNLOCKED(swapper_space.tree_lock),
.a_ops = &swap_aops,
.i_mmap_nonlinear = LIST_HEAD_INIT(swapper_space.i_mmap_nonlinear),
.backing_dev_info = &swap_backing_dev_info,
.a_ops = &swap_aops,
.i_mmap_nonlinear = LIST_HEAD_INIT(swapper_space.i_mmap_nonlinear),
.backing_dev_info = &swap_backing_dev_info,
@@
-56,15
+56,16
@@
static struct {
void show_swap_cache_info(void)
{
void show_swap_cache_info(void)
{
- printk("Swap cache: add %lu, delete %lu, find %lu/%lu\n",
+ printk("%lu pages in swap cache\n", total_swapcache_pages);
+ printk("Swap cache stats: add %lu, delete %lu, find %lu/%lu\n",
swap_cache_info.add_total, swap_cache_info.del_total,
swap_cache_info.find_success, swap_cache_info.find_total);
swap_cache_info.add_total, swap_cache_info.del_total,
swap_cache_info.find_success, swap_cache_info.find_total);
- printk("Free swap = %l
u
kB\n", nr_swap_pages << (PAGE_SHIFT - 10));
+ printk("Free swap = %l
d
kB\n", nr_swap_pages << (PAGE_SHIFT - 10));
printk("Total swap = %lukB\n", total_swap_pages << (PAGE_SHIFT - 10));
}
/*
printk("Total swap = %lukB\n", total_swap_pages << (PAGE_SHIFT - 10));
}
/*
- * add_to_swap_cache resembles add_to_page_cache on swapper_space,
+ * add_to_swap_cache resembles add_to_page_cache
_locked
on swapper_space,
* but sets SwapCache flag and private instead of mapping and index.
*/
int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask)
* but sets SwapCache flag and private instead of mapping and index.
*/
int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask)
@@
-76,19
+77,26
@@
int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask)
BUG_ON(PagePrivate(page));
error = radix_tree_preload(gfp_mask);
if (!error) {
BUG_ON(PagePrivate(page));
error = radix_tree_preload(gfp_mask);
if (!error) {
- write_lock_irq(&swapper_space.tree_lock);
+ page_cache_get(page);
+ SetPageSwapCache(page);
+ set_page_private(page, entry.val);
+
+ spin_lock_irq(&swapper_space.tree_lock);
error = radix_tree_insert(&swapper_space.page_tree,
entry.val, page);
error = radix_tree_insert(&swapper_space.page_tree,
entry.val, page);
- if (!error) {
- page_cache_get(page);
- SetPageSwapCache(page);
- set_page_private(page, entry.val);
+ if (likely(!error)) {
total_swapcache_pages++;
__inc_zone_page_state(page, NR_FILE_PAGES);
INC_CACHE_INFO(add_total);
}
total_swapcache_pages++;
__inc_zone_page_state(page, NR_FILE_PAGES);
INC_CACHE_INFO(add_total);
}
-
write
_unlock_irq(&swapper_space.tree_lock);
+
spin
_unlock_irq(&swapper_space.tree_lock);
radix_tree_preload_end();
radix_tree_preload_end();
+
+ if (unlikely(error)) {
+ set_page_private(page, 0UL);
+ ClearPageSwapCache(page);
+ page_cache_release(page);
+ }
}
return error;
}
}
return error;
}
@@
-175,9
+183,9
@@
void delete_from_swap_cache(struct page *page)
entry.val = page_private(page);
entry.val = page_private(page);
-
write
_lock_irq(&swapper_space.tree_lock);
+
spin
_lock_irq(&swapper_space.tree_lock);
__delete_from_swap_cache(page);
__delete_from_swap_cache(page);
-
write
_unlock_irq(&swapper_space.tree_lock);
+
spin
_unlock_irq(&swapper_space.tree_lock);
swap_free(entry);
page_cache_release(page);
swap_free(entry);
page_cache_release(page);
@@
-193,7
+201,7
@@
void delete_from_swap_cache(struct page *page)
*/
static inline void free_swap_cache(struct page *page)
{
*/
static inline void free_swap_cache(struct page *page)
{
- if (PageSwapCache(page) &&
!TestSetPageLocked
(page)) {
+ if (PageSwapCache(page) &&
trylock_page
(page)) {
remove_exclusive_swap_page(page);
unlock_page(page);
}
remove_exclusive_swap_page(page);
unlock_page(page);
}
@@
-294,9
+302,9
@@
struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
* re-using the just freed swap entry for an existing page.
* May fail (-ENOMEM) if radix-tree node allocation failed.
*/
* re-using the just freed swap entry for an existing page.
* May fail (-ENOMEM) if radix-tree node allocation failed.
*/
-
SetPageL
ocked(new_page);
+
set_page_l
ocked(new_page);
err = add_to_swap_cache(new_page, entry, gfp_mask & GFP_KERNEL);
err = add_to_swap_cache(new_page, entry, gfp_mask & GFP_KERNEL);
- if (
!err
) {
+ if (
likely(!err)
) {
/*
* Initiate read into locked page and return.
*/
/*
* Initiate read into locked page and return.
*/
@@
-304,7
+312,7
@@
struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
swap_readpage(NULL, new_page);
return new_page;
}
swap_readpage(NULL, new_page);
return new_page;
}
-
ClearPageL
ocked(new_page);
+
clear_page_l
ocked(new_page);
swap_free(entry);
} while (err != -ENOMEM);
swap_free(entry);
} while (err != -ENOMEM);