Re: [PATCH 1/5] mm/zswap: reuse dstmem when decompress

From: Yosry Ahmed
Date: Thu Dec 14 2023 - 13:25:21 EST


On Thu, Dec 14, 2023 at 6:42 AM Chengming Zhou
<zhouchengming@xxxxxxxxxxxxx> wrote:
[..]
> >>>> -
> >>>> /* 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.
> >
> > I don't mean to remove completely. Keep them as (for example)
> > zswap_mem and zswap_mutex global percpu variables, and not have
> > pointers in acomp_ctx to them. Instead of using acomp_ctx->dstmem
> > today, we directly use the global zswap_mem (same for the mutex).
> >
> > This makes it clear that the buffers are not owned or exclusively used
> > by the acomp_ctx. WDYT?
>
> Does this look good to you?
>
> ```
> int cpu = raw_smp_processor_id();
>
> mutex = per_cpu(zswap_mutex, cpu);
> mutex_lock(mutex);
>
> dstmem = per_cpu(zswap_dstmem, cpu);

Renaming to zswap_buffer or zswap_mem would be better I think, but
yeah what I had in mind is having zswap_mutex and
zswap_[dstmem/mem/buffer] be generic percpu buffers that are used by
store and load paths for different purposes, not directly linked to
acomp_ctx.

> acomp_ctx = per_cpu_ptr(pool->acomp_ctx, cpu);
>
> /* compress or decompress */
> ```
>
> Another way I just think of is to make acomp_ctx own its lock and buffer,
> and we could delete these percpu zswap_mutex and zswap_dstmem instead.

You mean have two separate set of percpu buffers for zswap load &
stores paths? This is probably unnecessary.