Merge pull request #6358 from zhlhahaha:2232

PiperOrigin-RevId: 387442805
This commit is contained in:
gVisor bot
2021-07-28 14:54:22 -07:00
2 changed files with 11 additions and 4 deletions
+1 -1
View File
@@ -101,7 +101,7 @@ func handleBluepillFault(m *machine, physical uintptr, phyRegions []physicalRegi
// Store the physical address in the slot. This is used to
// avoid calls to handleBluepillFault in the future (see
// machine.mapPhysical).
atomic.StoreUintptr(&m.usedSlots[slot], physical)
atomic.StoreUintptr(&m.usedSlots[slot], physicalStart)
// Successfully added region; we can increment nextSlot and
// allow another set to proceed here.
atomic.StoreUint32(&m.nextSlot, slot+1)
+10 -3
View File
@@ -70,7 +70,7 @@ type machine struct {
// tscControl checks whether cpu supports TSC scaling
tscControl bool
// usedSlots is the set of used physical addresses (sorted).
// usedSlots is the set of used physical addresses (not sorted).
usedSlots []uintptr
// nextID is the next vCPU ID.
@@ -296,13 +296,20 @@ func newMachine(vm int) (*machine, error) {
return m, nil
}
// hasSlot returns true iff the given address is mapped.
// hasSlot returns true if the given address is mapped.
//
// This must be done via a linear scan.
//
//go:nosplit
func (m *machine) hasSlot(physical uintptr) bool {
for i := 0; i < len(m.usedSlots); i++ {
slotLen := int(atomic.LoadUint32(&m.nextSlot))
// When slots are being updated, nextSlot is ^uint32(0). As this situation
// is less likely happen, we just set the slotLen to m.maxSlots, and scan
// the whole usedSlots array.
if slotLen == int(^uint32(0)) {
slotLen = m.maxSlots
}
for i := 0; i < slotLen; i++ {
if p := atomic.LoadUintptr(&m.usedSlots[i]); p == physical {
return true
}