大家好, 我知道这是一些缓存/同步问题,但是由于某些原因,尽管使用了屏障宏,但它似乎并没有消失。 但是使它消失的是给rte_delay设置为100us,然后再次重新读取该值,如下所示:
cons_rx_buf = &rxr->rx_buf_ring[cons];
mbuf = cons_rx_buf->mbuf;
rte_smp_mb();
if (mbuf == NULL) {
int cnt = 0;
RTE_LOG(ERR, PMD, "mbuf = NULL cons = %d\n", cons);
do {
rte_delay_us(100);
cons_rx_buf = &rxr->rx_buf_ring[cons];
mbuf = cons_rx_buf->mbuf;
} while(mbuf == NULL && ++cnt <= 10);
RTE_LOG(ERR, PMD, "mbuf = %p cnt = %d\n", mbuf, cnt);
}
我总是看到'mbuf = NULL'的打印内容,然后发布while循环的1次迭代,'mbuf'不是NULL(期望值正确),并且运行平稳。 显然,这似乎是一些缓存同步问题,我认为smp_wb()原语应该已经解决了吗? 除了此rte_delay_us()之外,还有其他更好的方法来解决此问题吗?