gpt4 book ai didi

Linux PCIe 驱动程序对 MSI 有周期性的长延迟

转载 作者:太空宇宙 更新时间:2023-11-04 12:35:01 25 4
gpt4 key购买 nike

我已经为 Linux v4.1.15(非 PREEMPT_RT)创建了一个 PCIe 驱动程序,它带有一个 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 微秒从 FPGA (Cyclone V) 发送一次,我的 ISR 被触发得非常快并且处理无误(延迟 < 5 微秒)。问题是,大约每 3 秒(抖动相对较小的 3 秒),我的 ISR 的延迟就会跳到大约 1.5 毫秒到 2 毫秒;这是通过更改我的 ISR 以将值写回 FPGA 并监控来自 FPGA 的引脚来使用示波器测量的。 msi_counterspin_lock 仅在我的代码中的其他地方使用,但仅用于以我的 ISR 递增计数器的相同方式递减计数器。我使用的是 1 GHz 的 iMX6 四核 CPU,系统使用的是基本的 Yocto 镜像(core-image-minimal),因此 CPU 上没有真正运行任何东西。 CPU 唯一连接的其他硬件是以太网,但发送的数据非常少,数据更新频率超过 3 秒。

问题:

  • 我如何确定为什么 Linux 会定期增加我的 ISR?
  • 我可以做些什么来减少延迟?

其他信息:

  • 我已将传递给 request_irq() 的标志更改为 IRFQ_NO_SUSPEND
    | IRFQ_NO_THREAD
    ,以及其他值,似乎没有什么可以解决的这种周期性延迟增加。

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

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

最终解决方案:

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

最佳答案

你可以在spin_lock前后加一个定时器。如果时间差超过某个阈值,则增加另一个时间。您会计算由于 spin_lock 而导致延迟的频率。如果它与您看到延迟的频率相匹配,那么您可以尝试找出其他锁持有者不释放它的原因。持有锁能被抢占吗?

另一件要研究的事情是,spin_lock 本身是否应该以较低但不为零的概率花费很长时间?

关于Linux PCIe 驱动程序对 MSI 有周期性的长延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42172316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com