lkml.org 
[lkml]   [2023]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH v3] fs/aio: Replace kmap{,_atomic}() with kmap_local_page()
    Date
    On giovedì 19 gennaio 2023 17:20:55 CEST Fabio M. De Francesco wrote:
    > The use of kmap() and kmap_atomic() are being deprecated in favor of
    > kmap_local_page().

    According to a suggestion by Matthew, I just sent another patch which stops
    allocating aio rings from ZONE_HIGHMEM.[1]

    Therefore, please drop this patch.

    Since the purpose of the new patch is entirely different from this, I changed
    the subject and reset the version number to v1.

    Thanks,

    Fabio

    [1] https://lore.kernel.org/lkml/20230609145937.17610-1-fmdefrancesco@gmail.com/

    > There are two main problems with kmap(): (1) It comes with an overhead as
    > the mapping space is restricted and protected by a global lock for
    > synchronization and (2) it also requires global TLB invalidation when the
    > kmap’s pool wraps and it might block when the mapping space is fully
    > utilized until a slot becomes available.
    >
    > With kmap_local_page() the mappings are per thread, CPU local, can take
    > page faults, and can be called from any context (including interrupts).
    > It is faster than kmap() in kernels with HIGHMEM enabled. Furthermore,
    > the tasks can be preempted and, when they are scheduled to run again, the
    > kernel virtual addresses are restored and still valid.
    >
    > The use of kmap_local_page() in fs/aio.c is "safe" in the sense that the
    > code don't hands the returned kernel virtual addresses to other threads
    > and there are no nesting which should be handled with the stack based
    > (LIFO) mappings/un-mappings order. Furthermore, the code between the old
    > kmap_atomic()/kunmap_atomic() did not depend on disabling page-faults
    > and/or preemption, so that there is no need to call pagefault_disable()
    > and/or preempt_disable() before the mappings.
    >
    > Therefore, replace kmap() and kmap_atomic() with kmap_local_page() in
    > fs/aio.c.
    >
    > Tested with xfstests on a QEMU/KVM x86_32 VM, 6GB RAM, booting a kernel
    > with HIGHMEM64GB enabled.
    >
    > Cc: "Venkataramanan, Anirudh" <anirudh.venkataramanan@intel.com>
    > Suggested-by: Ira Weiny <ira.weiny@intel.com>
    > Reviewed-by: Ira Weiny <ira.weiny@intel.com>
    > Reviewed-by: Jeff Moyer <jmoyer@redhat.com>
    > Reviewed-by: Kent Overstreet <kent.overstreet@linux.dev>
    > Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
    > ---



    \
     
     \ /
      Last update: 2023-06-09 17:05    [W:4.954 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site