[RFC,v1,4/5] lib/bpf: use wait until scheme for Rx/Tx iteration
Checks
Commit Message
First, fix the bug that keyword const of func arg should be after "*".
This is because const before "*" means the value of "cbi" should not be
changed. But we should monitor that cbi->use changed and then we can
jump out of loop.
Second, instead of polling for cbi->use to be updated, use
wait_until_unequal api.
Fixes: a93ff62a8938 ("bpf: introduce basic Rx/Tx filters")
Cc: konstantin.ananyev@intel.com
Cc: stable@dpdk.org
Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
lib/bpf/bpf_pkt.c | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
@@ -111,9 +111,9 @@ bpf_eth_cbi_unuse(struct bpf_eth_cbi *cbi)
* Waits till datapath finished using given callback.
*/
static void
-bpf_eth_cbi_wait(const struct bpf_eth_cbi *cbi)
+bpf_eth_cbi_wait(struct bpf_eth_cbi *const cbi)
{
- uint32_t nuse, puse;
+ uint32_t puse;
/* make sure all previous loads and stores are completed */
rte_smp_mb();
@@ -122,11 +122,8 @@ bpf_eth_cbi_wait(const struct bpf_eth_cbi *cbi)
/* in use, busy wait till current RX/TX iteration is finished */
if ((puse & BPF_ETH_CBI_INUSE) != 0) {
- do {
- rte_pause();
- rte_compiler_barrier();
- nuse = cbi->use;
- } while (nuse == puse);
+ rte_compiler_barrier();
+ rte_wait_until_unequal_32(&cbi->use, puse, __ATOMIC_RELAXED);
}
}