| // Copyright 2023 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // All interactions with vm_concierge is wrapped here. This includes both |
| // sending D-BUS methods and responding to signals. |
| |
| use crate::dbus_constants::vm_concierge; |
| use crate::dbus_wrapper::DbusConnectionTrait; |
| use crate::shader_cache_mount::{ShaderCacheMountMapPtr, VmId}; |
| |
| use anyhow::Result; |
| use log::debug; |
| use std::sync::Arc; |
| use system_api::concierge_service::{ |
| AddGroupPermissionMesaRequest, GetVmGpuCachePathRequest, GetVmGpuCachePathResponse, |
| VmStoppingSignal, |
| }; |
| |
| pub async fn handle_vm_stopped( |
| raw_bytes: Vec<u8>, |
| mount_map: ShaderCacheMountMapPtr, |
| ) -> Result<()> { |
| let stopping_signal: VmStoppingSignal = protobuf::Message::parse_from_bytes(&raw_bytes) |
| .map_err(|e| dbus::MethodErr::invalid_arg(&e))?; |
| let vm_id = VmId { |
| vm_name: stopping_signal.name, |
| vm_owner_id: stopping_signal.owner_id, |
| }; |
| |
| mount_map.clear_all_mounts(Some(vm_id)).await?; |
| |
| Ok(()) |
| } |
| |
| pub async fn get_vm_gpu_cache_path<D: DbusConnectionTrait>( |
| vm_id: &VmId, |
| dbus_conn: Arc<D>, |
| ) -> Result<String> { |
| let mut request = GetVmGpuCachePathRequest::new(); |
| request.name = vm_id.vm_name.to_owned(); |
| request.owner_id = vm_id.vm_owner_id.to_owned(); |
| let request_bytes = protobuf::Message::write_to_bytes(&request)?; |
| |
| let (response_bytes,): (Vec<u8>,) = dbus_conn |
| .call_dbus_method( |
| vm_concierge::SERVICE_NAME, |
| vm_concierge::PATH_NAME, |
| vm_concierge::INTERFACE_NAME, |
| vm_concierge::GET_VM_GPU_CACHE_PATH_METHOD, |
| (request_bytes,), |
| ) |
| .await?; |
| |
| let response: GetVmGpuCachePathResponse = protobuf::Message::parse_from_bytes(&response_bytes)?; |
| |
| Ok(response.path) |
| } |
| |
| pub async fn add_shader_cache_group_permission<D: DbusConnectionTrait>( |
| vm_id: &VmId, |
| dbus_conn: Arc<D>, |
| ) -> Result<()> { |
| let mut request = AddGroupPermissionMesaRequest::new(); |
| request.name = vm_id.vm_name.to_owned(); |
| request.owner_id = vm_id.vm_owner_id.to_owned(); |
| let request_bytes = protobuf::Message::write_to_bytes(&request)?; |
| |
| debug!("Requesting concierge to add group permission"); |
| dbus_conn |
| .call_dbus_method( |
| vm_concierge::SERVICE_NAME, |
| vm_concierge::PATH_NAME, |
| vm_concierge::INTERFACE_NAME, |
| vm_concierge::ADD_GROUP_PERMISSION_MESA_METHOD, |
| (request_bytes,), |
| ) |
| .await?; |
| |
| Ok(()) |
| } |