目前,我正在使用dpdk,方法是将数据包发送和接收到rte环中。我很难找到适当的方法来通知应用程序DPDK已接收到传入消息。
为了检查rte_ring是否已接收到数据,我在rte_ring上运行了忙循环。 这是下面的示例
while (1) {
if (rte_ring_dequeue(rx_ring, &_msg) < 0) {
usleep(5);
} else {
recv_msg = (char *) _msg;
if (chara_debug) printf("[%d] Server merge data::[%.24s...]__length::[%ld]\n", batched_packets, recv_msg, strlen(recv_msg));
collect_packets++;
if (collect_packets > MERGE_PACKETS) break;
}
}
但是,我的开发人员说这不是检查收到消息的有效方法,也不是正确的方法。忙轮询应仅在DPDK API中完成,而不应在应用程序中完成。
DPDK是否有一种向应用程序发送信号的方法,以使应用程序仅在收到消息时才可以检查rte_ring?
答案 0 :(得分:2)
好吧,直接的答案是使用DPDK事件库:http://doc.dpdk.org/guides/prog_guide/eventdev.html
但这并不顺利。除非您有直接支持事件模型的硬件,否则仍然需要至少一个RX内核进行轮询(即执行繁忙循环),如下图所示: http://doc.dpdk.org/guides/prog_guide/eventdev.html#api-walk-through