mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	bpf: Revert ("Fix dispatcher patchable function entry to 5 bytes nop")
Because __attribute__((patchable_function_entry)) is only available since GCC-8 this solution fails to build on the minimum required GCC version. Undo these changes so we might try again -- without cluttering up the patches with too many changes. This is an almost complete revert of:dbe69b2998("bpf: Fix dispatcher patchable function entry to 5 bytes nop")ceea991a01("bpf: Move bpf_dispatcher function out of ftrace locations") (notably the arch/x86/Kconfig hunk is kept). Reported-by: David Laight <David.Laight@aculab.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Tested-by: Björn Töpel <bjorn@kernel.org> Tested-by: Jiri Olsa <jolsa@kernel.org> Acked-by: Björn Töpel <bjorn@kernel.org> Acked-by: Jiri Olsa <jolsa@kernel.org> Link: https://lkml.kernel.org/r/439d8dc735bb4858875377df67f1b29a@AcuMS.aculab.com Link: https://lore.kernel.org/bpf/20221103120647.728830733@infradead.org
This commit is contained in:
		
							parent
							
								
									d3fd203f36
								
							
						
					
					
						commit
						18acb7fac2
					
				
					 3 changed files with 1 additions and 39 deletions
				
			
		| 
						 | 
				
			
			@ -11,7 +11,6 @@
 | 
			
		|||
#include <linux/bpf.h>
 | 
			
		||||
#include <linux/memory.h>
 | 
			
		||||
#include <linux/sort.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <asm/extable.h>
 | 
			
		||||
#include <asm/set_memory.h>
 | 
			
		||||
#include <asm/nospec-branch.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -389,18 +388,6 @@ static int __bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
 | 
			
		|||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int __init bpf_arch_init_dispatcher_early(void *ip)
 | 
			
		||||
{
 | 
			
		||||
	const u8 *nop_insn = x86_nops[5];
 | 
			
		||||
 | 
			
		||||
	if (is_endbr(*(u32 *)ip))
 | 
			
		||||
		ip += ENDBR_INSN_SIZE;
 | 
			
		||||
 | 
			
		||||
	if (memcmp(ip, nop_insn, X86_PATCH_SIZE))
 | 
			
		||||
		text_poke_early(ip, nop_insn, X86_PATCH_SIZE);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
 | 
			
		||||
		       void *old_addr, void *new_addr)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,6 @@
 | 
			
		|||
#include <linux/bpfptr.h>
 | 
			
		||||
#include <linux/btf.h>
 | 
			
		||||
#include <linux/rcupdate_trace.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
 | 
			
		||||
struct bpf_verifier_env;
 | 
			
		||||
struct bpf_verifier_log;
 | 
			
		||||
| 
						 | 
				
			
			@ -971,8 +970,6 @@ struct bpf_trampoline *bpf_trampoline_get(u64 key,
 | 
			
		|||
					  struct bpf_attach_target_info *tgt_info);
 | 
			
		||||
void bpf_trampoline_put(struct bpf_trampoline *tr);
 | 
			
		||||
int arch_prepare_bpf_dispatcher(void *image, void *buf, s64 *funcs, int num_funcs);
 | 
			
		||||
int __init bpf_arch_init_dispatcher_early(void *ip);
 | 
			
		||||
 | 
			
		||||
#define BPF_DISPATCHER_INIT(_name) {				\
 | 
			
		||||
	.mutex = __MUTEX_INITIALIZER(_name.mutex),		\
 | 
			
		||||
	.func = &_name##_func,					\
 | 
			
		||||
| 
						 | 
				
			
			@ -986,21 +983,7 @@ int __init bpf_arch_init_dispatcher_early(void *ip);
 | 
			
		|||
	},							\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define BPF_DISPATCHER_INIT_CALL(_name)					\
 | 
			
		||||
	static int __init _name##_init(void)				\
 | 
			
		||||
	{								\
 | 
			
		||||
		return bpf_arch_init_dispatcher_early(_name##_func);	\
 | 
			
		||||
	}								\
 | 
			
		||||
	early_initcall(_name##_init)
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_X86_64
 | 
			
		||||
#define BPF_DISPATCHER_ATTRIBUTES __attribute__((patchable_function_entry(5)))
 | 
			
		||||
#else
 | 
			
		||||
#define BPF_DISPATCHER_ATTRIBUTES
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define DEFINE_BPF_DISPATCHER(name)					\
 | 
			
		||||
	notrace BPF_DISPATCHER_ATTRIBUTES				\
 | 
			
		||||
	noinline __nocfi unsigned int bpf_dispatcher_##name##_func(	\
 | 
			
		||||
		const void *ctx,					\
 | 
			
		||||
		const struct bpf_insn *insnsi,				\
 | 
			
		||||
| 
						 | 
				
			
			@ -1010,9 +993,7 @@ int __init bpf_arch_init_dispatcher_early(void *ip);
 | 
			
		|||
	}								\
 | 
			
		||||
	EXPORT_SYMBOL(bpf_dispatcher_##name##_func);			\
 | 
			
		||||
	struct bpf_dispatcher bpf_dispatcher_##name =			\
 | 
			
		||||
		BPF_DISPATCHER_INIT(bpf_dispatcher_##name);		\
 | 
			
		||||
	BPF_DISPATCHER_INIT_CALL(bpf_dispatcher_##name);
 | 
			
		||||
 | 
			
		||||
		BPF_DISPATCHER_INIT(bpf_dispatcher_##name);
 | 
			
		||||
#define DECLARE_BPF_DISPATCHER(name)					\
 | 
			
		||||
	unsigned int bpf_dispatcher_##name##_func(			\
 | 
			
		||||
		const void *ctx,					\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,6 @@
 | 
			
		|||
#include <linux/hash.h>
 | 
			
		||||
#include <linux/bpf.h>
 | 
			
		||||
#include <linux/filter.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
 | 
			
		||||
/* The BPF dispatcher is a multiway branch code generator. The
 | 
			
		||||
 * dispatcher is a mechanism to avoid the performance penalty of an
 | 
			
		||||
| 
						 | 
				
			
			@ -91,11 +90,6 @@ int __weak arch_prepare_bpf_dispatcher(void *image, void *buf, s64 *funcs, int n
 | 
			
		|||
	return -ENOTSUPP;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int __weak __init bpf_arch_init_dispatcher_early(void *ip)
 | 
			
		||||
{
 | 
			
		||||
	return -ENOTSUPP;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int bpf_dispatcher_prepare(struct bpf_dispatcher *d, void *image, void *buf)
 | 
			
		||||
{
 | 
			
		||||
	s64 ips[BPF_DISPATCHER_MAX] = {}, *ipsp = &ips[0];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue