bpf: split eBPF out of NET

introduce two configs:
- hidden CONFIG_BPF to select eBPF interpreter that classic socket filters
  depend on
- visible CONFIG_BPF_SYSCALL (default off) that tracing and sockets can use

that solves several problems:
- tracing and others that wish to use eBPF don't need to depend on NET.
  They can use BPF_SYSCALL to allow loading from userspace or select BPF
  to use it directly from kernel in NET-less configs.
- in 3.18 programs cannot be attached to events yet, so don't force it on
- when the rest of eBPF infra is there in 3.19+, it's still useful to
  switch it off to minimize kernel size

bloat-o-meter on x64 shows:
add/remove: 0/60 grow/shrink: 0/2 up/down: 0/-15601 (-15601)

tested with many different config combinations. Hopefully didn't miss anything.

Signed-off-by: Alexei Starovoitov <ast@plumgrid.com>
Acked-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Alexei Starovoitov 2014-10-23 18:41:08 -07:00 committed by David S. Miller
parent 8ae3c911b9
commit f89b7755f5
5 changed files with 28 additions and 5 deletions

View File

@ -1341,6 +1341,10 @@ config SYSCTL_ARCH_UNALIGN_ALLOW
config HAVE_PCSPKR_PLATFORM config HAVE_PCSPKR_PLATFORM
bool bool
# interpreter that classic socket filters depend on
config BPF
bool
menuconfig EXPERT menuconfig EXPERT
bool "Configure standard kernel features (expert users)" bool "Configure standard kernel features (expert users)"
# Unhide debug options, to make the on-by-default options visible # Unhide debug options, to make the on-by-default options visible
@ -1521,6 +1525,16 @@ config EVENTFD
If unsure, say Y. If unsure, say Y.
# syscall, maps, verifier
config BPF_SYSCALL
bool "Enable bpf() system call" if EXPERT
select ANON_INODES
select BPF
default n
help
Enable the bpf() system call that allows to manipulate eBPF
programs and maps via file descriptors.
config SHMEM config SHMEM
bool "Use full shmem filesystem" if EXPERT bool "Use full shmem filesystem" if EXPERT
default y default y

View File

@ -86,7 +86,7 @@ obj-$(CONFIG_RING_BUFFER) += trace/
obj-$(CONFIG_TRACEPOINTS) += trace/ obj-$(CONFIG_TRACEPOINTS) += trace/
obj-$(CONFIG_IRQ_WORK) += irq_work.o obj-$(CONFIG_IRQ_WORK) += irq_work.o
obj-$(CONFIG_CPU_PM) += cpu_pm.o obj-$(CONFIG_CPU_PM) += cpu_pm.o
obj-$(CONFIG_NET) += bpf/ obj-$(CONFIG_BPF) += bpf/
obj-$(CONFIG_PERF_EVENTS) += events/ obj-$(CONFIG_PERF_EVENTS) += events/

View File

@ -1,5 +1,5 @@
obj-y := core.o syscall.o verifier.o obj-y := core.o
obj-$(CONFIG_BPF_SYSCALL) += syscall.o verifier.o
ifdef CONFIG_TEST_BPF ifdef CONFIG_TEST_BPF
obj-y += test_stub.o obj-$(CONFIG_BPF_SYSCALL) += test_stub.o
endif endif

View File

@ -655,3 +655,12 @@ void bpf_prog_free(struct bpf_prog *fp)
schedule_work(&aux->work); schedule_work(&aux->work);
} }
EXPORT_SYMBOL_GPL(bpf_prog_free); EXPORT_SYMBOL_GPL(bpf_prog_free);
/* To execute LD_ABS/LD_IND instructions __bpf_prog_run() may call
* skb_copy_bits(), so provide a weak definition of it for NET-less config.
*/
int __weak skb_copy_bits(const struct sk_buff *skb, int offset, void *to,
int len)
{
return -EFAULT;
}

View File

@ -6,7 +6,7 @@ menuconfig NET
bool "Networking support" bool "Networking support"
select NLATTR select NLATTR
select GENERIC_NET_UTILS select GENERIC_NET_UTILS
select ANON_INODES select BPF
---help--- ---help---
Unless you really know what you are doing, you should say Y here. Unless you really know what you are doing, you should say Y here.
The reason is that some programs need kernel networking support even The reason is that some programs need kernel networking support even