erofs: remove the fast path of per-CPU buffer decompression

As Xiang mentioned, such path has no real impact to our current
decompression strategy, remove it directly. Also, update the return
value of z_erofs_lz4_decompress() to 0 if success to keep consistent
with LZMA which will return 0 as well for that case.

Link: https://lore.kernel.org/r/20211014065744.1787-1-zbestahu@gmail.com
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Yue Hu <huyue2@yulong.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
This commit is contained in:
Yue Hu 2021-10-14 14:57:44 +08:00 committed by Gao Xiang
parent 9e1ff307c7
commit 5b6e7e120e

View file

@ -242,6 +242,8 @@ static int z_erofs_lz4_decompress(struct z_erofs_decompress_req *rq, u8 *out)
if (ret >= 0) if (ret >= 0)
memset(out + ret, 0, rq->outputsize - ret); memset(out + ret, 0, rq->outputsize - ret);
ret = -EIO; ret = -EIO;
} else {
ret = 0;
} }
if (maptype == 0) { if (maptype == 0) {
@ -268,33 +270,6 @@ static struct z_erofs_decompressor decompressors[] = {
}, },
}; };
static void copy_from_pcpubuf(struct page **out, const char *dst,
unsigned short pageofs_out,
unsigned int outputsize)
{
const char *end = dst + outputsize;
const unsigned int righthalf = PAGE_SIZE - pageofs_out;
const char *cur = dst - pageofs_out;
while (cur < end) {
struct page *const page = *out++;
if (page) {
char *buf = kmap_atomic(page);
if (cur >= dst) {
memcpy(buf, cur, min_t(uint, PAGE_SIZE,
end - cur));
} else {
memcpy(buf + pageofs_out, cur + pageofs_out,
min_t(uint, righthalf, end - cur));
}
kunmap_atomic(buf);
}
cur += PAGE_SIZE;
}
}
static int z_erofs_decompress_generic(struct z_erofs_decompress_req *rq, static int z_erofs_decompress_generic(struct z_erofs_decompress_req *rq,
struct list_head *pagepool) struct list_head *pagepool)
{ {
@ -305,34 +280,12 @@ static int z_erofs_decompress_generic(struct z_erofs_decompress_req *rq,
void *dst; void *dst;
int ret; int ret;
/* two optimized fast paths only for non bigpcluster cases yet */ /* one optimized fast path only for non bigpcluster cases yet */
if (rq->inputsize <= PAGE_SIZE) { if (rq->inputsize <= PAGE_SIZE && nrpages_out == 1 && !rq->inplace_io) {
if (nrpages_out == 1 && !rq->inplace_io) { DBG_BUGON(!*rq->out);
DBG_BUGON(!*rq->out); dst = kmap_atomic(*rq->out);
dst = kmap_atomic(*rq->out); dst_maptype = 0;
dst_maptype = 0; goto dstmap_out;
goto dstmap_out;
}
/*
* For the case of small output size (especially much less
* than PAGE_SIZE), memcpy the decompressed data rather than
* compressed data is preferred.
*/
if (rq->outputsize <= PAGE_SIZE * 7 / 8) {
dst = erofs_get_pcpubuf(1);
if (IS_ERR(dst))
return PTR_ERR(dst);
rq->inplace_io = false;
ret = alg->decompress(rq, dst);
if (!ret)
copy_from_pcpubuf(rq->out, dst, rq->pageofs_out,
rq->outputsize);
erofs_put_pcpubuf(dst);
return ret;
}
} }
/* general decoding path which can be used for all cases */ /* general decoding path which can be used for all cases */