Я использую mbuf из библиотеки intel dpdk.
У меня был код регистрации для mbuf
двойного выпуска
Раньше я проверял, есть ли reference count <= 0
Поскольку следующее изменение я больше не могу проверять таким образом, поскольку счетчик ссылок равен 1 даже после его выпуска в пул http://mails.dpdk.org/archives/dev/2017-January/056188.html
Есть ли способ проверить, отсоединен ли mbuf
(в пуле или вне пула)?
Когда мы свободны и refcnt
равно 1, это либо первое, либо второе (двойное) бесплатное. Так что просто используйте другое поле mbuf для различения, т.е.:
if (refcnt == 1) {
if (port != UINT16_MAX - 1) {
// mark the mbuf
port = UINT16_MAX - 1;
} else {
// already marked
RTE_LOG(ERROR, USER1, "Double free!");
}
}
Я только что понял, что вы могли не знать о стандартной двойной бесплатной проверке в DPDK. Обычно вы просто включаете RTE_LIBRTE_MEMPOOL_DEBUG
для проверки двойного освобождения и повреждения памяти.
Другим безопасным местом для хранения маркера было бы выделение частной 8-байтовой области для каждого mbuf. См. аргумент priv_size
в rte_pktmbuf_pool_create()
для более подробной информации.
Мое плохое, злоупотребляющее port
поле было действительно плохой идеей. Лучшим вариантом будет использовать стандартную опцию DPDK для двойного бесплатного обнаружения: RTE_LIBRTE_MEMPOOL_DEBUG
или выделить приватные данные для каждого mbuf и поставить там флаг. Я обновил ответ.
Я не могу использовать порт, потому что он уже используется в коде. Итак, вы предлагаете добавить еще одно поле в структуру rte_mbuf, например is_in_pool