ceph: use __page_cache_alloc and add_to_page_cache_lru

Following Nick Piggin patches in btrfs, pagecache pages should be
allocated with __page_cache_alloc, so they obey pagecache memory
policies.

Also, using add_to_page_cache_lru instead of using a private
pagevec where applicable.

Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
Yehuda Sadeh 2010-03-17 13:54:02 -07:00 committed by Sage Weil
parent f553069e5d
commit 31459fe4b2
5 changed files with 6 additions and 11 deletions

View File

@ -274,7 +274,6 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
struct ceph_osd_client *osdc = &ceph_inode_to_client(inode)->osdc; struct ceph_osd_client *osdc = &ceph_inode_to_client(inode)->osdc;
int rc = 0; int rc = 0;
struct page **pages; struct page **pages;
struct pagevec pvec;
loff_t offset; loff_t offset;
u64 len; u64 len;
@ -297,8 +296,6 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
if (rc < 0) if (rc < 0)
goto out; goto out;
/* set uptodate and add to lru in pagevec-sized chunks */
pagevec_init(&pvec, 0);
for (; !list_empty(page_list) && len > 0; for (; !list_empty(page_list) && len > 0;
rc -= PAGE_CACHE_SIZE, len -= PAGE_CACHE_SIZE) { rc -= PAGE_CACHE_SIZE, len -= PAGE_CACHE_SIZE) {
struct page *page = struct page *page =
@ -312,7 +309,7 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
zero_user_segment(page, s, PAGE_CACHE_SIZE); zero_user_segment(page, s, PAGE_CACHE_SIZE);
} }
if (add_to_page_cache(page, mapping, page->index, GFP_NOFS)) { if (add_to_page_cache_lru(page, mapping, page->index, GFP_NOFS)) {
page_cache_release(page); page_cache_release(page);
dout("readpages %p add_to_page_cache failed %p\n", dout("readpages %p add_to_page_cache failed %p\n",
inode, page); inode, page);
@ -323,10 +320,8 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
flush_dcache_page(page); flush_dcache_page(page);
SetPageUptodate(page); SetPageUptodate(page);
unlock_page(page); unlock_page(page);
if (pagevec_add(&pvec, page) == 0) page_cache_release(page);
pagevec_lru_add_file(&pvec); /* add to lru */
} }
pagevec_lru_add_file(&pvec);
rc = 0; rc = 0;
out: out:

View File

@ -326,7 +326,7 @@ static struct page **alloc_page_vector(int num_pages)
if (!pages) if (!pages)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
for (i = 0; i < num_pages; i++) { for (i = 0; i < num_pages; i++) {
pages[i] = alloc_page(GFP_NOFS); pages[i] = __page_cache_alloc(GFP_NOFS);
if (pages[i] == NULL) { if (pages[i] == NULL) {
ceph_release_page_vector(pages, i); ceph_release_page_vector(pages, i);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);

View File

@ -1947,7 +1947,7 @@ struct ceph_messenger *ceph_messenger_create(struct ceph_entity_addr *myaddr)
/* the zero page is needed if a request is "canceled" while the message /* the zero page is needed if a request is "canceled" while the message
* is being written over the socket */ * is being written over the socket */
msgr->zero_page = alloc_page(GFP_KERNEL | __GFP_ZERO); msgr->zero_page = __page_cache_alloc(GFP_KERNEL | __GFP_ZERO);
if (!msgr->zero_page) { if (!msgr->zero_page) {
kfree(msgr); kfree(msgr);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);

View File

@ -20,7 +20,7 @@ int ceph_pagelist_release(struct ceph_pagelist *pl)
static int ceph_pagelist_addpage(struct ceph_pagelist *pl) static int ceph_pagelist_addpage(struct ceph_pagelist *pl)
{ {
struct page *page = alloc_page(GFP_NOFS); struct page *page = __page_cache_alloc(GFP_NOFS);
if (!page) if (!page)
return -ENOMEM; return -ENOMEM;
pl->room += PAGE_SIZE; pl->room += PAGE_SIZE;

View File

@ -641,7 +641,7 @@ static int ceph_sync_setxattr(struct dentry *dentry, const char *name,
return -ENOMEM; return -ENOMEM;
err = -ENOMEM; err = -ENOMEM;
for (i = 0; i < nr_pages; i++) { for (i = 0; i < nr_pages; i++) {
pages[i] = alloc_page(GFP_NOFS); pages[i] = __page_cache_alloc(GFP_NOFS);
if (!pages[i]) { if (!pages[i]) {
nr_pages = i; nr_pages = i;
goto out; goto out;