diff options
author | Xiong Zhang <xiong.y.zhang@intel.com> | 2019-09-19 10:29:02 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-10-15 11:41:38 +0000 |
commit | 2515b756302235e69fbc1b07ae70270be204a91d (patch) | |
tree | ae378fd1b5382e74f39769355a41fd0b7bee3b1d /src/linux.rs | |
parent | 8eb944b480c0b1e07ba24e02bb7e1955f3daf584 (diff) | |
download | crosvm-2515b756302235e69fbc1b07ae70270be204a91d.tar crosvm-2515b756302235e69fbc1b07ae70270be204a91d.tar.gz crosvm-2515b756302235e69fbc1b07ae70270be204a91d.tar.bz2 crosvm-2515b756302235e69fbc1b07ae70270be204a91d.tar.lz crosvm-2515b756302235e69fbc1b07ae70270be204a91d.tar.xz crosvm-2515b756302235e69fbc1b07ae70270be204a91d.tar.zst crosvm-2515b756302235e69fbc1b07ae70270be204a91d.zip |
vm_control: Add VmIrqRequest Socket
When vfio device's msi/msi-x or virtio device's msi-x is enabled, its irq routing info should be notified to kvm. But this is a runtime vm service call, so vm_control is used to call vm service. VmIrqRequest->AllocateOneMsi() is used to allocate one gsi for a msi and a msi-x vector, and link gsi with irqfd through vm->register_irqfd. The orignal interrupt_evt and interrupt_resample_interrupt is used for INTX only. VmIrqRequest->AddMsiRoute is used to add msi routing info into kvm route table. BUG=chromium:992270 TEST=none Change-Id: I4f1beeb791943e09d957573dd2a58d55bf895d16 Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1846603 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com>
Diffstat (limited to 'src/linux.rs')
-rw-r--r-- | src/linux.rs | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/linux.rs b/src/linux.rs index bf78eb2..c761240 100644 --- a/src/linux.rs +++ b/src/linux.rs @@ -53,7 +53,7 @@ use vhost; use vm_control::{ BalloonControlCommand, BalloonControlRequestSocket, BalloonControlResponseSocket, DiskControlCommand, DiskControlRequestSocket, DiskControlResponseSocket, DiskControlResult, - UsbControlSocket, VmControlResponseSocket, VmMemoryControlRequestSocket, + UsbControlSocket, VmControlResponseSocket, VmIrqResponseSocket, VmMemoryControlRequestSocket, VmMemoryControlResponseSocket, VmMemoryRequest, VmMemoryResponse, VmRunMode, }; @@ -257,6 +257,8 @@ type Result<T> = std::result::Result<T, Error>; enum TaggedControlSocket { Vm(VmControlResponseSocket), VmMemory(VmMemoryControlResponseSocket), + #[allow(dead_code)] + VmIrq(VmIrqResponseSocket), } impl AsRef<UnixSeqpacket> for TaggedControlSocket { @@ -265,6 +267,7 @@ impl AsRef<UnixSeqpacket> for TaggedControlSocket { match &self { Vm(ref socket) => socket, VmMemory(ref socket) => socket, + VmIrq(ref socket) => socket, } } } @@ -1755,6 +1758,22 @@ fn run_control( } } }, + TaggedControlSocket::VmIrq(socket) => match socket.recv() { + Ok(request) => { + let response = + request.execute(&mut linux.vm, &mut linux.resources); + if let Err(e) = socket.send(&response) { + error!("failed to send VmIrqResponse: {}", e); + } + } + Err(e) => { + if let MsgError::BadRecvSize { actual: 0, .. } = e { + vm_control_indices_to_remove.push(index); + } else { + error!("failed to recv VmIrqRequest: {}", e); + } + } + }, } } } |