From: Barry Song <[email protected]>
The patchset removes a couple of memcpy in zswap and crypto
to improve zswap's performance.
Thanks for Chengming Zhou's test and perf data.
Quote from Chengming,
I just tested these three patches on my server, found improvement in the
kernel build testcase on a tmpfs with zswap (lz4 + zsmalloc) enabled.
mm-stable 501a06fe8e4c patched
real 1m38.028s 1m32.317s
user 19m11.482s 18m39.439s
sys 19m26.445s 17m5.646s
As zswap is the direct use of this patchset and zswap benefits from
this series, It is probably better for this patchset to go through
Andrew's mm tree than Herbert's crypto tree if there is no objection
from Herbert.
-v2:
* add flush_dcache_page() in scomp_acomp_comp_decomp() according to
Herbert's suggestion, thanks!
* collect Reviewed-by of Nhat, thanks!
* rename is_async to is_sleepable according to Yosry's suggestion,
thanks!
Barry Song (3):
crypto: introduce acomp_is_sleepable to expose if a acomp has a scomp
backend
mm/zswap: remove the memcpy if acomp is not sleepable
crypto: scompress: remove memcpy if sg_nents is 1
crypto/acompress.c | 8 ++++++++
crypto/scompress.c | 36 +++++++++++++++++++++++++++++-------
include/crypto/acompress.h | 9 +++++++++
mm/zswap.c | 6 ++++--
4 files changed, 50 insertions(+), 9 deletions(-)
--
2.34.1
From: Barry Song <[email protected]>
Almost all CPU-based compressors/decompressors are actually synchronous
though they support acomp APIs. While some hardware has hardware-based
accelerators to offload CPU's work such as hisilicon and intel/qat/,
their drivers are working in async mode.
Letting acomp's users know exactly if the acomp is really async will
help users know if the compression and decompression procedure can
sleep.
Signed-off-by: Barry Song <[email protected]>
Tested-by: Chengming Zhou <[email protected]>
---
crypto/acompress.c | 8 ++++++++
include/crypto/acompress.h | 9 +++++++++
2 files changed, 17 insertions(+)
diff --git a/crypto/acompress.c b/crypto/acompress.c
index 1c682810a484..fa15df394a4c 100644
--- a/crypto/acompress.c
+++ b/crypto/acompress.c
@@ -152,6 +152,14 @@ struct crypto_acomp *crypto_alloc_acomp_node(const char *alg_name, u32 type,
}
EXPORT_SYMBOL_GPL(crypto_alloc_acomp_node);
+bool acomp_is_sleepable(struct crypto_acomp *acomp)
+{
+ struct crypto_tfm *tfm = crypto_acomp_tfm(acomp);
+
+ return tfm->__crt_alg->cra_type == &crypto_acomp_type;
+}
+EXPORT_SYMBOL_GPL(acomp_is_sleepable);
+
struct acomp_req *acomp_request_alloc(struct crypto_acomp *acomp)
{
struct crypto_tfm *tfm = crypto_acomp_tfm(acomp);
diff --git a/include/crypto/acompress.h b/include/crypto/acompress.h
index 574cffc90730..88ca33532313 100644
--- a/include/crypto/acompress.h
+++ b/include/crypto/acompress.h
@@ -204,6 +204,15 @@ struct acomp_req *acomp_request_alloc(struct crypto_acomp *tfm);
*/
void acomp_request_free(struct acomp_req *req);
+/**
+ * acomp_is_sleepable() -- check if an acomp is sleepable
+ *
+ * @tfm: ACOMPRESS tfm handle allocated with crypto_alloc_acomp()
+ *
+ * Return: true if the acomp is sleepable, otherwise, false
+ */
+bool acomp_is_sleepable(struct crypto_acomp *tfm);
+
/**
* acomp_request_set_callback() -- Sets an asynchronous callback
*
--
2.34.1