[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[pbsd-mg2] Re: yet another virtual alias problem?



virtual alias対策のバグを修正しました。

pmap_enter_pv()の中でviatual aliasがあるかどうかチェックして、あったら
uncachedでマップし直してcache flushをしている部分があるのですが、この部
分が間違っていました。

修正前のソースだと、物理ページに対してvirtual aliasが発生する場合、

1) 物理ページに対するすべてのマッピングをuncachedに変える
2) その物理ページをマップしている仮想アドレスでcache flushを実行する

という処理を行ないますが、ここに問題があります。

2)の段階ではcache flushに使用する仮想アドレスはすでにuncachedに変わって
います。uncachedのアドレスを用いたcache flushは動作が未定義なので、まず
これが誤りです。

また、cache属性を変更してcached -> uncachedにする場合は、まずcachedであ
る間に対象となるすべての仮想アドレスに対してcache flushを実行しておく必
                ========
要があります。そうしないと、cache上のwrite-backされていないデータによっ
てuncachedで変更されたデータが上書きされるからです。

したがって、正しい処理は以下のようになります。

1) 物理ページをマップしているすべての仮想アドレスでcache flushを実行する
2) 物理ページに対するすべてのマッピングをuncachedに変える

以上の修正は先程commitしました(sys/arch/mips/mips/pmap.c)。

修正後のカーネルでかれこれ6日間近くpkgsrcのmakeやmake buildなどを続けて
いますが、快調に動作しています。(下記参照)

 2:13PM  up 5 days, 15:16, 1 user, load averages: 1.41, 1.41, 1.36
USER    TTY FROM              LOGIN@  IDLE WHAT
root     co -                Wed07AM     0 -

篠原