Messages in this thread Patch in this message | | | From | Gao Xiang <> | Subject | [PATCH v6 19/24] erofs: add erofs_allocpage() | Date | Fri, 2 Aug 2019 20:53:42 +0800 |
| |
This patch introduces an temporary _on-stack_ page pool to reuse the freed page directly as much as it can for better performance and release all pages at a time, it also slightly reduces the possibility of the potential memory allocation failure.
Signed-off-by: Gao Xiang <gaoxiang25@huawei.com> --- fs/erofs/internal.h | 2 ++ fs/erofs/utils.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+)
diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index 19694886dda9..1a322304560f 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -489,6 +489,8 @@ int erofs_namei(struct inode *dir, struct qstr *name, extern const struct file_operations erofs_dir_fops; /* utils.c */ +struct page *erofs_allocpage(struct list_head *pool, gfp_t gfp, bool nofail); + #if (EROFS_PCPUBUF_NR_PAGES > 0) void *erofs_get_pcpubuf(unsigned int pagenr); #define erofs_put_pcpubuf(buf) do { \ diff --git a/fs/erofs/utils.c b/fs/erofs/utils.c index f3eed9af24d6..ae6362abed67 100644 --- a/fs/erofs/utils.c +++ b/fs/erofs/utils.c @@ -9,6 +9,20 @@ #include "internal.h" #include <linux/pagevec.h> +struct page *erofs_allocpage(struct list_head *pool, gfp_t gfp, bool nofail) +{ + struct page *page; + + if (!list_empty(pool)) { + page = lru_to_page(pool); + DBG_BUGON(page_ref_count(page) != 1); + list_del(&page->lru); + } else { + page = alloc_pages(gfp | (nofail ? __GFP_NOFAIL : 0), 0); + } + return page; +} + #if (EROFS_PCPUBUF_NR_PAGES > 0) static struct { u8 data[PAGE_SIZE * EROFS_PCPUBUF_NR_PAGES]; -- 2.17.1
| |