分离后的 dpdk mbuf 引用计数检查
dpdk mbuf ref count check after detach
我使用来自 intel dpdk 库的 mbuf
我检查了 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
来检查双重释放和内存损坏。
存储标记的另一个安全位置是为每个 mbuf 分配一个私有的 8 字节区域。有关详细信息,请参阅 rte_pktmbuf_pool_create()
中的 priv_size
参数。
我使用来自 intel dpdk 库的 mbuf
我检查了 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
来检查双重释放和内存损坏。
存储标记的另一个安全位置是为每个 mbuf 分配一个私有的 8 字节区域。有关详细信息,请参阅 rte_pktmbuf_pool_create()
中的 priv_size
参数。