linux/tools/testing/selftests
Yonghong Song de58ef414d selftests/bpf: Fix s390 sock_field test failure
llvm patch [1] enabled cross-function optimization for func arguments
(ArgumentPromotion) at -O2 level. And this caused s390 sock_fields
test failure ([2]). The failure is gone right now as patch [1] was
reverted in [3]. But it is possible that patch [3] will be reverted
again and then the test failure in [2] will show up again. So it is
desirable to fix the failure regardless.

The following is an analysis why sock_field test fails with
llvm patch [1].

The main problem is in
  static __noinline bool sk_dst_port__load_word(struct bpf_sock *sk)
  {
        __u32 *word = (__u32 *)&sk->dst_port;
        return word[0] == bpf_htons(0xcafe);
  }
  static __noinline bool sk_dst_port__load_half(struct bpf_sock *sk)
  {
        __u16 *half = (__u16 *)&sk->dst_port;
        return half[0] == bpf_htons(0xcafe);
  }
  ...
  int read_sk_dst_port(struct __sk_buff *skb)
  {
	...
        sk = skb->sk;
	...
        if (!sk_dst_port__load_word(sk))
                RET_LOG();
        if (!sk_dst_port__load_half(sk))
                RET_LOG();
	...
  }

Through some cross-function optimization by ArgumentPromotion
optimization, the compiler does:
  static __noinline bool sk_dst_port__load_word(__u32 word_val)
  {
        return word_val == bpf_htons(0xcafe);
  }
  static __noinline bool sk_dst_port__load_half(__u16 half_val)
  {
        return half_val == bpf_htons(0xcafe);
  }
  ...
  int read_sk_dst_port(struct __sk_buff *skb)
  {
        ...
        sk = skb->sk;
        ...
        __u32 *word = (__u32 *)&sk->dst_port;
        __u32 word_val = word[0];
        ...
        if (!sk_dst_port__load_word(word_val))
                RET_LOG();

        __u16 half_val = word_val >> 16;
        if (!sk_dst_port__load_half(half_val))
                RET_LOG();
        ...
  }

In current uapi bpf.h, we have
  struct bpf_sock {
	...
        __be16 dst_port;        /* network byte order */
        __u16 :16;              /* zero padding */
	...
  };
But the old kernel (e.g., 5.6) we have
  struct bpf_sock {
	...
	__u32 dst_port;         /* network byte order */
	...
  };

So for backward compatability reason, 4-byte load of
dst_port is converted to 2-byte load internally.
Specifically, 'word_val = word[0]' is replaced by 2-byte load
by the verifier and this caused the trouble for later
sk_dst_port__load_half() where half_val becomes 0.

Typical usr program won't have such a code pattern tiggering
the above bug, so let us fix the test failure with source
code change. Adding an empty asm volatile statement seems
enough to prevent undesired transformation.

  [1] https://reviews.llvm.org/D148269
  [2] https://lore.kernel.org/bpf/e7f2c5e8-a50c-198d-8f95-388165f1e4fd@meta.com/
  [3] https://reviews.llvm.org/rG141be5c062ecf22bd287afffd310e8ac4711444a

Tested-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/r/20230516214945.1013578-1-yhs@fb.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2023-05-16 20:57:16 -07:00
..
alsa kselftest/alsa - pcm-test: Don't include diagnostic message in test name 2023-03-24 07:49:57 +01:00
amd-pstate linux-kselftest-next-6.4-rc1 2023-04-24 12:28:34 -07:00
arm64 kselftest/arm64: Convert za-fork to use kselftest.h 2023-04-11 14:10:51 -06:00
bpf selftests/bpf: Fix s390 sock_field test failure 2023-05-16 20:57:16 -07:00
breakpoints
capabilities
cgroup cgroup changes for v6.4-rc1 2023-04-29 10:05:22 -07:00
clone3 selftests/clone3: fix number of tests in ksft_set_plan 2023-04-06 11:57:28 +02:00
core selftests: core: Fix incorrect kernel headers search path 2023-01-30 15:04:52 -07:00
cpu-hotplug selftests/cpu-hotplug: Add log info when test success 2022-10-05 11:05:18 -06:00
cpufreq
damon selftests/damon/debugfs_rm_non_contexts: hide expected write error messages 2023-02-02 22:32:52 -08:00
dma
dmabuf-heaps selftests: dmabuf-heaps: Fix incorrect kernel headers search path 2023-02-13 09:09:44 -07:00
drivers Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2023-05-11 09:06:55 -07:00
efivarfs selftests/efivarfs: Add checking of the test return value 2022-11-22 09:09:04 -07:00
exec
filesystems linux-kselftest-next-6.3-rc1 2023-02-23 09:37:29 -08:00
firmware
fpu
ftrace LoongArch changes for v6.3 2023-03-01 09:27:00 -08:00
futex selftests: futex: Fix incorrect kernel headers search path 2023-02-13 09:09:44 -07:00
gpio selftests: gpio: Fix incorrect kernel headers search path 2023-02-13 09:09:44 -07:00
hid selftests: hid: import hid-tools usb-crash tests 2023-04-12 17:13:38 +02:00
ia64
intel_pstate selftests/intel_pstate: fix build for ARCH=x86_64 2022-10-18 14:13:19 -06:00
iommu iommufd/selftest: Cover domain unmap with huge pages and access 2023-04-04 13:11:24 -03:00
ipc selftests: ipc: Fix incorrect kernel headers search path 2023-02-13 09:09:44 -07:00
ir
kcmp selftests: kcmp: Fix incorrect kernel headers search path 2023-02-13 09:09:45 -07:00
kexec selftests/kexec: fix build for ARCH=x86_64 2022-10-18 14:13:25 -06:00
kmod testing: use the copyleft-next-0.3.1 SPDX tag 2022-11-08 15:44:02 +01:00
kselftest
kvm KVM selftests, and an AMX/XCR0 bugfix, for 6.4: 2023-04-26 15:56:01 -04:00
landlock selftests/landlock: Test ptrace as much as possible with Yama 2023-01-27 18:53:55 +01:00
lib
livepatch Merge branch 'for-6.1/sysfs-patched-object' into for-linus 2022-10-05 13:00:03 +02:00
lkdtm lkdtm: Update tests for memcpy() run-time warnings 2022-09-07 16:37:27 -07:00
locking
media_tests selftests: media_tests: Fix incorrect kernel headers search path 2023-02-13 09:09:45 -07:00
membarrier linux-kselftest-next-6.3-rc1 2023-02-23 09:37:29 -08:00
memfd selftests/memfd: fix test_sysctl 2023-04-18 16:53:52 -07:00
memory-hotplug selftests/memory-hotplug: Remove the redundant warning information 2022-10-18 14:21:18 -06:00
mincore
mm - Some DAMON cleanups from Kefeng Wang 2023-05-04 13:09:43 -07:00
mount
mount_setattr selftests mount: Fix mount_setattr_test builds failed 2023-03-31 09:18:45 -06:00
move_mount_set_group selftests: move_mount_set_group: Fix incorrect kernel headers search path 2023-02-13 09:09:45 -07:00
mqueue
nci NFC: nci: Extend virtual NCI deinit test 2022-11-21 10:49:58 +00:00
net selftests: net: vxlan: Add tests for vxlan nolocalbypass option. 2023-05-13 17:02:33 +01:00
netfilter selftests: nft_flowtable.sh: check ingress/egress chain too 2023-05-10 09:31:07 +02:00
nolibc tools/nolibc: x86_64: add stackprotector support 2023-03-27 16:26:10 -07:00
nsfs
ntb
openat2
perf_events selftests: perf_events: Fix incorrect kernel headers search path 2023-02-13 09:09:45 -07:00
pid_namespace selftests: pid_namespace: Fix incorrect kernel headers search path 2023-02-13 09:09:45 -07:00
pidfd selftests: pidfd: Fix incorrect kernel headers search path 2023-02-13 09:09:45 -07:00
powerpc selftests/powerpc/dscr: Restore timeout to DSCR selftests 2023-04-20 13:21:46 +10:00
prctl selftests: prctl: Add new prctl test for PR_SET_VMA action 2023-03-28 10:28:33 -06:00
proc selftests/proc: Assert clock_gettime(CLOCK_BOOTTIME) VS /proc/uptime monotonicity 2023-04-18 16:35:13 +02:00
pstore
ptp selftests/ptp: Remove clean target from Makefile 2023-02-13 10:05:49 -07:00
ptrace Update for entry and ptrace: 2023-04-25 11:05:04 -07:00
rcutorture RCU Changes for 6.4: 2023-04-24 12:16:14 -07:00
resctrl selftests/resctrl: Fix incorrect error return on test complete 2023-04-14 11:13:18 -06:00
riscv selftests: Test the new RISC-V hwprobe interface 2023-04-18 15:48:17 -07:00
rlimits
rseq linux-kselftest-next-6.3-rc1 2023-02-23 09:37:29 -08:00
rtc selftests: rtc: skip when RTC is not present 2022-11-15 13:30:51 -07:00
safesetid LSM: SafeSetID: add setgroups() testing to selftest 2022-07-15 18:24:42 +00:00
sched selftests: sched: Add more core schedule prctl calls 2023-03-28 10:27:07 -06:00
seccomp LoongArch changes for v6.3 2023-03-01 09:27:00 -08:00
sgx selftests/sgx: Ignore OpenSSL 3.0 deprecated functions warning 2022-08-15 16:50:07 -06:00
sigaltstack selftests: sigaltstack: fix -Wuninitialized 2023-03-20 17:28:31 -06:00
size
sparc64
splice selftests: splice_read: Fix sysfs read cases 2022-11-29 17:28:31 -07:00
static_keys
sync selftests: sync: Fix incorrect kernel headers search path 2023-02-13 09:09:45 -07:00
syscall_user_dispatch
sysctl testing: use the copyleft-next-0.3.1 SPDX tag 2022-11-08 15:44:02 +01:00
tc-testing Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2023-04-26 10:17:46 +02:00
tdx selftests: tdx: Use installed kernel headers search path 2023-02-13 09:09:46 -07:00
timens selftests/timens: add a test for vfork+exit 2022-10-25 15:15:52 -07:00
timers selftests/timers/posix_timers: Test delivery of signals across threads 2023-04-16 09:00:18 +02:00
tmpfs
tpm2 selftests: tpm2: remove redundant ord() 2023-02-13 09:09:46 -07:00
uevent
user
user_events tracing/user_events: Prevent same address and bit per process 2023-04-25 21:04:32 -04:00
vDSO selftests/vDSO: Add riscv getcpu & gettimeofday test 2022-11-03 03:28:01 -06:00
watchdog selftests/watchdog: Fix spelling mistake "Temeprature" -> "Temperature" 2022-10-27 02:53:37 -06:00
wireguard random: use random.trust_{bootloader,cpu} command line option only 2022-11-18 02:18:10 +01:00
x86 Add support for new Linear Address Masking CPU feature. This is similar 2023-04-28 09:43:49 -07:00
zram
.gitignore
gen_kselftest_tar.sh
kselftest_deps.sh selftests/vm: rename selftests/vm to selftests/mm 2023-01-18 17:12:56 -08:00
kselftest_harness.h testing: kselftest_harness: add filtering and enumerating tests 2023-01-26 16:00:41 -07:00
kselftest_install.sh
kselftest_module.h selftest: Taint kernel when test module loaded 2022-07-11 16:58:11 -06:00
kselftest.h kselftest: Support nolibc 2023-04-11 14:10:47 -06:00
lib.mk selftests: fix LLVM build for i386 and x86_64 2023-03-10 13:41:10 -07:00
Makefile RISC-V Patches for the 6.4 Merge Window, Part 1 2023-04-28 16:55:39 -07:00
run_kselftest.sh