[dpdk-dev] 回复: [RFC PATCH v2 4/5] lib/bpf: use wait event scheme for Rx/Tx iteration
From: Feifei Wang <hidden>
Date: 2021-09-26 02:20:02
-----邮件原件----- 发件人: Ananyev, Konstantin [off-list ref] 发送时间: Saturday, September 25, 2021 2:08 AM 收件人: Feifei Wang [off-list ref]; Yigit, Ferruh [off-list ref] 抄送: dev@dpdk.org; nd [off-list ref]; stable@dpdk.org; Ruifeng Wang [off-list ref] 主题: RE: [RFC PATCH v2 4/5] lib/bpf: use wait event scheme for Rx/Tx iterationquoted
First, fix the bug that keyword const of func arg should be after "*".I believe there is no bug here.quoted
This is because const before "*" means the value of "cbi" should not be changed.Exactly, it says that the function itself will not change the value of "cbi". It just waits for the value to be changed by someone else. So please keep parameter list intact.
Thanks for your explanation. The reason I changed is that I ever used rte_wait_until_xx(validate *addr) API here, And there is conflict between "const" and "validate", complier will report warning here. But now I think since I keep it as it is, there will be no warning due to new macro has no "validate". I will delete this unnecessary bug fix.
quoted
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 event scheme. Fixes: a93ff62a8938 ("bpf: introduce basic Rx/Tx filters") Cc: konstantin.ananyev@intel.com Cc: stable@dpdk.org Signed-off-by: Feifei Wang <redacted> Reviewed-by: Ruifeng Wang <redacted> --- lib/bpf/bpf_pkt.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)diff --git a/lib/bpf/bpf_pkt.c b/lib/bpf/bpf_pkt.c index6e8248f0d6..08ed8ff68c 100644--- a/lib/bpf/bpf_pkt.c +++ b/lib/bpf/bpf_pkt.c@@ -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_event_32(&cbi->use, UINT_MAX, puse, ==,__ATOMIC_RELAXED);quoted
} } -- 2.25.1