Commit e4c1cf52 authored by Gao Xiang's avatar Gao Xiang

erofs: tidy up z_erofs_do_read_page()

 - Fix a typo: spiltted => split;

 - Move !EROFS_MAP_MAPPED and EROFS_MAP_FRAGMENT upwards;

 - Increase `split` in advance to avoid unnecessary repeats.
Reviewed-by: default avatarYue Hu <huyue2@coolpad.com>
Reviewed-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20230817082813.81180-4-hsiangkao@linux.alibaba.com
parent aeebae9d
...@@ -981,49 +981,34 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe, ...@@ -981,49 +981,34 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe,
struct erofs_map_blocks *const map = &fe->map; struct erofs_map_blocks *const map = &fe->map;
const loff_t offset = page_offset(page); const loff_t offset = page_offset(page);
bool tight = true, exclusive; bool tight = true, exclusive;
unsigned int cur, end, len, spiltted; unsigned int cur, end, len, split;
int err = 0; int err = 0;
/* register locked file pages as online pages in pack */
z_erofs_onlinepage_init(page); z_erofs_onlinepage_init(page);
spiltted = 0; split = 0;
end = PAGE_SIZE; end = PAGE_SIZE;
repeat: repeat:
cur = end - 1; if (offset + end - 1 < map->m_la ||
offset + end - 1 >= map->m_la + map->m_llen) {
if (offset + cur < map->m_la ||
offset + cur >= map->m_la + map->m_llen) {
z_erofs_pcluster_end(fe); z_erofs_pcluster_end(fe);
map->m_la = offset + cur; map->m_la = offset + end - 1;
map->m_llen = 0; map->m_llen = 0;
err = z_erofs_map_blocks_iter(inode, map, 0); err = z_erofs_map_blocks_iter(inode, map, 0);
if (err) if (err)
goto out; goto out;
} else if (fe->pcl) {
goto hitted;
} }
if ((map->m_flags & EROFS_MAP_MAPPED) && cur = offset > map->m_la ? 0 : map->m_la - offset;
!(map->m_flags & EROFS_MAP_FRAGMENT)) { /* bump split parts first to avoid several separate cases */
err = z_erofs_pcluster_begin(fe); ++split;
if (err)
goto out;
}
hitted:
/*
* Ensure the current partial page belongs to this submit chain rather
* than other concurrent submit chains or the noio(bypass) chain since
* those chains are handled asynchronously thus the page cannot be used
* for inplace I/O or bvpage (should be processed in a strict order.)
*/
tight &= (fe->mode > Z_EROFS_PCLUSTER_FOLLOWED_NOINPLACE);
cur = end - min_t(erofs_off_t, offset + end - map->m_la, end);
if (!(map->m_flags & EROFS_MAP_MAPPED)) { if (!(map->m_flags & EROFS_MAP_MAPPED)) {
zero_user_segment(page, cur, end); zero_user_segment(page, cur, end);
tight = false;
goto next_part; goto next_part;
} }
if (map->m_flags & EROFS_MAP_FRAGMENT) { if (map->m_flags & EROFS_MAP_FRAGMENT) {
erofs_off_t fpos = offset + cur - map->m_la; erofs_off_t fpos = offset + cur - map->m_la;
...@@ -1032,12 +1017,24 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe, ...@@ -1032,12 +1017,24 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe,
EROFS_I(inode)->z_fragmentoff + fpos); EROFS_I(inode)->z_fragmentoff + fpos);
if (err) if (err)
goto out; goto out;
++spiltted;
tight = false; tight = false;
goto next_part; goto next_part;
} }
exclusive = (!cur && (!spiltted || tight)); if (!fe->pcl) {
err = z_erofs_pcluster_begin(fe);
if (err)
goto out;
}
/*
* Ensure the current partial page belongs to this submit chain rather
* than other concurrent submit chains or the noio(bypass) chain since
* those chains are handled asynchronously thus the page cannot be used
* for inplace I/O or bvpage (should be processed in a strict order.)
*/
tight &= (fe->mode > Z_EROFS_PCLUSTER_FOLLOWED_NOINPLACE);
exclusive = (!cur && ((split <= 1) || tight));
if (cur) if (cur)
tight &= (fe->mode >= Z_EROFS_PCLUSTER_FOLLOWED); tight &= (fe->mode >= Z_EROFS_PCLUSTER_FOLLOWED);
...@@ -1050,8 +1047,6 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe, ...@@ -1050,8 +1047,6 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe,
goto out; goto out;
z_erofs_onlinepage_split(page); z_erofs_onlinepage_split(page);
/* bump up the number of spiltted parts of a page */
++spiltted;
if (fe->pcl->pageofs_out != (map->m_la & ~PAGE_MASK)) if (fe->pcl->pageofs_out != (map->m_la & ~PAGE_MASK))
fe->pcl->multibases = true; fe->pcl->multibases = true;
if (fe->pcl->length < offset + end - map->m_la) { if (fe->pcl->length < offset + end - map->m_la) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment