kernel - Fix pmap->pm_active race in switch code
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 1 Dec 2011 01:29:35 +0000 (17:29 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 1 Dec 2011 01:29:35 +0000 (17:29 -0800)
commitd8d8c8c54abec95be5a3e5895f4cb816d978a3af
tree4111e7fa7badf2b9569d0d5168d02c7a0729a553
parentde7ac1d675b7dd4a7e0108b0482570e5ec02afc1
kernel - Fix pmap->pm_active race in switch code

* Use an atomic cmpxchg to set the cpu bit in the pmap->pm_active bitmap
  AND test the pmap interlock bit at the same time, instead of testing
  the interlock bit afterwords.

* In addition, if we find the lock bit set and must spin-wait for it to
  clear, we skip the %cr3 comparison check and unconditionally load %cr3.

* It is unclear if the race could be realized in any way.  It was probably
  not responsible for the seg-fault issue as prior tests with an unconditional
  load of %cr3 did not fix the problem.  Plus in the same-%cr3-as-last-thread
  case the cpu bit is already set so there should be no possibility of
  losing a TLB interlock IPI (and %cr3 is loaded unconditionally when it
  doesn't match, so....).

  But fix the race anyway.
sys/platform/pc32/i386/swtch.s
sys/platform/pc64/x86_64/swtch.s