summary refs log tree commit diff
path: root/src/plugin
diff options
context:
space:
mode:
authorMatt Delco <delco@chromium.org>2019-09-25 11:21:51 -0700
committerCommit Bot <commit-bot@chromium.org>2019-10-23 06:22:00 +0000
commit893c1200ddd16567b184652bbf4df70df578b658 (patch)
tree92ec5efcbc38a1276d14f592ab796330d3e7d2d4 /src/plugin
parent3156937410b99e7b27283c6dc566e72ca4de53ab (diff)
downloadcrosvm-893c1200ddd16567b184652bbf4df70df578b658.tar
crosvm-893c1200ddd16567b184652bbf4df70df578b658.tar.gz
crosvm-893c1200ddd16567b184652bbf4df70df578b658.tar.bz2
crosvm-893c1200ddd16567b184652bbf4df70df578b658.tar.lz
crosvm-893c1200ddd16567b184652bbf4df70df578b658.tar.xz
crosvm-893c1200ddd16567b184652bbf4df70df578b658.tar.zst
crosvm-893c1200ddd16567b184652bbf4df70df578b658.zip
crosvm: defer IPC on set calls
If a plugin makes a set call on vcpu registers then we
can improve performance by deferring the IPC and instead
conbining the request with the next resume call.

BUG=None
TEST=build and run.

Change-Id: I4eb54a3f6eb30c98971aa2f099e3ea5899767eed
Signed-off-by: Matt Delco <delco@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1825262
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'src/plugin')
-rw-r--r--src/plugin/vcpu.rs14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/plugin/vcpu.rs b/src/plugin/vcpu.rs
index 5ca27da..05970f7 100644
--- a/src/plugin/vcpu.rs
+++ b/src/plugin/vcpu.rs
@@ -444,6 +444,20 @@ impl PluginVcpu {
                 Err(SysError::new(EPROTO))
             } else if request.has_resume() {
                 send_response = false;
+                let resume = request.get_resume();
+                if !resume.get_regs().is_empty() {
+                    set_vcpu_state(vcpu, VcpuRequest_StateSet::REGS, resume.get_regs())?;
+                }
+                if !resume.get_sregs().is_empty() {
+                    set_vcpu_state(vcpu, VcpuRequest_StateSet::SREGS, resume.get_sregs())?;
+                }
+                if !resume.get_debugregs().is_empty() {
+                    set_vcpu_state(
+                        vcpu,
+                        VcpuRequest_StateSet::DEBUGREGS,
+                        resume.get_debugregs(),
+                    )?;
+                }
                 resume_data = Some(request.take_resume().take_data());
                 Ok(())
             } else if request.has_get_state() {