On 2023/12/14 07:24, Yosry Ahmed wrote: > On Tue, Dec 12, 2023 at 8:18 PM Chengming Zhou > <zhouchengming@xxxxxxxxxxxxx> wrote: >> >> In the !zpool_can_sleep_mapped() case such as zsmalloc, we need to first >> copy the entry->handle memory to a temporary memory, which is allocated >> using kmalloc. >> >> Obviously we can reuse the per-compressor dstmem to avoid allocating >> every time, since it's percpu-compressor and protected in mutex. >> >> Signed-off-by: Chengming Zhou <zhouchengming@xxxxxxxxxxxxx> >> Reviewed-by: Nhat Pham <nphamcs@xxxxxxxxx> >> --- >> mm/zswap.c | 29 +++++++++-------------------- >> 1 file changed, 9 insertions(+), 20 deletions(-) >> >> diff --git a/mm/zswap.c b/mm/zswap.c >> index 7ee54a3d8281..edb8b45ed5a1 100644 >> --- a/mm/zswap.c >> +++ b/mm/zswap.c >> @@ -1772,9 +1772,9 @@ bool zswap_load(struct folio *folio) >> struct zswap_entry *entry; >> struct scatterlist input, output; >> struct crypto_acomp_ctx *acomp_ctx; >> - u8 *src, *dst, *tmp; >> + unsigned int dlen = PAGE_SIZE; >> + u8 *src, *dst; >> struct zpool *zpool; >> - unsigned int dlen; >> bool ret; >> >> VM_WARN_ON_ONCE(!folio_test_locked(folio)); >> @@ -1796,27 +1796,18 @@ bool zswap_load(struct folio *folio) >> goto stats; >> } >> >> - zpool = zswap_find_zpool(entry); >> - if (!zpool_can_sleep_mapped(zpool)) { >> - tmp = kmalloc(entry->length, GFP_KERNEL); >> - if (!tmp) { >> - ret = false; >> - goto freeentry; >> - } >> - } >> - >> /* decompress */ >> - dlen = PAGE_SIZE; >> - src = zpool_map_handle(zpool, entry->handle, ZPOOL_MM_RO); >> + acomp_ctx = raw_cpu_ptr(entry->pool->acomp_ctx); >> + mutex_lock(acomp_ctx->mutex); >> >> + zpool = zswap_find_zpool(entry); >> + src = zpool_map_handle(zpool, entry->handle, ZPOOL_MM_RO); >> if (!zpool_can_sleep_mapped(zpool)) { >> - memcpy(tmp, src, entry->length); >> - src = tmp; >> + memcpy(acomp_ctx->dstmem, src, entry->length); >> + src = acomp_ctx->dstmem; > > I don't like that we are now using acomp_ctx->dstmem and > acomp_ctx->mutex now for purposes other than what the naming suggests. The "mutex" name is coherent, "dstmem" depends on how we use IMHO. Change to just "mem"? Or do you have a better name to replace? > > How about removing these two fields from acomp_ctx, and directly using > zswap_dstmem and zswap_mutex in both the load and store paths, rename > them, and add proper comments above their definitions that they are > for generic percpu buffering on the load and store paths? Yes, they are percpu memory and lock, but they are used by per acomp_ctx, and the cpu maybe changing in the middle, so maybe better to keep them. Thanks!