On Tue, Jun 25, 2024, at 06:04, Jisheng Zhang wrote: > This series tries to optimize riscv uaccess in the following way: > > patch1 implement the user_access_begin and families, I.E the unsafe > accessors. when a function like strncpy_from_user() is called, > the userspace access protection is disabled and enabled for every > word read. After patch1, the protection is disabled at the beginning > of the copy and enabled at the end. > > patch2 is a simple clean up > > patch3 uses 'asm goto' for put_user() > patch4 uses 'asm goto output' for get_user() > > Both patch3 and patch4 are based on the fact -- 'asm goto' and > 'asm goto output'generates noticeably better code since we don't need > to test the error etc, the exception just jumps to the error handling > directly. Nice! I hope that we can one day make this more straightforward and share more of the implementation across architectures, in particular the bits that are just wrappers around the low-level asm. We have something like this already on powerpc and x86, and Linus just did the version for arm64, which I assume you are using as a template for this. Four architectures is probably the point at which we should try to consolidate the code again and move as much as we can into asm-generic. I think the only bets we really need from an architecture here are: - __enable_user_access()/__disable_user_access() in the label version - __raw_get_mem_{1,2,4,8}() and __raw_put_mem_{1,2,4,8}() and then we can build all the normal interface functions on those in a way that assumes we have as goto available, with the appropriate fallback in __raw_get_mem_*() as long as we need to support gcc-10 and older. Arnd