UPSTREAM: erofs: allocate extra bvec pages directly instead of retrying
If non-bootstrap bvecs cannot be kept in place (very rarely), an extra short-lived page is allocated. Let's just allocate it immediately rather than do unnecessary -EAGAIN return first and retry as a cleanup. Also it's unnecessary to use __GFP_NOFAIL here since we could gracefully fail out this case instead. Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Reviewed-by: Yue Hu <huyue2@coolpad.com> Link: https://lore.kernel.org/r/20230526201459.128169-2-hsiangkao@linux.alibaba.com Bug: 318378021 (cherry picked from commit 05b63d2beb8b0f752d1f5cdd051c8bdbf532cedd) Change-Id: I2ac45a943060406bcbb741c5f7aa1094f783f906 Signed-off-by: Sandeep Dhavale <dhavale@google.com>
This commit is contained in:
parent
bed20ed1d3
commit
5c1827383a
1 changed files with 11 additions and 19 deletions
|
|
@ -240,12 +240,17 @@ static int z_erofs_bvec_enqueue(struct z_erofs_bvec_iter *iter,
|
|||
struct z_erofs_bvec *bvec,
|
||||
struct page **candidate_bvpage)
|
||||
{
|
||||
if (iter->cur == iter->nr) {
|
||||
if (!*candidate_bvpage)
|
||||
return -EAGAIN;
|
||||
if (iter->cur >= iter->nr) {
|
||||
struct page *nextpage = *candidate_bvpage;
|
||||
|
||||
if (!nextpage) {
|
||||
nextpage = alloc_page(GFP_NOFS);
|
||||
if (!nextpage)
|
||||
return -ENOMEM;
|
||||
set_page_private(nextpage, Z_EROFS_SHORTLIVED_PAGE);
|
||||
}
|
||||
DBG_BUGON(iter->bvset->nextpage);
|
||||
iter->bvset->nextpage = *candidate_bvpage;
|
||||
iter->bvset->nextpage = nextpage;
|
||||
z_erofs_bvset_flip(iter);
|
||||
|
||||
iter->bvset->nextpage = NULL;
|
||||
|
|
@ -872,10 +877,8 @@ static bool z_erofs_collector_end(struct z_erofs_decompress_frontend *fe)
|
|||
z_erofs_bvec_iter_end(&fe->biter);
|
||||
mutex_unlock(&pcl->lock);
|
||||
|
||||
if (fe->candidate_bvpage) {
|
||||
DBG_BUGON(z_erofs_is_shortlived_page(fe->candidate_bvpage));
|
||||
if (fe->candidate_bvpage)
|
||||
fe->candidate_bvpage = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* if all pending pages are added, don't hold its reference
|
||||
|
|
@ -1023,24 +1026,13 @@ hitted:
|
|||
if (cur)
|
||||
tight &= (fe->mode >= Z_EROFS_PCLUSTER_FOLLOWED);
|
||||
|
||||
retry:
|
||||
err = z_erofs_attach_page(fe, &((struct z_erofs_bvec) {
|
||||
.page = page,
|
||||
.offset = offset - map->m_la,
|
||||
.end = end,
|
||||
}), exclusive);
|
||||
/* should allocate an additional short-lived page for bvset */
|
||||
if (err == -EAGAIN && !fe->candidate_bvpage) {
|
||||
fe->candidate_bvpage = alloc_page(GFP_NOFS | __GFP_NOFAIL);
|
||||
set_page_private(fe->candidate_bvpage,
|
||||
Z_EROFS_SHORTLIVED_PAGE);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
if (err) {
|
||||
DBG_BUGON(err == -EAGAIN && fe->candidate_bvpage);
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
|
||||
z_erofs_onlinepage_split(page);
|
||||
/* bump up the number of spiltted parts of a page */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue