Re: [PATCH bpf-next] selftests/bpf: fix strobemeta selftest regression

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 10/29/21 11:29 AM, Andrii Nakryiko wrote:
After most recent nightly Clang update strobemeta selftests started
failing with the following error (relevant portion of assembly included):

   1624: (85) call bpf_probe_read_user_str#114
   1625: (bf) r1 = r0
   1626: (18) r2 = 0xfffffffe
   1628: (5f) r1 &= r2
   1629: (55) if r1 != 0x0 goto pc+7
   1630: (07) r9 += 104
   1631: (6b) *(u16 *)(r9 +0) = r0
   1632: (67) r0 <<= 32
   1633: (77) r0 >>= 32
   1634: (79) r1 = *(u64 *)(r10 -456)
   1635: (0f) r1 += r0
   1636: (7b) *(u64 *)(r10 -456) = r1
   1637: (79) r1 = *(u64 *)(r10 -368)
   1638: (c5) if r1 s< 0x1 goto pc+778
   1639: (bf) r6 = r8
   1640: (0f) r6 += r7
   1641: (b4) w1 = 0
   1642: (6b) *(u16 *)(r6 +108) = r1
   1643: (79) r3 = *(u64 *)(r10 -352)
   1644: (79) r9 = *(u64 *)(r10 -456)
   1645: (bf) r1 = r9
   1646: (b4) w2 = 1
   1647: (85) call bpf_probe_read_user_str#114

   R1 unbounded memory access, make sure to bounds check any such access

In the above code r0 and r1 are implicitly related. Clang knows that,
but verifier isn't able to infer this relationship.

Yonghong Song narrowed down this "regression" in code generation to
a recent Clang optimization change ([0]), which for BPF target generates
code pattern that BPF verifier can't handle and loses track of register
boundaries.

This patch works around the issue by adding an BPF assembly-based helper
that helps to prove to the verifier that upper bound of the register is
a given constant by controlling the exact share of generated BPF
instruction sequence. This fixes the immediate issue for strobemeta
selftest.

   [0] https://github.com/llvm/llvm-project/commit/acabad9ff6bf13e00305d9d8621ee8eafc1f8b08

Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx>

I am working on a llvm compiler solution which may take some time.
For the time being, the workaround looks good to me.

Acked-by: Yonghong Song <yhs@xxxxxx>



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux