3

Linuxカーネルのex​​t2機能の理由を誰かが説明できますか int ext2_statfs (struct dentry * dentry, struct kstatfs * buf)

問題smp_rmb()と場合smp_wmb()には else if (sbi->s_blocks_last != le32_to_cpu(es->s_blocks_count)) {

これはアップストリーム カーネル コミット2235219b7721b8e74de6841e79240936561a2b63で追加されました。これにより .statfs の不要な計算が省略されますが、メモリ バリアが追加された理由を理解できませんでした。

4

1 に答える 1

3

関数はspin_lockを実行することで開始されるため(そして最後にロックが解除されます)、

spin_lock(&sbi->s_lock);

同時アクセスから保護されます。では、なぜsmp_wmbsmp_rmbが必要なのか...

書き込み操作に関しては、

    sbi->s_overhead_last = overhead;
    smp_wmb();
    sbi->s_blocks_last = le32_to_cpu(es->s_blocks_count);

smp_wmbは、2 つの割り当ての順序を変更するコンパイラまたはプロセッサの最適化 (メモリ アクセスに関して 2 つの書き込み間に依存関係がないため) を妨げているようですext2_statfsには同時アクセスがないため、同様の動作をする可能性のある別の関数で問題が発生し、ブロック数の変更があるかどうかを確認し、そうでない場合はオーバーヘッドを使用するsbi->s_overhead_last可能性があります。 、まさにこの時点で、別の関数で、間違った順序での 2 つの書き込み操作の途中です。

sbiプロパティへの同様の書き込みアクセスは事前に (同じスピンロックで) spin_lockするので、これはおそらく予防策です。また、2 つの操作をこの順序で実行する必要があるという事実も強化されます。

読み取りアクセスに関しては、その必要性はあまり明白ではなく、sbiブロックとesブロックの間の依存関係をさらに分析する必要があります。

于 2014-08-31T11:25:22.643 に答える