【问题标题】:Flush CPU data caches in Linux kernel module在 Linux 内核模块中刷新 CPU 数据缓存
【发布时间】:2015-09-27 11:44:25
【问题描述】:

我有一个 Linux 内核模块,它计算多个 CPU 之间的网络数据包统计信息(在内核地址空间中)。我会定期清除相应的内存块,强烈需要此操作立即对所有 CPU 生效,否则会扭曲后续统计值。我的目标 CPU 是 Power PC,因此它的缓存一致性非常宽松。因此,我需要在内存归零后手动刷新所有 CPU 的数据缓存。

那么我应该在我的清算程序之后放置什么:

memset(ptr, 0, size);
// what's going here?

【问题讨论】:

  • 所有关于缓存和TLB的api都在Documentation/cachetlb.txt,但我也想知道哪一个满足你的需求。
  • 短语need this action to take immediate effect for all CPUs 对多线程编程没有意义。如果统计值是某些不变量 的一部分,所有 CPU 都应该遵守这些值,则在访问它们时需要使用锁定(自旋锁、互斥锁)。在某些情况下,原子操作内存屏障提供相同的保证,但成本更低。 Linux 内核中还有许多其他的同步机制。但是给定的信息不足以做出正确的选择。
  • 假设我们处于 CPU X 上的延迟中断处理程序中。有一块内存负责累积 CPU Y 接收到的以太网数据包的统计信息(由 CPU Y 处理)。可能这个块被复制到 CPU Y 数据缓存中。现在我们从 CPU X 中清除这个块,并且需要保证这些值(块的一部分)不会随后被 CPU Y 递增。我知道同步是这里显而易见的想法,但对于这种情况来说太昂贵了。跨度>

标签: c caching linux-kernel powerpc


【解决方案1】:

经过一番思考,我意识到这里的问题实际上与数据缓存刷新无关。实际上,我试图避免平庸的竞争条件(第一个 cpu 清除值,而第二个 cpu 增加它)。在我的情况下,通过互斥锁保护数据成本太高,因此值得使用原子标志来通知拥有的 CPU 自行清除值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-01
    • 2015-05-26
    • 2015-07-10
    • 2015-07-08
    • 1970-01-01
    • 2011-11-29
    • 2012-07-01
    • 1970-01-01
    相关资源
    最近更新 更多