Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 27 additions & 14 deletions openvmm/openvmm_entry/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2199,6 +2199,7 @@ async fn run_control(driver: &DefaultDriver, mesh: &VmmMesh, opt: Options) -> an
Resume(bool),
Reset(Result<(), RemoteError>),
PulseSaveRestore(Result<(), PulseSaveRestoreError>),
ServiceVtl2(anyhow::Result<Duration>),
}

enum Event {
Expand Down Expand Up @@ -2394,6 +2395,18 @@ async fn run_control(driver: &DefaultDriver, mesh: &VmmMesh, opt: Options) -> an
"pulse save/restore failed"
),
},
StateChange::ServiceVtl2(r) => match r {
Ok(dur) => {
tracing::info!(
duration = dur.as_millis() as i64,
"vtl2 servicing complete"
)
}
Err(err) => tracing::error!(
error = err.as_ref() as &dyn std::error::Error,
"vtl2 servicing failed"
),
},
},
Err(err) => {
tracing::error!(
Expand Down Expand Up @@ -2735,35 +2748,35 @@ async fn run_control(driver: &DefaultDriver, mesh: &VmmMesh, opt: Options) -> an
user_mode_only,
igvm,
} => {
let r = async {
let paravisor_diag = paravisor_diag.clone();
let vm_rpc = vm_rpc.clone();
let igvm = igvm.or_else(|| opt.igvm.clone());
let ged_rpc = resources.ged_rpc.clone();
let r = async move {
let start;
if user_mode_only {
start = Instant::now();
paravisor_diag.restart().await?;
} else {
let path = igvm
.as_ref()
.or(opt.igvm.as_ref())
.context("no igvm file loaded")?;
let path = igvm.context("no igvm file loaded")?;
let file = fs_err::File::open(path)?;
start = Instant::now();
hvlite_helpers::underhill::service_underhill(
&vm_rpc,
resources.ged_rpc.as_ref().context("no GED")?,
ged_rpc.as_ref().context("no GED")?,
GuestServicingFlags::default(),
file.into(),
)
.await?;
}
anyhow::Ok(start)
let end = Instant::now();
Ok(end - start)
}
.await;
let end = Instant::now();
match r {
Ok(start) => {
println!("servicing time: {}ms", (end - start).as_millis());
}
Err(err) => eprintln!("error: {:#}", err),
.map(|r| Ok(StateChange::ServiceVtl2(r)));
if state_change_task.is_some() {
tracing::error!("state change already in progress");
} else {
state_change_task = Some(driver.spawn("state-change", r));
}
}
InteractiveCommand::Quit => {
Expand Down