Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 311839
b: refs/heads/master
c: b065b43
h: refs/heads/master
i:
  311837: 02bf2ac
  311835: 29277ac
  311831: 7312315
  311823: e6ea2f8
  311807: 052eac7
v: v3
  • Loading branch information
Hugh Dickins authored and Linus Torvalds committed Jul 11, 2012
1 parent 84345c7 commit 83b4785
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 31 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d189922862e03ce6c7adc1e99d3b94e632dc8e89
refs/heads/master: b065b4321fa78e83bf8f5b0d79d0b5424b57998b
58 changes: 28 additions & 30 deletions trunk/mm/shmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,40 +288,31 @@ static int shmem_add_to_page_cache(struct page *page,
struct address_space *mapping,
pgoff_t index, gfp_t gfp, void *expected)
{
int error = 0;
int error;

VM_BUG_ON(!PageLocked(page));
VM_BUG_ON(!PageSwapBacked(page));

page_cache_get(page);
page->mapping = mapping;
page->index = index;

spin_lock_irq(&mapping->tree_lock);
if (!expected)
error = radix_tree_preload(gfp & GFP_RECLAIM_MASK);
error = radix_tree_insert(&mapping->page_tree, index, page);
else
error = shmem_radix_tree_replace(mapping, index, expected,
page);
if (!error) {
page_cache_get(page);
page->mapping = mapping;
page->index = index;

spin_lock_irq(&mapping->tree_lock);
if (!expected)
error = radix_tree_insert(&mapping->page_tree,
index, page);
else
error = shmem_radix_tree_replace(mapping, index,
expected, page);
if (!error) {
mapping->nrpages++;
__inc_zone_page_state(page, NR_FILE_PAGES);
__inc_zone_page_state(page, NR_SHMEM);
spin_unlock_irq(&mapping->tree_lock);
} else {
page->mapping = NULL;
spin_unlock_irq(&mapping->tree_lock);
page_cache_release(page);
}
if (!expected)
radix_tree_preload_end();
mapping->nrpages++;
__inc_zone_page_state(page, NR_FILE_PAGES);
__inc_zone_page_state(page, NR_SHMEM);
spin_unlock_irq(&mapping->tree_lock);
} else {
page->mapping = NULL;
spin_unlock_irq(&mapping->tree_lock);
page_cache_release(page);
}
if (error)
mem_cgroup_uncharge_cache_page(page);
return error;
}

Expand Down Expand Up @@ -1202,11 +1193,18 @@ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index,
__set_page_locked(page);
error = mem_cgroup_cache_charge(page, current->mm,
gfp & GFP_RECLAIM_MASK);
if (!error)
error = shmem_add_to_page_cache(page, mapping, index,
gfp, NULL);
if (error)
goto decused;
error = radix_tree_preload(gfp & GFP_RECLAIM_MASK);
if (!error) {
error = shmem_add_to_page_cache(page, mapping, index,
gfp, NULL);
radix_tree_preload_end();
}
if (error) {
mem_cgroup_uncharge_cache_page(page);
goto decused;
}
lru_cache_add_anon(page);

spin_lock(&info->lock);
Expand Down

0 comments on commit 83b4785

Please sign in to comment.