Re: [patch 02/14] tmpfs: fix regressions from wider use of ZERO_PAGE

Linus Torvalds
2022-04-16T17:42:45Z

On Sat, Apr 16, 2022 at 10:28 AM Borislav Petkov <bp@alien8.de> wrote:
>
> you also need a _fsrm() one which checks X86_FEATURE_FSRM. That one
> should simply do rep; stosb regardless of the size. For that you can
> define an alternative_call_3 similar to how the _2 variant is defined.

Honestly, my personal preference would be that with FSRM, we'd have an
alternative that looks something like

asm volatile(
"1:"
ALTERNATIVE("call __stosb_user", "rep movsb", X86_FEATURE_FSRM)
"2:"
_ASM_EXTABLE_UA(1b, 2b)
:"=c" (count), "=D" (dest),ASM_CALL_CONSTRAINT
:"0" (count), "1" (dest), "a" (0)
:"memory");

iow, the 'rep stosb' case would be inline.

Note that the above would have a few things to look out for:

- special 'stosb' calling convention:

%rax/%rcx/%rdx as inputs
%rcx as "bytes not copied" return value
%rdi can be clobbered

so the actual functions would look a bit odd and would need to
save/restore some registers, but they'd basically just emulate "rep
stosb".

- since the whole point is that the "rep movsb" is inlined, it also
means that the "call __stosb_user" is done within the STAC/CLAC
region, so objdump would have to be taught that's ok

but wouldn't it be lovely if we could start moving towards a model
where we can just inline 'memset' and 'memcpy' like this?

NOTE! The above asm has not been tested. I wrote it in this email. I'm
sure I messed something up.

Linus