Commit 1f25c9bb authored by David S. Miller's avatar David S. Miller

Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf

Alexei Starovoitov says:

====================
pull-request: bpf 2020-09-29

The following pull-request contains BPF updates for your *net* tree.

We've added 7 non-merge commits during the last 14 day(s) which contain
a total of 7 files changed, 28 insertions(+), 8 deletions(-).

The main changes are:

1) fix xdp loading regression in libbpf for old kernels, from Andrii.

2) Do not discard packet when NETDEV_TX_BUSY, from Magnus.

3) Fix corner cases in libbpf related to endianness and kconfig, from Tony.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 2b3e981a 9cf51446
...@@ -475,7 +475,6 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, ...@@ -475,7 +475,6 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
case BPF_JMP | BPF_JSET | BPF_K: case BPF_JMP | BPF_JSET | BPF_K:
case BPF_JMP | BPF_JSET | BPF_X: case BPF_JMP | BPF_JSET | BPF_X:
true_cond = COND_NE; true_cond = COND_NE;
fallthrough;
cond_branch: cond_branch:
/* same targets, can avoid doing the test :) */ /* same targets, can avoid doing the test :) */
if (filter[i].jt == filter[i].jf) { if (filter[i].jt == filter[i].jf) {
......
...@@ -661,7 +661,7 @@ ...@@ -661,7 +661,7 @@
#define BTF \ #define BTF \
.BTF : AT(ADDR(.BTF) - LOAD_OFFSET) { \ .BTF : AT(ADDR(.BTF) - LOAD_OFFSET) { \
__start_BTF = .; \ __start_BTF = .; \
*(.BTF) \ KEEP(*(.BTF)) \
__stop_BTF = .; \ __stop_BTF = .; \
} \ } \
. = ALIGN(4); \ . = ALIGN(4); \
......
...@@ -30,15 +30,15 @@ static struct kobject *btf_kobj; ...@@ -30,15 +30,15 @@ static struct kobject *btf_kobj;
static int __init btf_vmlinux_init(void) static int __init btf_vmlinux_init(void)
{ {
if (!__start_BTF) bin_attr_btf_vmlinux.size = __stop_BTF - __start_BTF;
if (!__start_BTF || bin_attr_btf_vmlinux.size == 0)
return 0; return 0;
btf_kobj = kobject_create_and_add("btf", kernel_kobj); btf_kobj = kobject_create_and_add("btf", kernel_kobj);
if (!btf_kobj) if (!btf_kobj)
return -ENOMEM; return -ENOMEM;
bin_attr_btf_vmlinux.size = __stop_BTF - __start_BTF;
return sysfs_create_bin_file(btf_kobj, &bin_attr_btf_vmlinux); return sysfs_create_bin_file(btf_kobj, &bin_attr_btf_vmlinux);
} }
......
...@@ -377,15 +377,30 @@ static int xsk_generic_xmit(struct sock *sk) ...@@ -377,15 +377,30 @@ static int xsk_generic_xmit(struct sock *sk)
skb_shinfo(skb)->destructor_arg = (void *)(long)desc.addr; skb_shinfo(skb)->destructor_arg = (void *)(long)desc.addr;
skb->destructor = xsk_destruct_skb; skb->destructor = xsk_destruct_skb;
/* Hinder dev_direct_xmit from freeing the packet and
* therefore completing it in the destructor
*/
refcount_inc(&skb->users);
err = dev_direct_xmit(skb, xs->queue_id); err = dev_direct_xmit(skb, xs->queue_id);
if (err == NETDEV_TX_BUSY) {
/* Tell user-space to retry the send */
skb->destructor = sock_wfree;
/* Free skb without triggering the perf drop trace */
consume_skb(skb);
err = -EAGAIN;
goto out;
}
xskq_cons_release(xs->tx); xskq_cons_release(xs->tx);
/* Ignore NET_XMIT_CN as packet might have been sent */ /* Ignore NET_XMIT_CN as packet might have been sent */
if (err == NET_XMIT_DROP || err == NETDEV_TX_BUSY) { if (err == NET_XMIT_DROP) {
/* SKB completed but not sent */ /* SKB completed but not sent */
kfree_skb(skb);
err = -EBUSY; err = -EBUSY;
goto out; goto out;
} }
consume_skb(skb);
sent_frame = true; sent_frame = true;
} }
......
...@@ -25,7 +25,7 @@ endif ...@@ -25,7 +25,7 @@ endif
LIBBPF = $(LIBBPF_PATH)libbpf.a LIBBPF = $(LIBBPF_PATH)libbpf.a
BPFTOOL_VERSION := $(shell make -rR --no-print-directory -sC ../../.. kernelversion) BPFTOOL_VERSION ?= $(shell make -rR --no-print-directory -sC ../../.. kernelversion)
$(LIBBPF): FORCE $(LIBBPF): FORCE
$(if $(LIBBPF_OUTPUT),@mkdir -p $(LIBBPF_OUTPUT)) $(if $(LIBBPF_OUTPUT),@mkdir -p $(LIBBPF_OUTPUT))
......
...@@ -659,6 +659,12 @@ struct btf *btf__parse_raw(const char *path) ...@@ -659,6 +659,12 @@ struct btf *btf__parse_raw(const char *path)
err = -EIO; err = -EIO;
goto err_out; goto err_out;
} }
if (magic == __bswap_16(BTF_MAGIC)) {
/* non-native endian raw BTF */
pr_warn("non-native BTF endianness is not supported\n");
err = -LIBBPF_ERRNO__ENDIAN;
goto err_out;
}
if (magic != BTF_MAGIC) { if (magic != BTF_MAGIC) {
/* definitely not a raw BTF */ /* definitely not a raw BTF */
err = -EPROTO; err = -EPROTO;
......
...@@ -6925,7 +6925,7 @@ static const struct bpf_sec_def section_defs[] = { ...@@ -6925,7 +6925,7 @@ static const struct bpf_sec_def section_defs[] = {
BPF_XDP_DEVMAP), BPF_XDP_DEVMAP),
BPF_EAPROG_SEC("xdp_cpumap/", BPF_PROG_TYPE_XDP, BPF_EAPROG_SEC("xdp_cpumap/", BPF_PROG_TYPE_XDP,
BPF_XDP_CPUMAP), BPF_XDP_CPUMAP),
BPF_EAPROG_SEC("xdp", BPF_PROG_TYPE_XDP, BPF_APROG_SEC("xdp", BPF_PROG_TYPE_XDP,
BPF_XDP), BPF_XDP),
BPF_PROG_SEC("perf_event", BPF_PROG_TYPE_PERF_EVENT), BPF_PROG_SEC("perf_event", BPF_PROG_TYPE_PERF_EVENT),
BPF_PROG_SEC("lwt_in", BPF_PROG_TYPE_LWT_IN), BPF_PROG_SEC("lwt_in", BPF_PROG_TYPE_LWT_IN),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment