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:
Michael Pratt 2019-04-03 18:05:30 -07:00 committed by Shentubot
parent 61d8c361c6
commit 9cf33960fc
2 changed files with 12 additions and 7 deletions

View File

@ -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)

View File

@ -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,12 +170,16 @@ func (*runApp) execute(t *Task) taskRunState {
if t.rseqPreempted {
t.rseqPreempted = false
if t.rseqCPUAddr != 0 {
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)
t.SendSignal(sigPriv(linux.SIGSEGV))
// Re-enter the task run loop for signal delivery.
return (*runApp)(nil)
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)
t.SendSignal(sigPriv(linux.SIGSEGV))
// Re-enter the task run loop for signal delivery.
return (*runApp)(nil)
}
}
}
t.rseqInterrupt()