Only CopyOut CPU when it changes
This will save copies when preemption is not caused by a CPU migration. PiperOrigin-RevId: 241844399 Change-Id: I2ba3b64aa377846ab763425bd59b61158f576851
This commit is contained in:
parent
61d8c361c6
commit
9cf33960fc
|
@ -88,6 +88,7 @@ func (t *Task) RSEQCPUAddr() usermem.Addr {
|
|||
func (t *Task) SetRSEQCPUAddr(addr usermem.Addr) error {
|
||||
t.rseqCPUAddr = addr
|
||||
if addr != 0 {
|
||||
t.rseqCPU = int32(hostcpu.GetCPU())
|
||||
if err := t.rseqCopyOutCPU(); err != nil {
|
||||
t.rseqCPUAddr = 0
|
||||
t.rseqCPU = -1
|
||||
|
@ -102,7 +103,6 @@ func (t *Task) SetRSEQCPUAddr(addr usermem.Addr) error {
|
|||
// Preconditions: The caller must be running on the task goroutine. t's
|
||||
// AddressSpace must be active.
|
||||
func (t *Task) rseqCopyOutCPU() error {
|
||||
t.rseqCPU = int32(hostcpu.GetCPU())
|
||||
buf := t.CopyScratchBuffer(4)
|
||||
usermem.ByteOrder.PutUint32(buf, uint32(t.rseqCPU))
|
||||
_, err := t.CopyOutBytes(t.rseqCPUAddr, buf)
|
||||
|
|
|
@ -21,6 +21,7 @@ import (
|
|||
|
||||
"gvisor.googlesource.com/gvisor/pkg/abi/linux"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/arch"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/hostcpu"
|
||||
ktime "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/time"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/memmap"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/platform"
|
||||
|
@ -169,6 +170,9 @@ func (*runApp) execute(t *Task) taskRunState {
|
|||
if t.rseqPreempted {
|
||||
t.rseqPreempted = false
|
||||
if t.rseqCPUAddr != 0 {
|
||||
cpu := int32(hostcpu.GetCPU())
|
||||
if t.rseqCPU != cpu {
|
||||
t.rseqCPU = cpu
|
||||
if err := t.rseqCopyOutCPU(); err != nil {
|
||||
t.Warningf("Failed to copy CPU to %#x for RSEQ: %v", t.rseqCPUAddr, err)
|
||||
t.forceSignal(linux.SIGSEGV, false)
|
||||
|
@ -177,6 +181,7 @@ func (*runApp) execute(t *Task) taskRunState {
|
|||
return (*runApp)(nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
t.rseqInterrupt()
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue