OSDN Git Service

xsk: Elide base_addr comparison in xp_unaligned_validate_desc
authorKal Conley <kal.conley@dectris.com>
Tue, 11 Apr 2023 13:00:25 +0000 (15:00 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 13 Apr 2023 13:00:11 +0000 (15:00 +0200)
commit1ba83f505c53d35eda892ac7f108ef1189da6fa8
tree5ed7d9a1770a21249577fa2608f0e798c576c8b1
parent4099be372faf7b3616634dfe6994b81b1edf1906
xsk: Elide base_addr comparison in xp_unaligned_validate_desc

Remove redundant (base_addr >= pool->addrs_cnt) comparison from the
conditional.

In particular, addr is computed as:

    addr = base_addr + offset

... where base_addr and offset are stored as 48-bit and 16-bit unsigned
integers, respectively. The above sum cannot overflow u64 since base_addr
has a maximum value of 0x0000ffffffffffff and offset has a maximum value
of 0xffff (implying a maximum sum of 0x000100000000fffe). Since overflow
is impossible, it follows that addr >= base_addr.

Now if (base_addr >= pool->addrs_cnt), then clearly:

    addr >= base_addr
         >= pool->addrs_cnt

Thus, (base_addr >= pool->addrs_cnt) implies (addr >= pool->addrs_cnt).
Subsequently, the former comparison is unnecessary in the conditional
since for any boolean expressions A and B, (A || B) && (A -> B) is
equivalent to B.

Signed-off-by: Kal Conley <kal.conley@dectris.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Magnus Karlsson <magnus.karlsson@intel.com>
Link: https://lore.kernel.org/bpf/20230411130025.19704-1-kal.conley@dectris.com
net/xdp/xsk_queue.h