Как устранить ошибку создания мемпула DPDK?

Я застрял в использовании rte_mempool_create, какую бы настройку я ни дал, функция просто возвращает NULL.

Ниже мой код,

int main(argc, **argv) {
        int ret;
        ret = rte_eal_init(argc, argv);
        if (ret < 0)
                printf("eal init fail!!!\n");
        unsigned lcore_id;
        lcore_id = rte_lcore_id();
        printf("lcore %u\n", lcore_id);

        struct rte_mempool *mp;
        mp = rte_mempool_create("MP", 1024,
                                32, 32, 0,
                                NULL, NULL, NULL, NULL,
                                0, 0);
        if (NULL == mp) {
                printf("mempool init fail\n");
                return -1;
        }
        printf("mempool init pass\n");

        rte_mempool_free(mp);
        printf("mempool uninit pass\n");
        return 0;
}

И бегущий результат,

EAL: Detected 96 lcore(s)
EAL: Detected 4 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'VA'
EAL: No available hugepages reported in hugepages-32768kB
EAL: No available hugepages reported in hugepages-64kB
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: No legacy callbacks, legacy socket not created
lcore 0
mempool init fail

Как правильно создать пул?


person LinconFive    schedule 04.12.2020    source источник
comment
есть пара вещей, которые упущены, такие как версия DPDK, платформа, присутствует ли огромная страница на NUMA0, так как вы получаете из SOCKET_ID0, элементы кеша 3-го числа аргумента по сравнению с потоком lcore должны быть меньше 1024. Важным фактором является использование rte_strerror(rte_errno)) для выяснить причину отказа. Я буду ждать вашего редактирования в вопросе, а не отмечать как insufficent data. См. doc.dpdk.org/api/.   -  person Vipin Varghese    schedule 04.12.2020
comment
не могли бы вы задать вопрос с соответствующей информацией? Также обратите внимание, что https://stackoverflow.com/users/4350586/dmitry-grigoryev отклонил редактирование, удалив pool. В комментариях к редактированию уже упоминалась проблема, связанная с использованием библиотек DPDK и dpdk. @dmitry-grigoryev, пожалуйста, поделитесь своими мыслями, почему это не проблема DPDK.   -  person Vipin Varghese    schedule 05.12.2020
comment
@VipinVarghese Наконец-то я получил эту работу, поэтому версия 20.11, платформа ARM, огромная страница echo 256 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages. Проблема заключается в кросс-компиляции, то есть я скомпилировал на ARM и использовал на x86, потом сбой... После перестановки тулчейна все работает нормально, в том числе без пула. Спасибо за направление :)   -  person LinconFive    schedule 08.12.2020
comment
приятно слышать, что это проблема сборки, а не проблема DPDK. Пожалуйста, примите или проголосуйте, чтобы закрыть тикет.   -  person Vipin Varghese    schedule 08.12.2020


Ответы (1)


нет проблем с кодом или библиотеками DPDK. Изменен фрагмент кода и протестирован со следующей конфигурацией.

  • Версия ДПДК: 19.11.5 LTS
  • Процессор: Intel(R) Xeon(R) CPU E5-2699 v4, 88 потоков
  • Огромная страница: Hugepagesize: 1048576 КБ, HugePages_Total: 16, HugePages_Free: 15
  • команда: ./сборка/тест

[EDIT-1] как обновлено в комментарии от @LinconFive, проблема заключалась в том, что огромная страница не была настроена для правильного NUMA (игнорируя кросс-компиляцию, поскольку двоичный файл руки не будет работать на x86)

результат теста: успешно

код:

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <sys/queue.h>

#include <rte_memory.h>
#include <rte_launch.h>
#include <rte_eal.h>
#include <rte_per_lcore.h>
#include <rte_lcore.h>
#include <rte_debug.h>

int
main(int argc, char **argv)
{
        int ret;
        ret = rte_eal_init(argc, argv);
        if (ret < 0)
                printf("eal init fail!!!\n");
        unsigned lcore_id;
        lcore_id = rte_lcore_id();
        printf("lcore %u\n", lcore_id);

        struct rte_mempool *mp;
        mp = rte_mempool_create("MP", 1024,
                                32, 32, 0,
                                NULL, NULL, NULL, NULL,
                                0, 0);
        if (NULL == mp) {
                printf("mempool init fail\n");
                return -1;
        }
        printf("mempool init pass\n");

        while(1);

        rte_mempool_free(mp);
        printf("mempool uninit pass\n");
        return 0;
}

Журналы:

lcore 0
mempool init pass

примечание:

  • к @LinconFive было сделано несколько запросов о версии, платформе и конкретной ошибке, поскольку я подозреваю платформу и конфигурацию.
  • Нет проблем с кодом или библиотекой DPDK.
person Vipin Varghese    schedule 07.12.2020