Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
authorJakub Kicinski <jakub.kicinski@netronome.com>
Tue, 13 Aug 2019 23:24:57 +0000 (16:24 -0700)
committerJakub Kicinski <jakub.kicinski@netronome.com>
Tue, 13 Aug 2019 23:24:57 +0000 (16:24 -0700)
Daniel Borkmann says:

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

There is a small merge conflict in libbpf (Cc Andrii so he's in the loop
as well):

        for (i = 1; i <= btf__get_nr_types(btf); i++) {
                t = (struct btf_type *)btf__type_by_id(btf, i);

                if (!has_datasec && btf_is_var(t)) {
                        /* replace VAR with INT */
                        t->info = BTF_INFO_ENC(BTF_KIND_INT, 0, 0);
  <<<<<<< HEAD
                        /*
                         * using size = 1 is the safest choice, 4 will be too
                         * big and cause kernel BTF validation failure if
                         * original variable took less than 4 bytes
                         */
                        t->size = 1;
                        *(int *)(t+1) = BTF_INT_ENC(0, 0, 8);
                } else if (!has_datasec && kind == BTF_KIND_DATASEC) {
  =======
                        t->size = sizeof(int);
                        *(int *)(t + 1) = BTF_INT_ENC(0, 0, 32);
                } else if (!has_datasec && btf_is_datasec(t)) {
  >>>>>>> 72ef80b5ee131e96172f19e74b4f98fa3404efe8
                        /* replace DATASEC with STRUCT */

Conflict is between the two commits 1d4126c4e119 ("libbpf: sanitize VAR to
conservative 1-byte INT") and b03bc6853c0e ("libbpf: convert libbpf code to
use new btf helpers"), so we need to pick the sanitation fixup as well as
use the new btf_is_datasec() helper and the whitespace cleanup. Looks like
the following:

  [...]
                if (!has_datasec && btf_is_var(t)) {
                        /* replace VAR with INT */
                        t->info = BTF_INFO_ENC(BTF_KIND_INT, 0, 0);
                        /*
                         * using size = 1 is the safest choice, 4 will be too
                         * big and cause kernel BTF validation failure if
                         * original variable took less than 4 bytes
                         */
                        t->size = 1;
                        *(int *)(t + 1) = BTF_INT_ENC(0, 0, 8);
                } else if (!has_datasec && btf_is_datasec(t)) {
                        /* replace DATASEC with STRUCT */
  [...]

The main changes are:

1) Addition of core parts of compile once - run everywhere (co-re) effort,
   that is, relocation of fields offsets in libbpf as well as exposure of
   kernel's own BTF via sysfs and loading through libbpf, from Andrii.

   More info on co-re: http://vger.kernel.org/bpfconf2019.html#session-2
   and http://vger.kernel.org/lpc-bpf2018.html#session-2

2) Enable passing input flags to the BPF flow dissector to customize parsing
   and allowing it to stop early similar to the C based one, from Stanislav.

3) Add a BPF helper function that allows generating SYN cookies from XDP and
   tc BPF, from Petar.

4) Add devmap hash-based map type for more flexibility in device lookup for
   redirects, from Toke.

5) Improvements to XDP forwarding sample code now utilizing recently enabled
   devmap lookups, from Jesper.

6) Add support for reporting the effective cgroup progs in bpftool, from Jakub
   and Takshak.

7) Fix reading kernel config from bpftool via /proc/config.gz, from Peter.

8) Fix AF_XDP umem pages mapping for 32 bit architectures, from Ivan.

9) Follow-up to add two more BPF loop tests for the selftest suite, from Alexei.

10) Add perf event output helper also for other skb-based program types, from Allan.

11) Fix a co-re related compilation error in selftests, from Yonghong.
====================

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
1  2 
include/linux/skbuff.h
include/net/tcp.h
kernel/bpf/verifier.c
net/core/filter.c
net/ipv4/tcp_ipv4.c
scripts/link-vmlinux.sh
tools/lib/bpf/btf.c
tools/lib/bpf/libbpf.c
tools/testing/selftests/bpf/Makefile

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 2586b6cb8f34f2ce30e382f3ddd60687f9971ecc,8462dab0281289802713ba34b0b755141ec15e63..2233f919dd88fe4d18302594ae2605b749e91eaa
@@@ -1373,22 -1374,16 +1375,21 @@@ static void bpf_object__sanitize_btf(st
  
        for (i = 1; i <= btf__get_nr_types(btf); i++) {
                t = (struct btf_type *)btf__type_by_id(btf, i);
-               kind = BTF_INFO_KIND(t->info);
  
-               if (!has_datasec && kind == BTF_KIND_VAR) {
+               if (!has_datasec && btf_is_var(t)) {
                        /* replace VAR with INT */
                        t->info = BTF_INFO_ENC(BTF_KIND_INT, 0, 0);
 -                      t->size = sizeof(int);
 -                      *(int *)(t + 1) = BTF_INT_ENC(0, 0, 32);
 +                      /*
 +                       * using size = 1 is the safest choice, 4 will be too
 +                       * big and cause kernel BTF validation failure if
 +                       * original variable took less than 4 bytes
 +                       */
 +                      t->size = 1;
-                       *(int *)(t+1) = BTF_INT_ENC(0, 0, 8);
-               } else if (!has_datasec && kind == BTF_KIND_DATASEC) {
++                      *(int *)(t + 1) = BTF_INT_ENC(0, 0, 8);
+               } else if (!has_datasec && btf_is_datasec(t)) {
                        /* replace DATASEC with STRUCT */
-                       struct btf_var_secinfo *v = (void *)(t + 1);
-                       struct btf_member *m = (void *)(t + 1);
+                       const struct btf_var_secinfo *v = btf_var_secinfos(t);
+                       struct btf_member *m = btf_members(t);
                        struct btf_type *vt;
                        char *name;
  
Simple merge