Introduce the function bpf_arch_text_poke_type(), which is able to specify both the current and new opcode. If it is not implemented by the arch, bpf_arch_text_poke() will be called directly if the current opcode is the same as the new one. Otherwise, -EOPNOTSUPP will be returned.
Signed-off-by: Menglong Dong <[email protected]> --- include/linux/bpf.h | 4 ++++ kernel/bpf/core.c | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index d65a71042aa3..aec7c65539f5 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -3711,6 +3711,10 @@ enum bpf_text_poke_type { BPF_MOD_JUMP, }; +int bpf_arch_text_poke_type(void *ip, enum bpf_text_poke_type old_t, + enum bpf_text_poke_type new_t, void *addr1, + void *addr2); + int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t, void *addr1, void *addr2); diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index d595fe512498..608c636e6cf0 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -3135,6 +3135,16 @@ int __weak bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t, return -ENOTSUPP; } +int __weak bpf_arch_text_poke_type(void *ip, enum bpf_text_poke_type old_t, + enum bpf_text_poke_type new_t, void *old_addr, + void *new_addr) +{ + if (old_t == new_t) + return bpf_arch_text_poke(ip, old_t, old_addr, new_addr); + + return -EOPNOTSUPP; +} + void * __weak bpf_arch_text_copy(void *dst, void *src, size_t len) { return ERR_PTR(-ENOTSUPP); -- 2.51.2
