刷新 CPU 内核模块中的数据缓存
Flush CPU data caches in Linux kernel module
我有一个 Linux 内核模块,它计算几个 CPU 之间的网络数据包统计信息(在内核地址 space 中)。我定期清除相应的内存块,强烈需要此操作对所有 CPU 立即生效,否则会扭曲后续统计值。我的目标 CPU 是一台 Power PC,所以它的缓存一致性非常宽松。因此,我需要在将内存归零后手动刷新所有 CPU 的数据缓存。
那么我应该在我的清算程序之后放置什么:
memset(ptr, 0, size);
// what's going here?
经过一番思考,我意识到这里的问题并不是真正与数据缓存刷新有关。实际上,我试图避免平庸的竞争条件(第一个 cpu 清除值,而第二个增加它)。在我的例子中,通过互斥锁保护数据太昂贵了,所以值得使用原子标志来通知拥有者 CPU 自行清除值。
我有一个 Linux 内核模块,它计算几个 CPU 之间的网络数据包统计信息(在内核地址 space 中)。我定期清除相应的内存块,强烈需要此操作对所有 CPU 立即生效,否则会扭曲后续统计值。我的目标 CPU 是一台 Power PC,所以它的缓存一致性非常宽松。因此,我需要在将内存归零后手动刷新所有 CPU 的数据缓存。
那么我应该在我的清算程序之后放置什么:
memset(ptr, 0, size);
// what's going here?
经过一番思考,我意识到这里的问题并不是真正与数据缓存刷新有关。实际上,我试图避免平庸的竞争条件(第一个 cpu 清除值,而第二个增加它)。在我的例子中,通过互斥锁保护数据太昂贵了,所以值得使用原子标志来通知拥有者 CPU 自行清除值。