我正在尝试在DPDK中启用中断,这样我的网络接收线程就可以在数据包到达之前睡在epoll上。我使用的是带有Intel 82599ES 10Gbps NIC的igb_uio和ixgbe驱动程序。
为了启用中断,我大致执行了以下操作,但epoll从不表示数据包已经到达。该线程仅在epoll超时时处理数据包。我甚至没有看到设备在监控时出现中断 /proc/interrupts .
/proc/interrupts
port_conf.intr_conf.rxq = 1; ... CHECK_EQ(rte_eth_dev_rx_intr_ctl_q(kPort, kQueue, RTE_EPOLL_PER_THREAD, RTE_INTR_EVENT_ADD, nullptr), 0); CHECK_EQ(rte_eth_dev_rx_intr_enable(kPort, kQueue), 0); ... rte_epoll_event event; while (true) { int n = rte_epoll_wait(RTE_EPOLL_PER_THREAD, &event, /*maxevents=*/1, /*timeout=*/1000); if (n == 0) { // Timeout expired. } else { // Received RX interrupt. } }
考虑到我没看到有什么进展 /过程/中断 ,我将开始挖掘ixgbe驱动程序。然而,我想先问一下,我的设置是否缺少任何明显的东西,因为这应该很容易做到。我的代码紧密基于l3fwd power示例。
/过程/中断
我和Dmitry Kozlyuk谈过,他指出ixgbe驱动程序要求在每次调用之前重新设置中断 rte_epoll_wait 所以 rte_eth_dev_rx_intr_enable 应在每次呼叫之前呼叫 等等 在while循环中:
rte_epoll_wait
rte_eth_dev_rx_intr_enable
等等
rte_epoll_event event; while (true) { CHECK_EQ(rte_eth_dev_rx_intr_enable(kPort, kQueue), 0); int n = rte_epoll_wait(RTE_EPOLL_PER_THREAD, &event, /*maxevents=*/1, /*timeout=*/1000); if (n == 0) { // Timeout expired. } else { // Received RX interrupt. } }
你需要在每次通话前进行重新武装 rte_poll_wait 对于其他一些驱动程序,例如vmxnet3。
rte_poll_wait