【发布时间】: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