diff --git a/vm-virtio/src/block.rs b/vm-virtio/src/block.rs index 3a7fb871c..5d84ac289 100755 --- a/vm-virtio/src/block.rs +++ b/vm-virtio/src/block.rs @@ -775,7 +775,7 @@ pub struct Block { config_space: Vec, queue_evt: Option, interrupt_cb: Option>, - epoll_thread: Option>>, + epoll_thread: Option>>>, pause_evt: Option, paused: Arc, } @@ -975,15 +975,18 @@ impl VirtioDevice for Block { }; let paused = self.paused.clone(); + let mut epoll_threads = Vec::new(); thread::Builder::new() .name("virtio_blk".to_string()) .spawn(move || handler.run(queue_evt, paused)) - .map(|thread| self.epoll_thread = Some(thread)) + .map(|thread| epoll_threads.push(thread)) .map_err(|e| { error!("failed to clone the virtio-blk epoll thread: {}", e); ActivateError::BadActivate })?; + self.epoll_thread = Some(epoll_threads); + return Ok(()); } Err(ActivateError::BadActivate) diff --git a/vm-virtio/src/console.rs b/vm-virtio/src/console.rs index 6927e90ed..65c9c3672 100755 --- a/vm-virtio/src/console.rs +++ b/vm-virtio/src/console.rs @@ -351,7 +351,7 @@ pub struct Console { out: Arc>>, queue_evts: Option>, interrupt_cb: Option>, - epoll_thread: Option>>, + epoll_thread: Option>>>, paused: Arc, } @@ -544,15 +544,18 @@ impl VirtioDevice for Console { }; let paused = self.paused.clone(); + let mut epoll_threads = Vec::new(); thread::Builder::new() .name("virtio_console".to_string()) .spawn(move || handler.run(paused)) - .map(|thread| self.epoll_thread = Some(thread)) + .map(|thread| epoll_threads.push(thread)) .map_err(|e| { error!("failed to clone the virtio-console epoll thread: {}", e); ActivateError::BadActivate })?; + self.epoll_thread = Some(epoll_threads); + Ok(()) } diff --git a/vm-virtio/src/device.rs b/vm-virtio/src/device.rs index cb979b898..1a93db5e1 100644 --- a/vm-virtio/src/device.rs +++ b/vm-virtio/src/device.rs @@ -137,7 +137,9 @@ macro_rules! virtio_pausable_inner { ); self.paused.store(false, Ordering::SeqCst); if let Some(epoll_thread) = &self.epoll_thread { - epoll_thread.thread().unpark(); + for i in 0..epoll_thread.len() { + epoll_thread[i].thread().unpark(); + } } Ok(()) diff --git a/vm-virtio/src/iommu.rs b/vm-virtio/src/iommu.rs index 19aa0929b..18d3f2e9b 100644 --- a/vm-virtio/src/iommu.rs +++ b/vm-virtio/src/iommu.rs @@ -765,7 +765,7 @@ pub struct Iommu { ext_mapping: BTreeMap>, queue_evts: Option>, interrupt_cb: Option>, - epoll_thread: Option>>, + epoll_thread: Option>>>, paused: Arc, } @@ -938,15 +938,18 @@ impl VirtioDevice for Iommu { }; let paused = self.paused.clone(); + let mut epoll_threads = Vec::new(); thread::Builder::new() .name("virtio_iommu".to_string()) .spawn(move || handler.run(paused)) - .map(|thread| self.epoll_thread = Some(thread)) + .map(|thread| epoll_threads.push(thread)) .map_err(|e| { error!("failed to clone the virtio-iommu epoll thread: {}", e); ActivateError::BadActivate })?; + self.epoll_thread = Some(epoll_threads); + Ok(()) } diff --git a/vm-virtio/src/pmem.rs b/vm-virtio/src/pmem.rs index 5f2a714a7..bbd4490a2 100644 --- a/vm-virtio/src/pmem.rs +++ b/vm-virtio/src/pmem.rs @@ -318,7 +318,7 @@ pub struct Pmem { config: VirtioPmemConfig, queue_evts: Option>, interrupt_cb: Option>, - epoll_thread: Option>>, + epoll_thread: Option>>>, paused: Arc, } @@ -484,15 +484,18 @@ impl VirtioDevice for Pmem { }; let paused = self.paused.clone(); + let mut epoll_threads = Vec::new(); thread::Builder::new() .name("virtio_pmem".to_string()) .spawn(move || handler.run(paused)) - .map(|thread| self.epoll_thread = Some(thread)) + .map(|thread| epoll_threads.push(thread)) .map_err(|e| { error!("failed to clone virtio-pmem epoll thread: {}", e); ActivateError::BadActivate })?; + self.epoll_thread = Some(epoll_threads); + return Ok(()); } Err(ActivateError::BadActivate) diff --git a/vm-virtio/src/rng.rs b/vm-virtio/src/rng.rs index 9c37414ae..afdf051b5 100755 --- a/vm-virtio/src/rng.rs +++ b/vm-virtio/src/rng.rs @@ -184,7 +184,7 @@ pub struct Rng { acked_features: u64, queue_evts: Option>, interrupt_cb: Option>, - epoll_thread: Option>>, + epoll_thread: Option>>>, paused: Arc, } @@ -335,15 +335,18 @@ impl VirtioDevice for Rng { }; let paused = self.paused.clone(); + let mut epoll_threads = Vec::new(); thread::Builder::new() .name("virtio_rng".to_string()) .spawn(move || handler.run(paused)) - .map(|thread| self.epoll_thread = Some(thread)) + .map(|thread| epoll_threads.push(thread)) .map_err(|e| { error!("failed to clone the virtio-rng epoll thread: {}", e); ActivateError::BadActivate })?; + self.epoll_thread = Some(epoll_threads); + return Ok(()); } Err(ActivateError::BadActivate) diff --git a/vm-virtio/src/vhost_user/blk.rs b/vm-virtio/src/vhost_user/blk.rs index 293292b32..af3a0e926 100644 --- a/vm-virtio/src/vhost_user/blk.rs +++ b/vm-virtio/src/vhost_user/blk.rs @@ -47,7 +47,7 @@ pub struct Blk { queue_sizes: Vec, queue_evts: Option>, interrupt_cb: Option>, - epoll_thread: Option>>, + epoll_thread: Option>>>, paused: Arc, } @@ -274,15 +274,18 @@ impl VirtioDevice for Blk { }); let paused = self.paused.clone(); + let mut epoll_threads = Vec::new(); thread::Builder::new() .name("vhost_user_blk".to_string()) .spawn(move || handler.run(paused)) - .map(|thread| self.epoll_thread = Some(thread)) + .map(|thread| epoll_threads.push(thread)) .map_err(|e| { error!("failed to clone virtio epoll thread: {}", e); ActivateError::BadActivate })?; + self.epoll_thread = Some(epoll_threads); + Ok(()) } diff --git a/vm-virtio/src/vhost_user/fs.rs b/vm-virtio/src/vhost_user/fs.rs index 770a1a238..437f46898 100644 --- a/vm-virtio/src/vhost_user/fs.rs +++ b/vm-virtio/src/vhost_user/fs.rs @@ -162,7 +162,7 @@ pub struct Fs { slave_req_support: bool, queue_evts: Option>, interrupt_cb: Option>, - epoll_thread: Option>>, + epoll_thread: Option>>>, paused: Arc, } @@ -420,15 +420,18 @@ impl VirtioDevice for Fs { }); let paused = self.paused.clone(); + let mut epoll_threads = Vec::new(); thread::Builder::new() .name("virtio_fs".to_string()) .spawn(move || handler.run(paused)) - .map(|thread| self.epoll_thread = Some(thread)) + .map(|thread| epoll_threads.push(thread)) .map_err(|e| { error!("failed to clone queue EventFd: {}", e); ActivateError::BadActivate })?; + self.epoll_thread = Some(epoll_threads); + Ok(()) } diff --git a/vm-virtio/src/vsock/device.rs b/vm-virtio/src/vsock/device.rs index 80c8584b7..d6e03dcc3 100644 --- a/vm-virtio/src/vsock/device.rs +++ b/vm-virtio/src/vsock/device.rs @@ -383,7 +383,7 @@ pub struct Vsock { acked_features: u64, queue_evts: Option>, interrupt_cb: Option>, - epoll_thread: Option>>, + epoll_thread: Option>>>, paused: Arc, } @@ -554,15 +554,18 @@ where }; let paused = self.paused.clone(); + let mut epoll_threads = Vec::new(); thread::Builder::new() .name("virtio_vsock".to_string()) .spawn(move || handler.run(paused)) - .map(|thread| self.epoll_thread = Some(thread)) + .map(|thread| epoll_threads.push(thread)) .map_err(|e| { error!("failed to clone the vsock epoll thread: {}", e); ActivateError::BadActivate })?; + self.epoll_thread = Some(epoll_threads); + Ok(()) }