繁体   English   中英

Linux PCIe驱动程序对MSI具有周期性的长等待时间

[英]Linux PCIe driver has periodic long latency for MSI

我已经创建了用于Linux v4.1.15(非PREEMPT_RT)的PCIe驱动程序,具有一个IRQ,该IRQ是从FPGA的MSI生成的。 我的ISR是:

static irq_handler int_handler(int irq, void* dev_id, struct pt_regs* regs)
{
    spin_lock(&my_lock);
    msi_counter++;
    spin_unlock(&my_lock);

    return (irq_handler_t) IRQ_HANDLED;
}

MSI每隔300 us从FPGA(Cyclone V)发送一次,我的ISR被迅速触发,并且处理无误(等待时间<5 us)。 问题是,每隔3 s(抖动相对较小的3 s),ISR的等待时间就跳到1.5 ms到2 ms。 通过更改ISR以将值写回到FPGA并监视FPGA的引脚来对示波器进行测量。 msi_counterspin_lock仅在我的代码中的另一个位置使用,但仅以与我的ISR递增计数器相同的方式递减计数器。 我使用的是1 GHz的iMX6四核CPU,系统使用的是准系统的Yocto映像(最小核心映像),因此CPU上没有任何运行。 CPU连接到的唯一其他硬件是以太网,但是发送的数据很少,并且数据更新的频率超过3秒。

问题:

  • 如何确定为什么Linux会定期增加ISR的延迟?
  • 我该如何减少延迟?

其他资讯:

  • 我将传递给request_irq()的标志更改为IRFQ_NO_SUSPEND | IRFQ_NO_THREAD IRFQ_NO_SUSPEND | IRFQ_NO_THREAD以及其他值,似乎无法解决此周期性延迟增加的问题。

  • 另外,当我查看cat /proc/interrupts它表明只有ISR运行的唯一内核0(四个内核中的第一个)。 我不知道这是否有任何意义,但我认为值得一提。

  • 从FPGA到CPU的数据每个MSI传输一次(每300 us一次),传输数据的时间稳定为17 us。 没有数据从CPU发送到FPGA。

最终解决方案:

我创建了PREEMPT_RT内核映像,并创建了带有标志IRQF_NO_SUSPEND | IRQF_NO_THREAD | IRQF_PERCPU ISR request_irq() IRQF_NO_SUSPEND | IRQF_NO_THREAD | IRQF_PERCPU IRQF_NO_SUSPEND | IRQF_NO_THREAD | IRQF_PERCPU IRQF_NO_SUSPEND | IRQF_NO_THREAD | IRQF_PERCPU 我还用atomic_t替换了spin_lock ,最大的改进来自PREEMPT_RT。 现在,我的平均延迟时间约为12美元。

您可以在spin_lock之前和之后添加一个计时器。 如果时间差超过某个阈值,则再增加一次。 您会计算出由于spin_lock导致延迟的频率。 如果它与您看到延迟的频率匹配,那么您可以尝试找出为什么另一个锁持有人不释放它的原因。 持有锁时可以抢占吗?

还要考虑的另一件事是spin_lock本身是否应该以低但不是零的概率花费很长时间?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM