mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2025-01-18 18:45:19 +00:00
vhost_user_backend: Allow for one exit_event per thread
By adding the "thread_index" parameter to the function exit_event() from the VhostUserBackend trait, the backend crate now has the ability to ask the backend implementation about the exit event related to a specific thread. Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
parent
b927dceed8
commit
cfffb7edb0
@ -266,7 +266,7 @@ impl<F: FileSystem + Send + Sync + 'static> VhostUserBackend for VhostUserFsBack
|
|||||||
Ok(false)
|
Ok(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exit_event(&self) -> Option<(EventFd, Option<u16>)> {
|
fn exit_event(&self, _thread_index: usize) -> Option<(EventFd, Option<u16>)> {
|
||||||
Some((
|
Some((
|
||||||
self.thread.lock().unwrap().kill_evt.try_clone().unwrap(),
|
self.thread.lock().unwrap().kill_evt.try_clone().unwrap(),
|
||||||
Some(KILL_EVENT),
|
Some(KILL_EVENT),
|
||||||
|
@ -105,7 +105,7 @@ pub trait VhostUserBackend: Send + Sync + 'static {
|
|||||||
/// When this EventFd is written to the worker thread will exit. An optional id may
|
/// When this EventFd is written to the worker thread will exit. An optional id may
|
||||||
/// also be provided, if it not provided then the exit event will be first event id
|
/// also be provided, if it not provided then the exit event will be first event id
|
||||||
/// after the last queue
|
/// after the last queue
|
||||||
fn exit_event(&self) -> Option<(EventFd, Option<u16>)> {
|
fn exit_event(&self, _thread_index: usize) -> Option<(EventFd, Option<u16>)> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -484,7 +484,7 @@ impl<S: VhostUserBackend> VhostUserHandler<S> {
|
|||||||
|
|
||||||
let mut workers = Vec::new();
|
let mut workers = Vec::new();
|
||||||
let mut worker_threads = Vec::new();
|
let mut worker_threads = Vec::new();
|
||||||
for queues_mask in queues_per_thread.iter() {
|
for (thread_index, queues_mask) in queues_per_thread.iter().enumerate() {
|
||||||
// Create the epoll file descriptor
|
// Create the epoll file descriptor
|
||||||
let epoll_fd = epoll::create(true).map_err(VhostUserHandlerError::EpollCreateFd)?;
|
let epoll_fd = epoll::create(true).map_err(VhostUserHandlerError::EpollCreateFd)?;
|
||||||
|
|
||||||
@ -492,7 +492,7 @@ impl<S: VhostUserBackend> VhostUserHandler<S> {
|
|||||||
let worker = vring_worker.clone();
|
let worker = vring_worker.clone();
|
||||||
|
|
||||||
let exit_event_id = if let Some((exit_event_fd, exit_event_id)) =
|
let exit_event_id = if let Some((exit_event_fd, exit_event_id)) =
|
||||||
backend.read().unwrap().exit_event()
|
backend.read().unwrap().exit_event(thread_index)
|
||||||
{
|
{
|
||||||
let exit_event_id = exit_event_id.unwrap_or(num_queues as u16);
|
let exit_event_id = exit_event_id.unwrap_or(num_queues as u16);
|
||||||
worker
|
worker
|
||||||
|
@ -342,7 +342,7 @@ impl VhostUserBackend for VhostUserBlkBackend {
|
|||||||
buf.to_vec()
|
buf.to_vec()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exit_event(&self) -> Option<(EventFd, Option<u16>)> {
|
fn exit_event(&self, _thread_index: usize) -> Option<(EventFd, Option<u16>)> {
|
||||||
Some((
|
Some((
|
||||||
self.thread.lock().unwrap().kill_evt.try_clone().unwrap(),
|
self.thread.lock().unwrap().kill_evt.try_clone().unwrap(),
|
||||||
None,
|
None,
|
||||||
|
@ -337,17 +337,17 @@ impl VhostUserBackend for VhostUserNetBackend {
|
|||||||
Ok(false)
|
Ok(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exit_event(&self) -> Option<(EventFd, Option<u16>)> {
|
fn exit_event(&self, thread_index: usize) -> Option<(EventFd, Option<u16>)> {
|
||||||
let tap_end_index = (self.num_queues + self.num_queues / 2 - 1) as u16;
|
// The exit event is placed after the queues and the tap event, which
|
||||||
let kill_index = tap_end_index + 1;
|
// is event index 3.
|
||||||
Some((
|
Some((
|
||||||
self.threads[0]
|
self.threads[thread_index]
|
||||||
.lock()
|
.lock()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.kill_evt
|
.kill_evt
|
||||||
.try_clone()
|
.try_clone()
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
Some(kill_index),
|
Some(3),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user