@@ -2012,7 +2012,8 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i/* remember return value in a stack for bpf prog to access */emit_stx(&prog,BPF_DW,BPF_REG_FP,BPF_REG_0,-8);im->ip_after_call=prog;-emit_nops(&prog,5);+memcpy(prog,ideal_nops[NOP_ATOMIC5],X86_PATCH_SIZE);+prog+=X86_PATCH_SIZE;}if(fmod_ret->nr_progs){
@@ -2012,7 +2012,8 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i/* remember return value in a stack for bpf prog to access */emit_stx(&prog,BPF_DW,BPF_REG_FP,BPF_REG_0,-8);im->ip_after_call=prog;-emit_nops(&prog,5);+memcpy(prog,ideal_nops[NOP_ATOMIC5],X86_PATCH_SIZE);+prog+=X86_PATCH_SIZE;
I'm well aware, but ideal_nops are pretty much gone already.
The changes are already in the -tip tree.
So I decided to reduce the conflicts for the merge window.
Do you actually see the breakage or it's purely theoretical?
@@ -2012,7 +2012,8 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i/* remember return value in a stack for bpf prog to access */emit_stx(&prog,BPF_DW,BPF_REG_FP,BPF_REG_0,-8);im->ip_after_call=prog;-emit_nops(&prog,5);+memcpy(prog,ideal_nops[NOP_ATOMIC5],X86_PATCH_SIZE);+prog+=X86_PATCH_SIZE;
I'm well aware, but ideal_nops are pretty much gone already.
The changes are already in the -tip tree.
So I decided to reduce the conflicts for the merge window.
Do you actually see the breakage or it's purely theoretical?
We do see it, but it's on our tree that pulls from bpf.
And it obviously doesn't have that "x86: Remove dynamic NOP selection" yet.
Thanks for the pointer, I guess I can just wait for the real merge then.
@@ -2012,7 +2012,8 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i/* remember return value in a stack for bpf prog to access */emit_stx(&prog,BPF_DW,BPF_REG_FP,BPF_REG_0,-8);im->ip_after_call=prog;-emit_nops(&prog,5);+memcpy(prog,ideal_nops[NOP_ATOMIC5],X86_PATCH_SIZE);+prog+=X86_PATCH_SIZE;
I'm well aware, but ideal_nops are pretty much gone already.
The changes are already in the -tip tree.
So I decided to reduce the conflicts for the merge window.
Do you actually see the breakage or it's purely theoretical?
We do see it, but it's on our tree that pulls from bpf.
And it obviously doesn't have that "x86: Remove dynamic NOP selection" yet.
Thanks for the pointer, I guess I can just wait for the real merge then.
If it breaks the real users we have to land the fix, but let me ask how
come that you run with k8 cpu? k8 does other nasty things.
Do you run with all of amd errata?
@@ -2012,7 +2012,8 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i/* remember return value in a stack for bpf prog to access */emit_stx(&prog,BPF_DW,BPF_REG_FP,BPF_REG_0,-8);im->ip_after_call=prog;-emit_nops(&prog,5);+memcpy(prog,ideal_nops[NOP_ATOMIC5],X86_PATCH_SIZE);+prog+=X86_PATCH_SIZE;
I'm well aware, but ideal_nops are pretty much gone already.
The changes are already in the -tip tree.
So I decided to reduce the conflicts for the merge window.
Do you actually see the breakage or it's purely theoretical?
We do see it, but it's on our tree that pulls from bpf.
And it obviously doesn't have that "x86: Remove dynamic NOP selection" yet.
Thanks for the pointer, I guess I can just wait for the real merge then.
If it breaks the real users we have to land the fix, but let me ask how
come that you run with k8 cpu? k8 does other nasty things.
Do you run with all of amd errata?
It's not amd, it's intel:
cpu family : 6
model : 45
model name : Intel(R) Xeon(R) CPU E5-2689 0 @ 2.60GHz
I think I'm hitting the following from the arch/x86/kernel/alternative.c:
/*
* Due to a decoder implementation quirk, some
* specific Intel CPUs actually perform better with
* the "k8_nops" than with the SDM-recommended NOPs.
*/
if (boot_cpu_data.x86 == 6 &&
boot_cpu_data.x86_model >= 0x0f &&
boot_cpu_data.x86_model != 0x1c &&
boot_cpu_data.x86_model != 0x26 &&
boot_cpu_data.x86_model != 0x27 &&
boot_cpu_data.x86_model < 0x30) {
ideal_nops = k8_nops;
@@ -2012,7 +2012,8 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i/* remember return value in a stack for bpf prog to access */emit_stx(&prog,BPF_DW,BPF_REG_FP,BPF_REG_0,-8);im->ip_after_call=prog;-emit_nops(&prog,5);+memcpy(prog,ideal_nops[NOP_ATOMIC5],X86_PATCH_SIZE);+prog+=X86_PATCH_SIZE;
I'm well aware, but ideal_nops are pretty much gone already.
The changes are already in the -tip tree.
So I decided to reduce the conflicts for the merge window.
Do you actually see the breakage or it's purely theoretical?
We do see it, but it's on our tree that pulls from bpf.
And it obviously doesn't have that "x86: Remove dynamic NOP selection" yet.
Thanks for the pointer, I guess I can just wait for the real merge then.
If it breaks the real users we have to land the fix, but let me ask how
come that you run with k8 cpu? k8 does other nasty things.
Do you run with all of amd errata?
It's not amd, it's intel:
cpu family : 6
model : 45
model name : Intel(R) Xeon(R) CPU E5-2689 0 @ 2.60GHz
I think I'm hitting the following from the arch/x86/kernel/alternative.c:
/*
* Due to a decoder implementation quirk, some
* specific Intel CPUs actually perform better with
* the "k8_nops" than with the SDM-recommended NOPs.
*/
if (boot_cpu_data.x86 == 6 &&
boot_cpu_data.x86_model >= 0x0f &&
boot_cpu_data.x86_model != 0x1c &&
boot_cpu_data.x86_model != 0x26 &&
boot_cpu_data.x86_model != 0x27 &&
boot_cpu_data.x86_model < 0x30) {
ideal_nops = k8_nops;
Hello:
This patch was applied to bpf/bpf.git (refs/heads/master):
On Fri, 19 Mar 2021 17:00:01 -0700 you wrote:
__bpf_arch_text_poke does rewrite only for atomic nop5, emit_nops(xxx, 5)
emits non-atomic one which breaks fentry/fexit with k8 atomics:
P6_NOP5 == P6_NOP5_ATOMIC (0f1f440000 == 0f1f440000)
K8_NOP5 != K8_NOP5_ATOMIC (6666906690 != 6666666690)
Can be reproduced by doing "ideal_nops = k8_nops" in "arch_init_ideal_nops()
and running fexit_bpf2bpf selftest.
[...]
On Sat, Mar 20, 2021 at 2:01 AM Stanislav Fomichev [off-list ref] wrote:
__bpf_arch_text_poke does rewrite only for atomic nop5, emit_nops(xxx, 5)
emits non-atomic one which breaks fentry/fexit with k8 atomics:
P6_NOP5 == P6_NOP5_ATOMIC (0f1f440000 == 0f1f440000)
K8_NOP5 != K8_NOP5_ATOMIC (6666906690 != 6666666690)
Can be reproduced by doing "ideal_nops = k8_nops" in "arch_init_ideal_nops()
and running fexit_bpf2bpf selftest.
Fixes: e21aa341785c ("bpf: Fix fexit trampoline.")
Signed-off-by: Stanislav Fomichev <redacted>
@@ -2012,7 +2012,8 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *i/* remember return value in a stack for bpf prog to access */emit_stx(&prog,BPF_DW,BPF_REG_FP,BPF_REG_0,-8);im->ip_after_call=prog;-emit_nops(&prog,5);+memcpy(prog,ideal_nops[NOP_ATOMIC5],X86_PATCH_SIZE);+prog+=X86_PATCH_SIZE;}if(fmod_ret->nr_progs){--