riscv: __asm_copy_to-from_user: Optimize unaligned memory access and pipeline stall
authorAkira Tsukamoto <akira.tsukamoto@gmail.com>
Wed, 23 Jun 2021 12:40:39 +0000 (21:40 +0900)
committerPalmer Dabbelt <palmerdabbelt@google.com>
Tue, 6 Jul 2021 22:09:48 +0000 (15:09 -0700)
commitca6eaaa210deec0e41cbfc380bf89cf079203569
treeb1186bf711b0d64f52812412fe649f1ca33d8558
parent31da94c25aea835ceac00575a9fd206c5a833fed
riscv: __asm_copy_to-from_user: Optimize unaligned memory access and pipeline stall

This patch will reduce cpu usage dramatically in kernel space especially
for application which use sys-call with large buffer size, such as
network applications. The main reason behind this is that every
unaligned memory access will raise exceptions and switch between s-mode
and m-mode causing large overhead.

First copy in bytes until reaches the first word aligned boundary in
destination memory address. This is the preparation before the bulk
aligned word copy.

The destination address is aligned now, but oftentimes the source
address is not in an aligned boundary. To reduce the unaligned memory
access, it reads the data from source in aligned boundaries, which will
cause the data to have an offset, and then combines the data in the next
iteration by fixing offset with shifting before writing to destination.
The majority of the improving copy speed comes from this shift copy.

In the lucky situation that the both source and destination address are
on the aligned boundary, perform load and store with register size to
copy the data. Without the unrolling, it will reduce the speed since the
next store instruction for the same register using from the load will
stall the pipeline.

At last, copying the remainder in one byte at a time.

Signed-off-by: Akira Tsukamoto <akira.tsukamoto@gmail.com>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
arch/riscv/lib/uaccess.S