xsk: Simplify xp_aligned_validate_desc implementation
authorKal Conley <kal.conley@dectris.com>
Mon, 10 Apr 2023 12:18:41 +0000 (14:18 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 13 Apr 2023 12:51:02 +0000 (14:51 +0200)
Perform the chunk boundary check like the page boundary check in
xp_desc_crosses_non_contig_pg(). This simplifies the implementation and
reduces the number of branches.

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/20230410121841.643254-1-kal.conley@dectris.com
net/xdp/xsk_queue.h

index 66c6f57c9c44768a8e3b768150f6fd07287981df..76b574bffd4a6dedc11936ecd30b25287f609027 100644 (file)
@@ -133,16 +133,12 @@ static inline bool xskq_cons_read_addr_unchecked(struct xsk_queue *q, u64 *addr)
 static inline bool xp_aligned_validate_desc(struct xsk_buff_pool *pool,
                                            struct xdp_desc *desc)
 {
-       u64 chunk, chunk_end;
+       u64 offset = desc->addr & (pool->chunk_size - 1);
 
-       chunk = xp_aligned_extract_addr(pool, desc->addr);
-       if (likely(desc->len)) {
-               chunk_end = xp_aligned_extract_addr(pool, desc->addr + desc->len - 1);
-               if (chunk != chunk_end)
-                       return false;
-       }
+       if (offset + desc->len > pool->chunk_size)
+               return false;
 
-       if (chunk >= pool->addrs_cnt)
+       if (desc->addr >= pool->addrs_cnt)
                return false;
 
        if (desc->options)