[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 -
篠原