Add onPayloadReady callback
The guest VM can notify that its payload has finished initialization and
is ready to serve its own services, by onPayloadReady callback.
Bug: 195381416
Test: atest MicrodroidHostTestCases
Change-Id: I67fee655c410342452bc5ee990e36dfecb30b0cb
diff --git a/virtualizationservice/aidl/android/system/virtualizationservice/IVirtualMachineCallback.aidl b/virtualizationservice/aidl/android/system/virtualizationservice/IVirtualMachineCallback.aidl
index 4dc4333..15354a3 100644
--- a/virtualizationservice/aidl/android/system/virtualizationservice/IVirtualMachineCallback.aidl
+++ b/virtualizationservice/aidl/android/system/virtualizationservice/IVirtualMachineCallback.aidl
@@ -32,6 +32,11 @@
void onPayloadStarted(int cid, in @nullable ParcelFileDescriptor stream);
/**
+ * Called when the payload in the VM is ready to serve.
+ */
+ void onPayloadReady(int cid);
+
+ /**
* Called when the payload has finished in the VM. `exitCode` is the exit code of the payload.
*/
void onPayloadFinished(int cid, int exitCode);
diff --git a/virtualizationservice/aidl/android/system/virtualmachineservice/IVirtualMachineService.aidl b/virtualizationservice/aidl/android/system/virtualmachineservice/IVirtualMachineService.aidl
index 730f6c2..10b14e0 100644
--- a/virtualizationservice/aidl/android/system/virtualmachineservice/IVirtualMachineService.aidl
+++ b/virtualizationservice/aidl/android/system/virtualmachineservice/IVirtualMachineService.aidl
@@ -24,6 +24,12 @@
void notifyPayloadStarted(int cid);
/**
+ * Notifies that the payload is ready to serve.
+ * TODO(b/191845268): remove cid parameter
+ */
+ void notifyPayloadReady(int cid);
+
+ /**
* Notifies that the payload has finished.
* TODO(b/191845268): remove cid parameter
*/
diff --git a/virtualizationservice/src/aidl.rs b/virtualizationservice/src/aidl.rs
index 562843b..6b60da3 100644
--- a/virtualizationservice/src/aidl.rs
+++ b/virtualizationservice/src/aidl.rs
@@ -640,6 +640,16 @@
}
}
+ /// Call all registered callbacks to notify that the payload is ready to serve.
+ pub fn notify_payload_ready(&self, cid: Cid) {
+ let callbacks = &*self.0.lock().unwrap();
+ for callback in callbacks {
+ if let Err(e) = callback.onPayloadReady(cid as i32) {
+ error!("Error notifying payload ready event from VM CID {}: {}", cid, e);
+ }
+ }
+ }
+
/// Call all registered callbacks to notify that the payload has finished.
pub fn notify_payload_finished(&self, cid: Cid, exit_code: i32) {
let callbacks = &*self.0.lock().unwrap();
@@ -799,6 +809,21 @@
}
}
+ fn notifyPayloadReady(&self, cid: i32) -> binder::Result<()> {
+ let cid = cid as Cid;
+ if let Some(vm) = self.state.lock().unwrap().get_vm(cid) {
+ info!("VM having CID {} payload is ready", cid);
+ vm.callbacks.notify_payload_ready(cid);
+ Ok(())
+ } else {
+ error!("notifyPayloadReady is called from an unknown cid {}", cid);
+ Err(new_binder_exception(
+ ExceptionCode::SERVICE_SPECIFIC,
+ format!("cannot find a VM with cid {}", cid),
+ ))
+ }
+ }
+
fn notifyPayloadFinished(&self, cid: i32, exit_code: i32) -> binder::Result<()> {
let cid = cid as Cid;
if let Some(vm) = self.state.lock().unwrap().get_vm(cid) {