summary refs log tree commit diff
path: root/src/linux.rs
diff options
context:
space:
mode:
authorXiong Zhang <xiong.y.zhang@intel.com>2019-09-19 10:29:02 +0800
committerCommit Bot <commit-bot@chromium.org>2019-10-15 11:41:38 +0000
commit2515b756302235e69fbc1b07ae70270be204a91d (patch)
treeae378fd1b5382e74f39769355a41fd0b7bee3b1d /src/linux.rs
parent8eb944b480c0b1e07ba24e02bb7e1955f3daf584 (diff)
downloadcrosvm-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.rs21
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);
+                                    }
+                                }
+                            },
                         }
                     }
                 }