diff options
author | Michael Pratt <mpratt@google.com> | 2019-04-03 18:05:30 -0700 |
---|---|---|
committer | Shentubot <shentubot@google.com> | 2019-04-03 18:06:36 -0700 |
commit | 9cf33960fc61309140a67587748570a36e78fc75 (patch) | |
tree | a11e598bad1d28c22393d110850200dfd3482c93 | |
parent | 61d8c361c6639ecbc262076be9f1214dd82065d1 (diff) |
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
-rw-r--r-- | pkg/sentry/kernel/rseq.go | 2 | ||||
-rw-r--r-- | pkg/sentry/kernel/task_run.go | 17 |
2 files changed, 12 insertions, 7 deletions
diff --git a/pkg/sentry/kernel/rseq.go b/pkg/sentry/kernel/rseq.go index 46b03c700..0a954bc16 100644 --- a/pkg/sentry/kernel/rseq.go +++ b/pkg/sentry/kernel/rseq.go @@ -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) diff --git a/pkg/sentry/kernel/task_run.go b/pkg/sentry/kernel/task_run.go index 596b9aa16..359986b21 100644 --- a/pkg/sentry/kernel/task_run.go +++ b/pkg/sentry/kernel/task_run.go @@ -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() |