20 Dec, 2017

1 commit


12 May, 2017

2 commits

  • Shahid Habib noticed that when xdp1 was killed from a different console the xdp
    program was not cleaned-up properly in the kernel and it continued to forward
    traffic.

    Most of the applications in samples/bpf cleanup properly, but only when getting
    SIGINT. Since kill defaults to using SIGTERM, add support to cleanup when the
    application receives either SIGINT or SIGTERM.

    Signed-off-by: Andy Gospodarek
    Reported-by: Shahid Habib
    Acked-by: Alexei Starovoitov
    Acked-by: Daniel Borkmann
    Signed-off-by: David S. Miller

    Andy Gospodarek
     
  • After commit b5cdae3291f7 ("net: Generic XDP") we automatically fall
    back to a generic XDP variant if the driver does not support native
    XDP. Allow for an option where the user can specify that always the
    native XDP variant should be selected and in case it's not supported
    by a driver, just bail out.

    Signed-off-by: Daniel Borkmann
    Acked-by: Alexei Starovoitov
    Signed-off-by: David S. Miller

    Daniel Borkmann
     

01 May, 2017

1 commit

  • The kernel side of XDP_FLAGS_SKB_MODE is unsigned, and the rtnetlink
    IFLA_XDP_FLAGS is defined as NLA_U32. Thus, userspace programs under
    samples/bpf/ should use the correct type.

    Fixes: 3993f2cb983b ("samples/bpf: Add support for SKB_MODE to xdp1 and xdp_tx_iptunnel")
    Signed-off-by: Jesper Dangaard Brouer
    Acked-by: Daniel Borkmann
    Reviewed-by: Andy Gospodarek
    Signed-off-by: David S. Miller

    Jesper Dangaard Brouer
     

28 Apr, 2017

1 commit

  • Add option to xdp1 and xdp_tx_iptunnel to insert xdp program in
    SKB_MODE:
    - update set_link_xdp_fd to take a flags argument that is added to the
    RTM_SETLINK message

    - Add -S option to xdp1 and xdp_tx_iptunnel user code. When passed in
    XDP_FLAGS_SKB_MODE is set in the flags arg passed to set_link_xdp_fd

    Signed-off-by: David Ahern
    Acked-by: Alexei Starovoitov
    Signed-off-by: David S. Miller

    David Ahern
     

16 Dec, 2016

1 commit

  • Switch all of the sample code to use the function names from
    tools/lib/bpf so that they're consistent with that, and to declare their
    own log buffers. This allow the next commit to be purely devoted to
    getting rid of the duplicate library in samples/bpf.

    Committer notes:

    Testing it:

    On a fedora rawhide container, with clang/llvm 3.9, sharing the host
    linux kernel git tree:

    # make O=/tmp/build/linux/ headers_install
    # make O=/tmp/build/linux -C samples/bpf/

    Since I forgot to make it privileged, just tested it outside the
    container, using what it generated:

    # uname -a
    Linux jouet 4.9.0-rc8+ #1 SMP Mon Dec 12 11:20:49 BRT 2016 x86_64 x86_64 x86_64 GNU/Linux
    # cd /var/lib/docker/devicemapper/mnt/c43e09a53ff56c86a07baf79847f00e2cc2a17a1e2220e1adbf8cbc62734feda/rootfs/tmp/build/linux/samples/bpf/
    # ls -la offwaketime
    -rwxr-xr-x. 1 root root 24200 Dec 15 12:19 offwaketime
    # file offwaketime
    offwaketime: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=c940d3f127d5e66cdd680e42d885cb0b64f8a0e4, not stripped
    # readelf -SW offwaketime_kern.o | grep PROGBITS
    [ 2] .text PROGBITS 0000000000000000 000040 000000 00 AX 0 0 4
    [ 3] kprobe/try_to_wake_up PROGBITS 0000000000000000 000040 0000d8 00 AX 0 0 8
    [ 5] tracepoint/sched/sched_switch PROGBITS 0000000000000000 000118 000318 00 AX 0 0 8
    [ 7] maps PROGBITS 0000000000000000 000430 000050 00 WA 0 0 4
    [ 8] license PROGBITS 0000000000000000 000480 000004 00 WA 0 0 1
    [ 9] version PROGBITS 0000000000000000 000484 000004 00 WA 0 0 4
    # ./offwaketime | head -5
    swapper/1;start_secondary;cpu_startup_entry;schedule_preempt_disabled;schedule;__schedule;-;---;; 106
    CPU 0/KVM;entry_SYSCALL_64_fastpath;sys_ioctl;do_vfs_ioctl;kvm_vcpu_ioctl;kvm_arch_vcpu_ioctl_run;kvm_vcpu_block;schedule;__schedule;-;try_to_wake_up;swake_up_locked;swake_up;apic_timer_expired;apic_timer_fn;__hrtimer_run_queues;hrtimer_interrupt;local_apic_timer_interrupt;smp_apic_timer_interrupt;__irqentry_text_start;cpuidle_enter;call_cpuidle;cpu_startup_entry;start_secondary;;swapper/3 2
    Compositor;entry_SYSCALL_64_fastpath;sys_futex;do_futex;futex_wait;futex_wait_queue_me;schedule;__schedule;-;try_to_wake_up;futex_requeue;do_futex;sys_futex;entry_SYSCALL_64_fastpath;;SoftwareVsyncTh 5
    firefox;entry_SYSCALL_64_fastpath;sys_poll;do_sys_poll;poll_schedule_timeout;schedule_hrtimeout_range;schedule_hrtimeout_range_clock;schedule;__schedule;-;try_to_wake_up;pollwake;__wake_up_common;__wake_up_sync_key;pipe_write;__vfs_write;vfs_write;sys_write;entry_SYSCALL_64_fastpath;;Timer 13
    JS Helper;entry_SYSCALL_64_fastpath;sys_futex;do_futex;futex_wait;futex_wait_queue_me;schedule;__schedule;-;try_to_wake_up;do_futex;sys_futex;entry_SYSCALL_64_fastpath;;firefox 2
    #

    Signed-off-by: Joe Stringer
    Tested-by: Arnaldo Carvalho de Melo
    Cc: Alexei Starovoitov
    Cc: Daniel Borkmann
    Cc: Wang Nan
    Cc: netdev@vger.kernel.org
    Link: http://lkml.kernel.org/r/20161214224342.12858-2-joe@ovn.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Joe Stringer
     

09 Dec, 2016

1 commit

  • The XDP prog checks if the incoming packet matches any VIP:PORT
    combination in the BPF hashmap. If it is, it will encapsulate
    the packet with a IPv4/v6 header as instructed by the value of
    the BPF hashmap and then XDP_TX it out.

    The VIP:PORT -> IP-Encap-Info can be specified by the cmd args
    of the user prog.

    Acked-by: Alexei Starovoitov
    Signed-off-by: Martin KaFai Lau
    Signed-off-by: David S. Miller

    Martin KaFai Lau
     

28 Nov, 2016

1 commit

  • 1) The test_lru_map and test_lru_dist fails building on my machine since
    the sys/resource.h header is not included.

    2) test_verifier fails in one test case where we try to call an invalid
    function, since the verifier log output changed wrt printing function
    names.

    3) Current selftest suite code relies on sysconf(_SC_NPROCESSORS_CONF) for
    retrieving the number of possible CPUs. This is broken at least in our
    scenario and really just doesn't work.

    glibc tries a number of things for retrieving _SC_NPROCESSORS_CONF.
    First it tries equivalent of /sys/devices/system/cpu/cpu[0-9]* | wc -l,
    if that fails, depending on the config, it either tries to count CPUs
    in /proc/cpuinfo, or returns the _SC_NPROCESSORS_ONLN value instead.
    If /proc/cpuinfo has some issue, it returns just 1 worst case. This
    oddity is nothing new [1], but semantics/behaviour seems to be settled.
    _SC_NPROCESSORS_ONLN will parse /sys/devices/system/cpu/online, if
    that fails it looks into /proc/stat for cpuX entries, and if also that
    fails for some reason, /proc/cpuinfo is consulted (and returning 1 if
    unlikely all breaks down).

    While that might match num_possible_cpus() from the kernel in some
    cases, it's really not guaranteed with CPU hotplugging, and can result
    in a buffer overflow since the array in user space could have too few
    number of slots, and on perpcu map lookup, the kernel will write beyond
    that memory of the value buffer.

    William Tu reported such mismatches:

    [...] The fact that sysconf(_SC_NPROCESSORS_CONF) != num_possible_cpu()
    happens when CPU hotadd is enabled. For example, in Fusion when
    setting vcpu.hotadd = "TRUE" or in KVM, setting ./qemu-system-x86_64
    -smp 2, maxcpus=4 ... the num_possible_cpu() will be 4 and sysconf()
    will be 2 [2]. [...]

    Documentation/cputopology.txt says /sys/devices/system/cpu/possible
    outputs cpu_possible_mask. That is the same as in num_possible_cpus(),
    so first step would be to fix the _SC_NPROCESSORS_CONF calls with our
    own implementation. Later, we could add support to bpf(2) for passing
    a mask via CPU_SET(3), for example, to just select a subset of CPUs.

    BPF samples code needs this fix as well (at least so that people stop
    copying this). Thus, define bpf_num_possible_cpus() once in selftests
    and import it from there for the sample code to avoid duplicating it.
    The remaining sysconf(_SC_NPROCESSORS_CONF) in samples are unrelated.

    After all three issues are fixed, the test suite runs fine again:

    # make run_tests | grep self
    selftests: test_verifier [PASS]
    selftests: test_maps [PASS]
    selftests: test_lru_map [PASS]
    selftests: test_kmod.sh [PASS]

    [1] https://www.sourceware.org/ml/libc-alpha/2011-06/msg00079.html
    [2] https://www.mail-archive.com/netdev@vger.kernel.org/msg121183.html

    Fixes: 3059303f59cf ("samples/bpf: update tracex[23] examples to use per-cpu maps")
    Fixes: 86af8b4191d2 ("Add sample for adding simple drop program to link")
    Fixes: df570f577231 ("samples/bpf: unit test for BPF_MAP_TYPE_PERCPU_ARRAY")
    Fixes: e15596717948 ("samples/bpf: unit test for BPF_MAP_TYPE_PERCPU_HASH")
    Fixes: ebb676daa1a3 ("bpf: Print function name in addition to function id")
    Fixes: 5db58faf989f ("bpf: Add tests for the LRU bpf_htab")
    Signed-off-by: Daniel Borkmann
    Cc: William Tu
    Acked-by: Alexei Starovoitov
    Signed-off-by: David S. Miller

    Daniel Borkmann
     

20 Jul, 2016

1 commit

  • Add a sample program that only drops packets at the BPF_PROG_TYPE_XDP_RX
    hook of a link. With the drop-only program, observed single core rate is
    ~20Mpps.

    Other tests were run, for instance without the dropcnt increment or
    without reading from the packet header, the packet rate was mostly
    unchanged.

    $ perf record -a samples/bpf/xdp1 $(
    Acked-by: Alexei Starovoitov
    Signed-off-by: David S. Miller

    Brenden Blanco