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:
Родитель
f553069e5d
Коммит
31459fe4b2
|
@ -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;
|
||||
int rc = 0;
|
||||
struct page **pages;
|
||||
struct pagevec pvec;
|
||||
loff_t offset;
|
||||
u64 len;
|
||||
|
||||
|
@ -297,8 +296,6 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
|
|||
if (rc < 0)
|
||||
goto out;
|
||||
|
||||
/* set uptodate and add to lru in pagevec-sized chunks */
|
||||
pagevec_init(&pvec, 0);
|
||||
for (; !list_empty(page_list) && len > 0;
|
||||
rc -= PAGE_CACHE_SIZE, len -= PAGE_CACHE_SIZE) {
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
dout("readpages %p add_to_page_cache failed %p\n",
|
||||
inode, page);
|
||||
|
@ -323,10 +320,8 @@ static int ceph_readpages(struct file *file, struct address_space *mapping,
|
|||
flush_dcache_page(page);
|
||||
SetPageUptodate(page);
|
||||
unlock_page(page);
|
||||
if (pagevec_add(&pvec, page) == 0)
|
||||
pagevec_lru_add_file(&pvec); /* add to lru */
|
||||
page_cache_release(page);
|
||||
}
|
||||
pagevec_lru_add_file(&pvec);
|
||||
rc = 0;
|
||||
|
||||
out:
|
||||
|
|
|
@ -326,7 +326,7 @@ static struct page **alloc_page_vector(int num_pages)
|
|||
if (!pages)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
for (i = 0; i < num_pages; i++) {
|
||||
pages[i] = alloc_page(GFP_NOFS);
|
||||
pages[i] = __page_cache_alloc(GFP_NOFS);
|
||||
if (pages[i] == NULL) {
|
||||
ceph_release_page_vector(pages, i);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
|
|
@ -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
|
||||
* 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) {
|
||||
kfree(msgr);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
|
|
@ -20,7 +20,7 @@ int ceph_pagelist_release(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)
|
||||
return -ENOMEM;
|
||||
pl->room += PAGE_SIZE;
|
||||
|
|
|
@ -641,7 +641,7 @@ static int ceph_sync_setxattr(struct dentry *dentry, const char *name,
|
|||
return -ENOMEM;
|
||||
err = -ENOMEM;
|
||||
for (i = 0; i < nr_pages; i++) {
|
||||
pages[i] = alloc_page(GFP_NOFS);
|
||||
pages[i] = __page_cache_alloc(GFP_NOFS);
|
||||
if (!pages[i]) {
|
||||
nr_pages = i;
|
||||
goto out;
|
||||
|
|
Загрузка…
Ссылка в новой задаче