KVM machine.Get(): Use up vCPU pool before scanning for available ones.
Previously, we created vCPUs on demand, and so taking an unused vCPU from the pool was expensive. Now, we pre-create all vCPUs at the start, so it makes sense to use them all to reduce contention. PiperOrigin-RevId: 448382485
This commit is contained in:
parent
d4652bd6df
commit
db16575cb5
|
@ -476,18 +476,6 @@ func (m *machine) Get() *vCPU {
|
|||
}
|
||||
|
||||
for {
|
||||
// Scan for an available vCPU.
|
||||
for origTID, c := range m.vCPUsByTID {
|
||||
if c.state.CompareAndSwap(vCPUReady, vCPUUser) {
|
||||
delete(m.vCPUsByTID, origTID)
|
||||
m.vCPUsByTID[tid] = c
|
||||
m.mu.Unlock()
|
||||
c.loadSegments(tid)
|
||||
timer.Finish("unused")
|
||||
return c
|
||||
}
|
||||
}
|
||||
|
||||
// Get vCPU from the m.vCPUsByID pool.
|
||||
if m.usedVCPUs < m.maxVCPUs {
|
||||
c := m.vCPUsByID[m.usedVCPUs]
|
||||
|
@ -500,6 +488,18 @@ func (m *machine) Get() *vCPU {
|
|||
return c
|
||||
}
|
||||
|
||||
// Scan for an available vCPU.
|
||||
for origTID, c := range m.vCPUsByTID {
|
||||
if c.state.CompareAndSwap(vCPUReady, vCPUUser) {
|
||||
delete(m.vCPUsByTID, origTID)
|
||||
m.vCPUsByTID[tid] = c
|
||||
m.mu.Unlock()
|
||||
c.loadSegments(tid)
|
||||
timer.Finish("unused")
|
||||
return c
|
||||
}
|
||||
}
|
||||
|
||||
// Scan for something not in user mode.
|
||||
for origTID, c := range m.vCPUsByTID {
|
||||
if !c.state.CompareAndSwap(vCPUGuest, vCPUGuest|vCPUWaiter) {
|
||||
|
|
Loading…
Reference in New Issue