Привет всем,
Я знаю, что это некоторая проблема с кэшированием / синхронизацией, но по какой-то причине, несмотря на использование макросов барьера, она, похоже, не исчезла.
Однако, что заставляет его уйти, это дать 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', а затем публикую 1 итерацию цикла while. 'Mbuf' не равен NULL (правильное значение, как и ожидалось), и он движется плавно ....
Очевидно, это похоже на проблему с синхронизацией кеша, и я подумал, что примитивы smp_wb () должны были ее решить?
Любые другие лучшие способы исправить это, кроме этого rte_delay_us ()?