25 Apr, 2017

1 commit

  • Fixes the following warning

    samples/bpf/test_lru_dist.c:28:0: warning: "offsetof" redefined
    #define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)

    In file included from ./tools/lib/bpf/bpf.h:25:0,
    from samples/bpf/libbpf.h:5,
    from samples/bpf/test_lru_dist.c:24:
    /usr/lib/gcc/x86_64-redhat-linux/6.3.1/include/stddef.h:417:0: note: this is the location of the previous definition
    #define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)

    Signed-off-by: Alexander Alemayhu
    Acked-by: Daniel Borkmann
    Signed-off-by: David S. Miller

    Alexander Alemayhu
     

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
     

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
     

16 Nov, 2016

1 commit

  • This patch has some unit tests and a test_lru_dist.

    The test_lru_dist reads in the numeric keys from a file.
    The files used here are generated by a modified fio-genzipf tool
    originated from the fio test suit. The sample data file can be
    found here: https://github.com/iamkafai/bpf-lru

    The zipf.* data files have 100k numeric keys and the key is also
    ranged from 1 to 100k.

    The test_lru_dist outputs the number of unique keys (nr_unique).
    F.e. The following means, 61239 of them is unique out of 100k keys.
    nr_misses means it cannot be found in the LRU map, so nr_misses
    must be >= nr_unique. test_lru_dist also simulates a perfect LRU
    map as a comparison:

    [root@arch-fb-vm1 ~]# ~/devshare/fb-kernel/linux/samples/bpf/test_lru_dist \
    /root/zipf.100k.a1_01.out 4000 1
    ...
    test_parallel_lru_dist (map_type:9 map_flags:0x0):
    task:0 BPF LRU: nr_unique:23093(/100000) nr_misses:31603(/100000)
    task:0 Perfect LRU: nr_unique:23093(/100000 nr_misses:34328(/100000)
    ....
    test_parallel_lru_dist (map_type:9 map_flags:0x2):
    task:0 BPF LRU: nr_unique:23093(/100000) nr_misses:31710(/100000)
    task:0 Perfect LRU: nr_unique:23093(/100000 nr_misses:34328(/100000)

    [root@arch-fb-vm1 ~]# ~/devshare/fb-kernel/linux/samples/bpf/test_lru_dist \
    /root/zipf.100k.a0_01.out 40000 1
    ...
    test_parallel_lru_dist (map_type:9 map_flags:0x0):
    task:0 BPF LRU: nr_unique:61239(/100000) nr_misses:67054(/100000)
    task:0 Perfect LRU: nr_unique:61239(/100000 nr_misses:66993(/100000)
    ...
    test_parallel_lru_dist (map_type:9 map_flags:0x2):
    task:0 BPF LRU: nr_unique:61239(/100000) nr_misses:67068(/100000)
    task:0 Perfect LRU: nr_unique:61239(/100000 nr_misses:66993(/100000)

    LRU map has also been added to map_perf_test:
    /* Global LRU */
    [root@kerneltest003.31.prn1 ~]# for i in 1 4 8; do echo -n "$i cpus: "; \
    ./map_perf_test 16 $i | awk '{r += $3}END{print r " updates"}'; done
    1 cpus: 2934082 updates
    4 cpus: 7391434 updates
    8 cpus: 6500576 updates

    /* Percpu LRU */
    [root@kerneltest003.31.prn1 ~]# for i in 1 4 8; do echo -n "$i cpus: "; \
    ./map_perf_test 32 $i | awk '{r += $3}END{print r " updates"}'; done
    1 cpus: 2896553 updates
    4 cpus: 9766395 updates
    8 cpus: 17460553 updates

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

    Martin KaFai Lau