[PATCH] riscv: uaccess: Add a fast path for small aligned copies

yunhui cui cuiyunhui at bytedance.com
Mon Nov 9 17:56:35 PST 2026


Hi,

On Wed, Aug 5, 2026 at 11:48 AM yunhui cui <cuiyunhui at bytedance.com> wrote:
>
> Hi Paul,
>
> On Tue, Jun 23, 2026 at 4:36 PM Yunhui Cui <cuiyunhui at bytedance.com> wrote:
> >
> > The scalar user copy routine currently enters the word-copy path only
> > for copies of at least 9 * SZREG - 1 bytes. On RV64 this is 71 bytes,
> > so common 32-byte and 64-byte aligned user/kernel copies fall back to
> > byte-by-byte copying.
> >
> > Add a small-copy word path for copies below that threshold when both
> > source and destination are SZREG-aligned. Unaligned and sub-word copies
> > keep using the existing byte-copy path, and larger copies keep using the
> > existing large-copy paths.
> >
> > This is a generic usercopy improvement. One common case is Linux AIO:
> > io_getevents() copies 32-byte struct io_event objects to userspace, and
> > io_submit() copies 64-byte struct iocb objects from userspace.
> >
> > fio libaio randrw three-run averages improved:
> >
> >   baseline:   read 560k IOPS, write 240k IOPS, sys 68.60%
> >   this patch: read 593k IOPS, write 254k IOPS, sys 69.03%
> >
> > This is about +5.8% read IOPS and +5.5% write IOPS.
> >
> > lmbench bw_pipe with small messages was also improved:
> >
> >   bw_pipe -m <size> -M 16m -W 1 -N 5
> >
> >   size   baseline MB/s   this patch MB/s   change
> >    32       62.52            74.54         +19.2%
> >    64      122.57           155.31         +26.7%
> >
> > Signed-off-by: Yunhui Cui <cuiyunhui at bytedance.com>

Just a gentle ping on this patch. Any comments?

Thanks,
Yunhui

> > ---
> >  arch/riscv/lib/uaccess.S | 19 +++++++++++++++++--
> >  1 file changed, 17 insertions(+), 2 deletions(-)
> >
> > diff --git a/arch/riscv/lib/uaccess.S b/arch/riscv/lib/uaccess.S
> > index 4efea1b3326c8..2d78007f10d01 100644
> > --- a/arch/riscv/lib/uaccess.S
> > +++ b/arch/riscv/lib/uaccess.S
> > @@ -70,12 +70,27 @@ SYM_FUNC_START(fallback_scalar_usercopy_sum_enabled)
> >         add     t0, a0, a2
> >
> >         /*
> > -        * Use byte copy only if too small.
> > -        * SZREG holds 4 for RV32 and 8 for RV64
> > +        * For small copies below the large-copy threshold, use word-copy if
> > +        * both src and dst are naturally aligned. Unaligned or sub-word copies
> > +        * are left to the byte-copy tail.
> >          */
> >         li      a3, 9*SZREG-1 /* size must >= (word_copy stride + SZREG-1) */
> > +       bgeu    a2, a3, .Llarge_copy_user
> > +       li      a3, SZREG
> >         bltu    a2, a3, .Lbyte_copy_tail
> > +       or      a3, a0, a1
> > +       andi    a3, a3, SZREG-1
> > +       bnez    a3, .Lbyte_copy_tail
> > +       andi    t1, t0, ~(SZREG-1)
> > +5:
> > +       fixup REG_L   a5, 0(a1), 10f
> > +       addi    a1, a1, SZREG
> > +       fixup REG_S   a5, 0(a0), 10f
> > +       addi    a0, a0, SZREG
> > +       bltu    a0, t1, 5b
> > +       j       .Lbyte_copy_tail
> >
> > +.Llarge_copy_user:
> >         /*
> >          * Copy first bytes until dst is aligned to word boundary.
> >          * a0 - start of dst
> > --
> > 2.39.5
> >
>
> Could you please help confirm whether this patch can be merged?
>
> Thanks,
> Yunhui



More information about the linux-riscv mailing list