On Mon, Nov 27, 2023 at 8:03 AM Fabio M. De Francesco <fabio.maria.de.francesco@xxxxxxxxxxxxxxx> wrote: > > kmap_atomic() has been deprecated in favor of kmap_local_page(). > > Therefore, replace kmap_atomic() with kmap_local_page() in > zswap.c. > > kmap_atomic() is implemented like a kmap_local_page() which also > disables page-faults and preemption (the latter only in !PREEMPT_RT > kernels). The kernel virtual addresses returned by these two API are > only valid in the context of the callers (i.e., they cannot be handed to > other threads). > > With kmap_local_page() the mappings are per thread and CPU local like > in kmap_atomic(); however, they can handle page-faults and can be called > from any context (including interrupts). The tasks that call > kmap_local_page() can be preempted and, when they are scheduled to run > again, the kernel virtual addresses are restored and are still valid. > > In mm/zswap.c, the blocks of code between the mappings and un-mappings > do not depend on the above-mentioned side effects of kmap_atomic(), so > that the mere replacements of the old API with the new one is all that is > required (i.e., there is no need to explicitly call pagefault_disable() > and/or preempt_disable()). > > Cc: Ira Weiny <ira.weiny@xxxxxxxxx> > Signed-off-by: Fabio M. De Francesco <fabio.maria.de.francesco@xxxxxxxxxxxxxxx> > --- > mm/zswap.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > diff --git a/mm/zswap.c b/mm/zswap.c > index 74411dfdad92..699c6ee11222 100644 > --- a/mm/zswap.c > +++ b/mm/zswap.c > @@ -1267,16 +1267,16 @@ bool zswap_store(struct folio *folio) > } > > if (zswap_same_filled_pages_enabled) { > - src = kmap_atomic(page); > + src = kmap_local_page(page); > if (zswap_is_page_same_filled(src, &value)) { > - kunmap_atomic(src); > + kunmap_local(src); > entry->swpentry = swp_entry(type, offset); > entry->length = 0; > entry->value = value; > atomic_inc(&zswap_same_filled_pages); > goto insert_entry; > } > - kunmap_atomic(src); > + kunmap_local(src); > } > > if (!zswap_non_same_filled_pages_enabled) > @@ -1422,9 +1422,9 @@ bool zswap_load(struct folio *folio) > spin_unlock(&tree->lock); > > if (!entry->length) { > - dst = kmap_atomic(page); > + dst = kmap_local_page(page); > zswap_fill_page(dst, entry->value); > - kunmap_atomic(dst); > + kunmap_local(dst); > ret = true; > goto stats; > } > -- > 2.42.0 > > Probably worth running a couple rounds of stress tests, but otherwise LGTM. FWIW, I've wanted to do this ever since I worked on the storing-uncompressed-pages patch. Reviewed-by: Nhat Pham <nphamcs@xxxxxxxxx>