代码之家  ›  专栏  ›  技术社区  ›  Jack Humphries

在DPDK中使用中断

  •  0
  • Jack Humphries  · 技术社区  · 3 年前

    我正在尝试在DPDK中启用中断,这样我的网络接收线程就可以在数据包到达之前睡在epoll上。我使用的是带有Intel 82599ES 10Gbps NIC的igb_uio和ixgbe驱动程序。

    为了启用中断,我大致执行了以下操作,但epoll从不表示数据包已经到达。该线程仅在epoll超时时处理数据包。我甚至没有看到设备在监控时出现中断 /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示例。

    0 回复  |  直到 3 年前
        1
  •  0
  •   Jack Humphries    3 年前

    我和Dmitry Kozlyuk谈过,他指出ixgbe驱动程序要求在每次调用之前重新设置中断 rte_epoll_wait 所以 rte_eth_dev_rx_intr_enable 应在每次呼叫之前呼叫 等等 在while循环中:

    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。