Проблема синхронизации кэша DPDK - PullRequest
0 голосов
/ 28 июня 2019

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

...