On Wed, 17 Dec 2025 18:01:33 +0000
Marat Khalili <[email protected]> wrote:

> Add simple unit-style tests for rte_bpf_load, and fix some minor
> discovered bugs.
> 
> v3:
> * Fixed unfortunate typos in the last patch commit message.
> * Marked all ARM opcodes with UINT32_C for clarity as suggested by
>   Morten Brørup, in a separate commit.
> 
> v2:
> * Moved new tests back into test_bpf.c
> * Changed library macros RTE_SHIFT_VALxx to handle variable first
>   arguments instead of introducing new macros.
> * Added another test and fix, for conditional jump as first instruction.
> 
> Marat Khalili (6):
>   eal: variable first arguments of RTE_SHIFT_VALxx
>   bpf: fix signed shift overflows in ARM JIT
>   bpf: mark ARM opcodes with UINT32_C
>   bpf: disallow empty program
>   bpf: make add/subtract one program validate
>   bpf: fix BPF validation w/ conditional jump first
> 
>  app/test/test_bpf.c          | 254 +++++++++++++++++++++++++++++++++++
>  lib/bpf/bpf_jit_arm64.c      | 184 ++++++++++++-------------
>  lib/bpf/bpf_load.c           |   2 +-
>  lib/bpf/bpf_validate.c       |  48 ++++---
>  lib/eal/include/rte_bitops.h |   4 +-
>  5 files changed, 375 insertions(+), 117 deletions(-)
> 

AI review of this patch series identified some minor things.
They could either be addressed by Thomas during merge or you could send a new 
version.


## DPDK BPF Test Patchset Review (v3, 6 patches)

**Submitter:** Marat Khalili <[email protected]>  
**Series overview:** Fixes various issues in the BPF library including 
sanitizer-detected undefined behaviors (signed shift overflows, integer 
overflows), validation bugs, and adds comprehensive test coverage.

---

### Patch 1/6: `eal: variable first arguments of RTE_SHIFT_VALxx`

**Subject line:** ✅ 48 characters, correct format, lowercase

**Commit message:**
- ✅ Signed-off-by present
- ✅ Reviewed-by and Acked-by present
- ✅ Good explanation of the change and rationale
- ⚠️ **Warning:** Missing `Cc: [email protected]` - this changes the behavior of 
public macros

**Code changes:**
```c
-#define RTE_SHIFT_VAL32(val, nr) (UINT32_C(val) << (nr))
+#define RTE_SHIFT_VAL32(val, nr) ((uint32_t)(val) << (nr))
```
- ✅ Clean, minimal change
- ✅ Allows variables as arguments (enables patch 2)

**Verdict:** Acceptable. Consider adding `Cc: [email protected]` if this fixes 
user-visible limitations.

---

### Patch 2/6: `bpf: fix signed shift overflows in ARM JIT`

**Subject line:** ✅ 41 characters, correct format

**Commit message:**
- ✅ Signed-off-by present
- ✅ Acked-by present
- ✅ Cc: [email protected] included
- ⚠️ **Warning:** Missing `Fixes:` tag - sanitizer errors indicate this is a 
regression/bug
- ❌ **Error:** Trailing whitespace on line 176: `Acked-by: Konstantin Ananyev 
<[email protected]> ` (space before `---`)

**Code review:**
- ✅ Comprehensive fix for UBSan-detected issues
- ✅ Correct use of `RTE_BIT32()` and `RTE_SHIFT_VAL32()` macros
- ℹ️ **Info:** Some shifts are no-ops (e.g., `RTE_SHIFT_VAL32(0, 30)` = 0) but 
kept for consistency - acceptable

**Verdict:** Fix the trailing whitespace error. Should add `Fixes:` tag 
identifying when the UB was introduced.

---

### Patch 3/6: `bpf: mark ARM opcodes with UINT32_C`

**Subject line:** ✅ 35 characters, correct format

**Commit message:**
- ✅ Signed-off-by present
- ✅ Acked-by present
- ⚠️ **Warning:** Has `Cc: [email protected]` but this is a style/clarity change, 
not a bug fix. Consider removing unless there's a functional issue.

**Code changes:**
```c
-#define A64_INVALID_OP_CODE    (0xffffffff)
+#define A64_INVALID_OP_CODE    (UINT32_C(0xffffffff))
```
- ✅ Consistent use of UINT32_C for ARM opcode constants
- ✅ Improves code clarity about integer types

**Verdict:** Good cleanup. Questionable whether `Cc: [email protected]` is 
appropriate for a style change.

---

### Patch 4/6: `bpf: disallow empty program`

**Subject line:** ✅ 26 characters, correct format

**Commit message:**
- ✅ Signed-off-by present
- ✅ Acked-by present
- ✅ Cc: [email protected] included (appropriate for bug fixes)
- ⚠️ **Warning:** Missing `Fixes:` tag - this fixes actual bugs (empty program 
accepted, buffer over-read)

**Code review:**
- ✅ `bpf_load_test()` helper function is well-documented
- ✅ Good test coverage for edge cases
- ✅ Boundary check fix: `nidx > bvf->prm->nb_ins` → `nidx >= bvf->prm->nb_ins` 
(correct)
- ✅ Empty program check added to `validate()`
- ✅ Loop changed from `while` to `do-while` with assertion - good defensive 
coding

**Minor observations:**
- Line 817-818: Brace style `} else` without braces on else is inconsistent but 
acceptable per DPDK style

**Verdict:** Good patch. Add `Fixes:` tag to identify when these bugs were 
introduced.

---

### Patch 5/6: `bpf: make add/subtract one program validate`

**Subject line:** ✅ 42 characters, correct format

**Commit message:**
- ✅ Signed-off-by present
- ✅ Acked-by present
- ✅ Cc: [email protected] included
- ✅ Good documentation of the UBSan errors being fixed
- ⚠️ **Warning:** Missing `Fixes:` tag - this fixes signed integer overflow UB

**Code review:**
```c
-       rv.s.min = (rd->s.min + rs->s.min) & msk;
+       rv.s.min = ((uint64_t)rd->s.min + (uint64_t)rs->s.min) & msk;
```
- ✅ Minimal fix for UB by casting to unsigned before arithmetic
- ✅ Tests correctly exercise the boundary conditions

**Verdict:** Good minimal fix. Add `Fixes:` tag.

---

### Patch 6/6: `bpf: fix BPF validation w/ conditional jump first`

**Subject line:** ✅ 48 characters, correct format

**Commit message:**
- ✅ Signed-off-by present
- ✅ Acked-by and Tested-by present
- ✅ Cc: [email protected] present (from CC header)
- ✅ **Correct `Fixes:` tag:** `Fixes: 6e12ec4c4d6d ("bpf: add more checks")`
- ✅ Excellent description of the root cause and fix

**Code review:**
```c
-       uint32_t prev_node;
+       struct inst_node *prev_node;
```
- ✅ Clean refactoring from index to pointer for prev_node tracking
- ✅ Fixes the bug where index 0 was used as termination signal
- ✅ Two tests covering the exact bug scenario (first vs non-first instruction)
- ✅ `get_prev_node()` function removed as it's no longer needed

**Verdict:** Excellent patch. Good fix with proper testing and documentation.

---

## Summary

| Patch | Status | Action Required |
|-------|--------|-----------------|
| 1/6 | ⚠️ | Consider adding `Cc: [email protected]` |
| 2/6 | ❌ | Fix trailing whitespace; add `Fixes:` tag |
| 3/6 | ⚠️ | Consider removing `Cc: [email protected]` (style change) |
| 4/6 | ⚠️ | Add `Fixes:` tag |
| 5/6 | ⚠️ | Add `Fixes:` tag |
| 6/6 | ✅ | Ready |

### Required Fixes (Errors)

1. **Patch 2/6, line 176:** Remove trailing whitespace after 
`[email protected]`

### Recommended Improvements (Warnings)

1. **Patches 2, 4, 5:** Add `Fixes:` tags to identify the commits that 
introduced the bugs
2. **Patch 3:** Reconsider `Cc: [email protected]` - UINT32_C annotation is a 
style improvement, not a bug fix

### Overall Assessment

This is a high-quality patch series that fixes real bugs (UB detected by 
sanitizers, validation logic errors) and adds valuable test coverage. The code 
changes are well-reasoned and minimal. The series structure properly separates 
enabling changes (patch 1) from fixes (patches 2-6).

**Recommendation:** After fixing the trailing whitespace in patch 2 and adding 
missing `Fixes:` tags, this series should be ready for merge.

Reply via email to