私は、このBARをプロセッサキャッシュにキャッシュ可能にする目的で、PCIe BARのカスタムmmap()
機能を持つドライバを書き込もうとしています。私はこれが最高の帯域幅を実現する最善の方法ではなく、書き込みの順序は予測できないことを認識しています(どちらも問題はありません)。キャッシング可能なPCIe BARのmmapを行う方法
これはHow would one prevent MMAP from caching values?
プロセッサに記載されているものと類似しているが、Sandy Bridgeのi7のある、PCIeデバイスは、アルテラのStratix IV devのです。ボード。
まず、CentOS 5(2.6.18)で試してみました。私はBTRがキャッシング不可能なMTRR内にないことを確認するためにMTRR設定を変更し、io_remap_pfn_range()
を_PAGE_PCD
と_PAGE_PWT
ビットをクリアして使用しました。読み込みが正常に行われました。正しい値が返され、同じアドレスに2度目の読み込みがあっても、必ずしも読み込みがPCIeに移行するとは限りません(読み込みカウンタはFPGAでチェックされました)。ただし、書き込みによって、システムがフリーズしてから、ログまたは画面にメッセージが表示されずに再起動されました。
第2に、私はCentOS 6(2.6.32)でそれをやろうとしましたが、これはPATをサポートしています。結果は同じです:読み取りが正しく動作し、書き込みが原因でシステムがフリーズして再起動します。興味深いことに、非一時的/書き込み結合フルキャッシュライン書き込み(AVX/SSE)は期待通りに機能する。すなわち、それらは常にFPGAに行き、FPGAはフルキャッシュライン書き込みを観察する。ただし、シンプルな64ビット書き込みでもシステムのフリーズ/再起動が発生します。
また、ドライバコードの中でioremap_cache()
と、その後iowrite32()
を試しました。結果は同じです。
私はハードウェアの問題だと思っていますが、誰かが何が起こっているかについてのアイデアを共有できるかどうかは分かります。
EDIT:CentOS 6:Machine Check Exception:5 Bank 5:be2000000003110aでMCEメッセージをキャプチャできました。
2ソケットのSandy Bridge(Romley)で同じコードを試しました:読み取りと非一時書き込みの動作は同じですが、単純な書き込みはMCE /クラッシュを引き起こさないがシステム状態、つまり値には影響しませんメモリは変更されません。
また、古い2ソケットのNehalemシステムでも同じコードを試しました。単純な書き込みもMCEの原因になりますが、コードは異なります。