-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
Alexei Starovoitov says: ==================== pull-request: bpf-next 2019-11-02 The following pull-request contains BPF updates for your *net-next* tree. We've added 30 non-merge commits during the last 7 day(s) which contain a total of 41 files changed, 1864 insertions(+), 474 deletions(-). The main changes are: 1) Fix long standing user vs kernel access issue by introducing bpf_probe_read_user() and bpf_probe_read_kernel() helpers, from Daniel. 2) Accelerated xskmap lookup, from Björn and Maciej. 3) Support for automatic map pinning in libbpf, from Toke. 4) Cleanup of BTF-enabled raw tracepoints, from Alexei. 5) Various fixes to libbpf and selftests. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Showing
41 changed files
with
1,863 additions
and
476 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,205 @@ | ||
=================== | ||
Testing BPF on s390 | ||
=================== | ||
|
||
1. Introduction | ||
*************** | ||
|
||
IBM Z are mainframe computers, which are descendants of IBM System/360 from | ||
year 1964. They are supported by the Linux kernel under the name "s390". This | ||
document describes how to test BPF in an s390 QEMU guest. | ||
|
||
2. One-time setup | ||
***************** | ||
|
||
The following is required to build and run the test suite: | ||
|
||
* s390 GCC | ||
* s390 development headers and libraries | ||
* Clang with BPF support | ||
* QEMU with s390 support | ||
* Disk image with s390 rootfs | ||
|
||
Debian supports installing compiler and libraries for s390 out of the box. | ||
Users of other distros may use debootstrap in order to set up a Debian chroot:: | ||
|
||
sudo debootstrap \ | ||
--variant=minbase \ | ||
--include=sudo \ | ||
testing \ | ||
./s390-toolchain | ||
sudo mount --rbind /dev ./s390-toolchain/dev | ||
sudo mount --rbind /proc ./s390-toolchain/proc | ||
sudo mount --rbind /sys ./s390-toolchain/sys | ||
sudo chroot ./s390-toolchain | ||
|
||
Once on Debian, the build prerequisites can be installed as follows:: | ||
|
||
sudo dpkg --add-architecture s390x | ||
sudo apt-get update | ||
sudo apt-get install \ | ||
bc \ | ||
bison \ | ||
cmake \ | ||
debootstrap \ | ||
dwarves \ | ||
flex \ | ||
g++ \ | ||
gcc \ | ||
g++-s390x-linux-gnu \ | ||
gcc-s390x-linux-gnu \ | ||
gdb-multiarch \ | ||
git \ | ||
make \ | ||
python3 \ | ||
qemu-system-misc \ | ||
qemu-utils \ | ||
rsync \ | ||
libcap-dev:s390x \ | ||
libelf-dev:s390x \ | ||
libncurses-dev | ||
|
||
Latest Clang targeting BPF can be installed as follows:: | ||
|
||
git clone https://github.com/llvm/llvm-project.git | ||
ln -s ../../clang llvm-project/llvm/tools/ | ||
mkdir llvm-project-build | ||
cd llvm-project-build | ||
cmake \ | ||
-DLLVM_TARGETS_TO_BUILD=BPF \ | ||
-DCMAKE_BUILD_TYPE=Release \ | ||
-DCMAKE_INSTALL_PREFIX=/opt/clang-bpf \ | ||
../llvm-project/llvm | ||
make | ||
sudo make install | ||
export PATH=/opt/clang-bpf/bin:$PATH | ||
|
||
The disk image can be prepared using a loopback mount and debootstrap:: | ||
|
||
qemu-img create -f raw ./s390.img 1G | ||
sudo losetup -f ./s390.img | ||
sudo mkfs.ext4 /dev/loopX | ||
mkdir ./s390.rootfs | ||
sudo mount /dev/loopX ./s390.rootfs | ||
sudo debootstrap \ | ||
--foreign \ | ||
--arch=s390x \ | ||
--variant=minbase \ | ||
--include=" \ | ||
iproute2, \ | ||
iputils-ping, \ | ||
isc-dhcp-client, \ | ||
kmod, \ | ||
libcap2, \ | ||
libelf1, \ | ||
netcat, \ | ||
procps" \ | ||
testing \ | ||
./s390.rootfs | ||
sudo umount ./s390.rootfs | ||
sudo losetup -d /dev/loopX | ||
|
||
3. Compilation | ||
************** | ||
|
||
In addition to the usual Kconfig options required to run the BPF test suite, it | ||
is also helpful to select:: | ||
|
||
CONFIG_NET_9P=y | ||
CONFIG_9P_FS=y | ||
CONFIG_NET_9P_VIRTIO=y | ||
CONFIG_VIRTIO_PCI=y | ||
|
||
as that would enable a very easy way to share files with the s390 virtual | ||
machine. | ||
|
||
Compiling kernel, modules and testsuite, as well as preparing gdb scripts to | ||
simplify debugging, can be done using the following commands:: | ||
|
||
make ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- menuconfig | ||
make ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- bzImage modules scripts_gdb | ||
make ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- \ | ||
-C tools/testing/selftests \ | ||
TARGETS=bpf \ | ||
INSTALL_PATH=$PWD/tools/testing/selftests/kselftest_install \ | ||
install | ||
|
||
4. Running the test suite | ||
************************* | ||
|
||
The virtual machine can be started as follows:: | ||
|
||
qemu-system-s390x \ | ||
-cpu max,zpci=on \ | ||
-smp 2 \ | ||
-m 4G \ | ||
-kernel linux/arch/s390/boot/compressed/vmlinux \ | ||
-drive file=./s390.img,if=virtio,format=raw \ | ||
-nographic \ | ||
-append 'root=/dev/vda rw console=ttyS1' \ | ||
-virtfs local,path=./linux,security_model=none,mount_tag=linux \ | ||
-object rng-random,filename=/dev/urandom,id=rng0 \ | ||
-device virtio-rng-ccw,rng=rng0 \ | ||
-netdev user,id=net0 \ | ||
-device virtio-net-ccw,netdev=net0 | ||
|
||
When using this on a real IBM Z, ``-enable-kvm`` may be added for better | ||
performance. When starting the virtual machine for the first time, disk image | ||
setup must be finalized using the following command:: | ||
|
||
/debootstrap/debootstrap --second-stage | ||
|
||
Directory with the code built on the host as well as ``/proc`` and ``/sys`` | ||
need to be mounted as follows:: | ||
|
||
mkdir -p /linux | ||
mount -t 9p linux /linux | ||
mount -t proc proc /proc | ||
mount -t sysfs sys /sys | ||
|
||
After that, the test suite can be run using the following commands:: | ||
|
||
cd /linux/tools/testing/selftests/kselftest_install | ||
./run_kselftest.sh | ||
|
||
As usual, tests can be also run individually:: | ||
|
||
cd /linux/tools/testing/selftests/bpf | ||
./test_verifier | ||
|
||
5. Debugging | ||
************ | ||
|
||
It is possible to debug the s390 kernel using QEMU GDB stub, which is activated | ||
by passing ``-s`` to QEMU. | ||
|
||
It is preferable to turn KASLR off, so that gdb would know where to find the | ||
kernel image in memory, by building the kernel with:: | ||
|
||
RANDOMIZE_BASE=n | ||
|
||
GDB can then be attached using the following command:: | ||
|
||
gdb-multiarch -ex 'target remote localhost:1234' ./vmlinux | ||
|
||
6. Network | ||
********** | ||
|
||
In case one needs to use the network in the virtual machine in order to e.g. | ||
install additional packages, it can be configured using:: | ||
|
||
dhclient eth0 | ||
|
||
7. Links | ||
******** | ||
|
||
This document is a compilation of techniques, whose more comprehensive | ||
descriptions can be found by following these links: | ||
|
||
- `Debootstrap <https://wiki.debian.org/EmDebian/CrossDebootstrap>`_ | ||
- `Multiarch <https://wiki.debian.org/Multiarch/HOWTO>`_ | ||
- `Building LLVM <https://llvm.org/docs/CMake.html>`_ | ||
- `Cross-compiling the kernel <https://wiki.gentoo.org/wiki/Embedded_Handbook/General/Cross-compiling_the_kernel>`_ | ||
- `QEMU s390x Guest Support <https://wiki.qemu.org/Documentation/Platforms/S390X>`_ | ||
- `Plan 9 folder sharing over Virtio <https://wiki.qemu.org/Documentation/9psetup>`_ | ||
- `Using GDB with QEMU <https://wiki.osdev.org/Kernel_Debugging#Use_GDB_with_QEMU>`_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
|
||
#include <linux/uaccess.h> | ||
#include <linux/kernel.h> | ||
|
||
#ifdef CONFIG_X86_64 | ||
static __always_inline u64 canonical_address(u64 vaddr, u8 vaddr_bits) | ||
{ | ||
return ((s64)vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits); | ||
} | ||
|
||
static __always_inline bool invalid_probe_range(u64 vaddr) | ||
{ | ||
/* | ||
* Range covering the highest possible canonical userspace address | ||
* as well as non-canonical address range. For the canonical range | ||
* we also need to include the userspace guard page. | ||
*/ | ||
return vaddr < TASK_SIZE_MAX + PAGE_SIZE || | ||
canonical_address(vaddr, boot_cpu_data.x86_virt_bits) != vaddr; | ||
} | ||
#else | ||
static __always_inline bool invalid_probe_range(u64 vaddr) | ||
{ | ||
return vaddr < TASK_SIZE_MAX; | ||
} | ||
#endif | ||
|
||
long probe_kernel_read_strict(void *dst, const void *src, size_t size) | ||
{ | ||
if (unlikely(invalid_probe_range((unsigned long)src))) | ||
return -EFAULT; | ||
|
||
return __probe_kernel_read(dst, src, size); | ||
} | ||
|
||
long strncpy_from_unsafe_strict(char *dst, const void *unsafe_addr, long count) | ||
{ | ||
if (unlikely(invalid_probe_range((unsigned long)unsafe_addr))) | ||
return -EFAULT; | ||
|
||
return __strncpy_from_unsafe(dst, unsafe_addr, count); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.