Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
Alexei Starovoitov says: ==================== pull-request: bpf-next 2021-03-09 The following pull-request contains BPF updates for your *net-next* tree. We've added 90 non-merge commits during the last 17 day(s) which contain a total of 114 files changed, 5158 insertions(+), 1288 deletions(-). The main changes are: 1) Faster bpf_redirect_map(), from Björn. 2) skmsg cleanup, from Cong. 3) Support for floating point types in BTF, from Ilya. 4) Documentation for sys_bpf commands, from Joe. 5) Support for sk_lookup in bpf_prog_test_run, form Lorenz. 6) Enable task local storage for tracing programs, from Song. 7) bpf_for_each_map_elem() helper, from Yonghong. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1,60 +0,0 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
ifndef allow-override
|
||||
include ../scripts/Makefile.include
|
||||
include ../scripts/utilities.mak
|
||||
else
|
||||
# Assume Makefile.helpers is being run from bpftool/Documentation
|
||||
# subdirectory. Go up two more directories to fetch bpf.h header and
|
||||
# associated script.
|
||||
UP2DIR := ../../
|
||||
endif
|
||||
|
||||
INSTALL ?= install
|
||||
RM ?= rm -f
|
||||
RMDIR ?= rmdir --ignore-fail-on-non-empty
|
||||
|
||||
ifeq ($(V),1)
|
||||
Q =
|
||||
else
|
||||
Q = @
|
||||
endif
|
||||
|
||||
prefix ?= /usr/local
|
||||
mandir ?= $(prefix)/man
|
||||
man7dir = $(mandir)/man7
|
||||
|
||||
HELPERS_RST = bpf-helpers.rst
|
||||
MAN7_RST = $(HELPERS_RST)
|
||||
|
||||
_DOC_MAN7 = $(patsubst %.rst,%.7,$(MAN7_RST))
|
||||
DOC_MAN7 = $(addprefix $(OUTPUT),$(_DOC_MAN7))
|
||||
|
||||
helpers: man7
|
||||
man7: $(DOC_MAN7)
|
||||
|
||||
RST2MAN_DEP := $(shell command -v rst2man 2>/dev/null)
|
||||
|
||||
$(OUTPUT)$(HELPERS_RST): $(UP2DIR)../../include/uapi/linux/bpf.h
|
||||
$(QUIET_GEN)$(UP2DIR)../../scripts/bpf_helpers_doc.py --filename $< > $@
|
||||
|
||||
$(OUTPUT)%.7: $(OUTPUT)%.rst
|
||||
ifndef RST2MAN_DEP
|
||||
$(error "rst2man not found, but required to generate man pages")
|
||||
endif
|
||||
$(QUIET_GEN)rst2man $< > $@
|
||||
|
||||
helpers-clean:
|
||||
$(call QUIET_CLEAN, eBPF_helpers-manpage)
|
||||
$(Q)$(RM) $(DOC_MAN7) $(OUTPUT)$(HELPERS_RST)
|
||||
|
||||
helpers-install: helpers
|
||||
$(call QUIET_INSTALL, eBPF_helpers-manpage)
|
||||
$(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(man7dir)
|
||||
$(Q)$(INSTALL) -m 644 $(DOC_MAN7) $(DESTDIR)$(man7dir)
|
||||
|
||||
helpers-uninstall:
|
||||
$(call QUIET_UNINST, eBPF_helpers-manpage)
|
||||
$(Q)$(RM) $(addprefix $(DESTDIR)$(man7dir)/,$(_DOC_MAN7))
|
||||
$(Q)$(RMDIR) $(DESTDIR)$(man7dir)
|
||||
|
||||
.PHONY: helpers helpers-clean helpers-install helpers-uninstall
|
||||
@@ -1198,7 +1198,7 @@ static int cmd_run(char *num)
|
||||
else
|
||||
return CMD_OK;
|
||||
bpf_reset();
|
||||
} while (pcap_next_pkt() && (!has_limit || (has_limit && ++i < pkts)));
|
||||
} while (pcap_next_pkt() && (!has_limit || (++i < pkts)));
|
||||
|
||||
rl_printf("bpf passes:%u fails:%u\n", pass, fail);
|
||||
|
||||
|
||||
@@ -185,13 +185,13 @@ ldx
|
||||
| OP_LDXB number '*' '(' '[' number ']' '&' number ')' {
|
||||
if ($2 != 4 || $9 != 0xf) {
|
||||
fprintf(stderr, "ldxb offset not supported!\n");
|
||||
exit(0);
|
||||
exit(1);
|
||||
} else {
|
||||
bpf_set_curr_instr(BPF_LDX | BPF_MSH | BPF_B, 0, 0, $6); } }
|
||||
| OP_LDX number '*' '(' '[' number ']' '&' number ')' {
|
||||
if ($2 != 4 || $9 != 0xf) {
|
||||
fprintf(stderr, "ldxb offset not supported!\n");
|
||||
exit(0);
|
||||
exit(1);
|
||||
} else {
|
||||
bpf_set_curr_instr(BPF_LDX | BPF_MSH | BPF_B, 0, 0, $6); } }
|
||||
;
|
||||
@@ -472,7 +472,7 @@ static void bpf_assert_max(void)
|
||||
{
|
||||
if (curr_instr >= BPF_MAXINSNS) {
|
||||
fprintf(stderr, "only max %u insns allowed!\n", BPF_MAXINSNS);
|
||||
exit(0);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -522,7 +522,7 @@ static int bpf_find_insns_offset(const char *label)
|
||||
|
||||
if (ret == -ENOENT) {
|
||||
fprintf(stderr, "no such label \'%s\'!\n", label);
|
||||
exit(0);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -549,9 +549,11 @@ static uint8_t bpf_encode_jt_jf_offset(int off, int i)
|
||||
{
|
||||
int delta = off - i - 1;
|
||||
|
||||
if (delta < 0 || delta > 255)
|
||||
fprintf(stderr, "warning: insn #%d jumps to insn #%d, "
|
||||
if (delta < 0 || delta > 255) {
|
||||
fprintf(stderr, "error: insn #%d jumps to insn #%d, "
|
||||
"which is out of range\n", i, off);
|
||||
exit(1);
|
||||
}
|
||||
return (uint8_t) delta;
|
||||
}
|
||||
|
||||
|
||||
1
tools/bpf/bpftool/.gitignore
vendored
1
tools/bpf/bpftool/.gitignore
vendored
@@ -3,7 +3,6 @@
|
||||
/bootstrap/
|
||||
/bpftool
|
||||
bpftool*.8
|
||||
bpf-helpers.*
|
||||
FEATURE-DUMP.bpftool
|
||||
feature
|
||||
libbpf
|
||||
|
||||
@@ -16,15 +16,12 @@ prefix ?= /usr/local
|
||||
mandir ?= $(prefix)/man
|
||||
man8dir = $(mandir)/man8
|
||||
|
||||
# Load targets for building eBPF helpers man page.
|
||||
include ../../Makefile.helpers
|
||||
|
||||
MAN8_RST = $(wildcard bpftool*.rst)
|
||||
|
||||
_DOC_MAN8 = $(patsubst %.rst,%.8,$(MAN8_RST))
|
||||
DOC_MAN8 = $(addprefix $(OUTPUT),$(_DOC_MAN8))
|
||||
|
||||
man: man8 helpers
|
||||
man: man8
|
||||
man8: $(DOC_MAN8)
|
||||
|
||||
RST2MAN_DEP := $(shell command -v rst2man 2>/dev/null)
|
||||
@@ -46,16 +43,16 @@ ifndef RST2MAN_DEP
|
||||
endif
|
||||
$(QUIET_GEN)( cat $< ; printf "%b" $(call see_also,$<) ) | rst2man $(RST2MAN_OPTS) > $@
|
||||
|
||||
clean: helpers-clean
|
||||
clean:
|
||||
$(call QUIET_CLEAN, Documentation)
|
||||
$(Q)$(RM) $(DOC_MAN8)
|
||||
|
||||
install: man helpers-install
|
||||
install: man
|
||||
$(call QUIET_INSTALL, Documentation-man)
|
||||
$(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(man8dir)
|
||||
$(Q)$(INSTALL) -m 644 $(DOC_MAN8) $(DESTDIR)$(man8dir)
|
||||
|
||||
uninstall: helpers-uninstall
|
||||
uninstall:
|
||||
$(call QUIET_UNINST, Documentation-man)
|
||||
$(Q)$(RM) $(addprefix $(DESTDIR)$(man8dir)/,$(_DOC_MAN8))
|
||||
$(Q)$(RMDIR) $(DESTDIR)$(man8dir)
|
||||
|
||||
@@ -36,6 +36,7 @@ static const char * const btf_kind_str[NR_BTF_KINDS] = {
|
||||
[BTF_KIND_FUNC_PROTO] = "FUNC_PROTO",
|
||||
[BTF_KIND_VAR] = "VAR",
|
||||
[BTF_KIND_DATASEC] = "DATASEC",
|
||||
[BTF_KIND_FLOAT] = "FLOAT",
|
||||
};
|
||||
|
||||
struct btf_attach_table {
|
||||
@@ -327,6 +328,13 @@ static int dump_btf_type(const struct btf *btf, __u32 id,
|
||||
jsonw_end_array(w);
|
||||
break;
|
||||
}
|
||||
case BTF_KIND_FLOAT: {
|
||||
if (json_output)
|
||||
jsonw_uint_field(w, "size", t->size);
|
||||
else
|
||||
printf(" size=%u", t->size);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -596,6 +596,7 @@ static int __btf_dumper_type_only(const struct btf *btf, __u32 type_id,
|
||||
switch (BTF_INFO_KIND(t->info)) {
|
||||
case BTF_KIND_INT:
|
||||
case BTF_KIND_TYPEDEF:
|
||||
case BTF_KIND_FLOAT:
|
||||
BTF_PRINT_ARG("%s ", btf__name_by_offset(btf, t->name_off));
|
||||
break;
|
||||
case BTF_KIND_STRUCT:
|
||||
|
||||
@@ -336,6 +336,10 @@ static void probe_kernel_image_config(const char *define_prefix)
|
||||
{ "CONFIG_BPF_JIT", },
|
||||
/* Avoid compiling eBPF interpreter (use JIT only) */
|
||||
{ "CONFIG_BPF_JIT_ALWAYS_ON", },
|
||||
/* Kernel BTF debug information available */
|
||||
{ "CONFIG_DEBUG_INFO_BTF", },
|
||||
/* Kernel module BTF debug information available */
|
||||
{ "CONFIG_DEBUG_INFO_BTF_MODULES", },
|
||||
|
||||
/* cgroups */
|
||||
{ "CONFIG_CGROUPS", },
|
||||
|
||||
@@ -196,6 +196,9 @@ static const char *print_imm(void *private_data,
|
||||
else if (insn->src_reg == BPF_PSEUDO_MAP_VALUE)
|
||||
snprintf(dd->scratch_buff, sizeof(dd->scratch_buff),
|
||||
"map[id:%u][0]+%u", insn->imm, (insn + 1)->imm);
|
||||
else if (insn->src_reg == BPF_PSEUDO_FUNC)
|
||||
snprintf(dd->scratch_buff, sizeof(dd->scratch_buff),
|
||||
"subprog[%+d]", insn->imm);
|
||||
else
|
||||
snprintf(dd->scratch_buff, sizeof(dd->scratch_buff),
|
||||
"0x%llx", (unsigned long long)full_imm);
|
||||
|
||||
@@ -16,7 +16,10 @@ CFLAGS := -g -Wall
|
||||
|
||||
# Try to detect best kernel BTF source
|
||||
KERNEL_REL := $(shell uname -r)
|
||||
VMLINUX_BTF_PATHS := /sys/kernel/btf/vmlinux /boot/vmlinux-$(KERNEL_REL)
|
||||
VMLINUX_BTF_PATHS := $(if $(O),$(O)/vmlinux) \
|
||||
$(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
|
||||
../../../vmlinux /sys/kernel/btf/vmlinux \
|
||||
/boot/vmlinux-$(KERNEL_REL)
|
||||
VMLINUX_BTF_PATH := $(or $(VMLINUX_BTF),$(firstword \
|
||||
$(wildcard $(VMLINUX_BTF_PATHS))))
|
||||
|
||||
@@ -66,12 +69,16 @@ $(OUTPUT) $(BPFOBJ_OUTPUT) $(BPFTOOL_OUTPUT):
|
||||
$(QUIET_MKDIR)mkdir -p $@
|
||||
|
||||
$(OUTPUT)/vmlinux.h: $(VMLINUX_BTF_PATH) | $(OUTPUT) $(BPFTOOL)
|
||||
ifeq ($(VMLINUX_H),)
|
||||
$(Q)if [ ! -e "$(VMLINUX_BTF_PATH)" ] ; then \
|
||||
echo "Couldn't find kernel BTF; set VMLINUX_BTF to" \
|
||||
"specify its location." >&2; \
|
||||
exit 1;\
|
||||
fi
|
||||
$(QUIET_GEN)$(BPFTOOL) btf dump file $(VMLINUX_BTF_PATH) format c > $@
|
||||
else
|
||||
$(Q)cp "$(VMLINUX_H)" $@
|
||||
endif
|
||||
|
||||
$(BPFOBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(BPFOBJ_OUTPUT)
|
||||
$(Q)$(MAKE) $(submake_extras) -C $(LIBBPF_SRC) OUTPUT=$(BPFOBJ_OUTPUT) $@
|
||||
|
||||
@@ -11,9 +11,9 @@ const volatile __u64 min_us = 0;
|
||||
const volatile pid_t targ_pid = 0;
|
||||
|
||||
struct {
|
||||
__uint(type, BPF_MAP_TYPE_HASH);
|
||||
__uint(max_entries, 10240);
|
||||
__type(key, u32);
|
||||
__uint(type, BPF_MAP_TYPE_TASK_STORAGE);
|
||||
__uint(map_flags, BPF_F_NO_PREALLOC);
|
||||
__type(key, int);
|
||||
__type(value, u64);
|
||||
} start SEC(".maps");
|
||||
|
||||
@@ -25,15 +25,20 @@ struct {
|
||||
|
||||
/* record enqueue timestamp */
|
||||
__always_inline
|
||||
static int trace_enqueue(u32 tgid, u32 pid)
|
||||
static int trace_enqueue(struct task_struct *t)
|
||||
{
|
||||
u64 ts;
|
||||
u32 pid = t->pid;
|
||||
u64 *ptr;
|
||||
|
||||
if (!pid || (targ_pid && targ_pid != pid))
|
||||
return 0;
|
||||
|
||||
ts = bpf_ktime_get_ns();
|
||||
bpf_map_update_elem(&start, &pid, &ts, 0);
|
||||
ptr = bpf_task_storage_get(&start, t, 0,
|
||||
BPF_LOCAL_STORAGE_GET_F_CREATE);
|
||||
if (!ptr)
|
||||
return 0;
|
||||
|
||||
*ptr = bpf_ktime_get_ns();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -43,7 +48,7 @@ int handle__sched_wakeup(u64 *ctx)
|
||||
/* TP_PROTO(struct task_struct *p) */
|
||||
struct task_struct *p = (void *)ctx[0];
|
||||
|
||||
return trace_enqueue(p->tgid, p->pid);
|
||||
return trace_enqueue(p);
|
||||
}
|
||||
|
||||
SEC("tp_btf/sched_wakeup_new")
|
||||
@@ -52,7 +57,7 @@ int handle__sched_wakeup_new(u64 *ctx)
|
||||
/* TP_PROTO(struct task_struct *p) */
|
||||
struct task_struct *p = (void *)ctx[0];
|
||||
|
||||
return trace_enqueue(p->tgid, p->pid);
|
||||
return trace_enqueue(p);
|
||||
}
|
||||
|
||||
SEC("tp_btf/sched_switch")
|
||||
@@ -70,12 +75,16 @@ int handle__sched_switch(u64 *ctx)
|
||||
|
||||
/* ivcsw: treat like an enqueue event and store timestamp */
|
||||
if (prev->state == TASK_RUNNING)
|
||||
trace_enqueue(prev->tgid, prev->pid);
|
||||
trace_enqueue(prev);
|
||||
|
||||
pid = next->pid;
|
||||
|
||||
/* For pid mismatch, save a bpf_task_storage_get */
|
||||
if (!pid || (targ_pid && targ_pid != pid))
|
||||
return 0;
|
||||
|
||||
/* fetch timestamp and calculate delta */
|
||||
tsp = bpf_map_lookup_elem(&start, &pid);
|
||||
tsp = bpf_task_storage_get(&start, next, 0, 0);
|
||||
if (!tsp)
|
||||
return 0; /* missed enqueue */
|
||||
|
||||
@@ -91,7 +100,7 @@ int handle__sched_switch(u64 *ctx)
|
||||
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU,
|
||||
&event, sizeof(event));
|
||||
|
||||
bpf_map_delete_elem(&start, &pid);
|
||||
bpf_task_storage_delete(&start, next);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user