1
我有一個Linux內核模塊,用於計算多個CPU(內核地址空間)中的網絡數據包統計信息。我定期清除相應的內存塊,強烈需要此操作對所有CPU立即生效,否則會扭曲後續的統計值。我的目標CPU是Power PC,所以它的緩存一致性非常寬鬆。因此,我需要在清零內存後手動刷新所有CPU的數據緩存。在Linux內核模塊中刷新CPU數據緩存
所以我應該把我剛剛清理步驟之後:
memset(ptr, 0, size);
// what's going here?
有關緩存和TLB的所有api位於[Documentation/cachetlb.txt](https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/Documentation/ cachetlb.txt?id = refs/tags/v4.2.1),但我也想知道哪一個符合你的要求。 –
短語'需要此操作才能立即生效所有CPU'對於多線程編程沒有意義。如果統計值是某個**不變**的一部分,所有CPU都應該遵守**,則在訪問它們時需要使用鎖定(自旋鎖,互斥鎖)。在某些情況下,*原子操作*或*內存障礙*以較低的成本提供相同的保證。 Linux內核中還有許多其他的同步機制。但是,鑑於信息不足以作出適當的選擇。 – Tsyvarev
假設我們處於CPU X的延遲中斷處理程序中。有一塊內存負責累積由CPU Y(由CPU Y處理)接收到的以太網數據包的統計信息。可能這個塊被複制到CPU Y數據緩存中。現在我們從CPU X中清除這個塊,並且需要保證這些值(塊的一部分)不會隨後由CPU Y增加。我知道同步在這裏是明顯的想法,但對於這種情況來說太昂貴了。 – ababo