vm-virtio, vhost_user_{fs,block,backend}: Move EVENT_IDX handling

Move the method that is used to decide whether the guest should be
signalled into the Queue implementation from vm-virtio. This removes
duplicated code between vhost_user_backend and the vm-virtio block
implementation.

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford
2020-05-20 10:40:54 +01:00
committed by Sebastien Boeuf
parent 8ae7a38da5
commit a813b57f59
5 changed files with 44 additions and 57 deletions

View File

@@ -210,8 +210,6 @@ pub struct Vring {
call: Option<EventFd>,
err: Option<EventFd>,
enabled: bool,
event_idx: bool,
signalled_used: Option<Wrapping<u16>>,
}
impl Vring {
@@ -222,8 +220,6 @@ impl Vring {
call: None,
err: None,
enabled: false,
event_idx: false,
signalled_used: None,
}
}
@@ -231,31 +227,6 @@ impl Vring {
&mut self.queue
}
pub fn set_event_idx(&mut self, enabled: bool) {
/* Also reset the last signalled event */
self.signalled_used = None;
self.event_idx = enabled;
}
pub fn needs_notification(&mut self, mem: &GuestMemoryMmap, used_idx: Wrapping<u16>) -> bool {
if !self.event_idx {
return true;
}
let mut notify = true;
if let Some(old_idx) = self.signalled_used {
if let Some(used_event) = self.mut_queue().get_used_event(&mem) {
if (used_idx - used_event - Wrapping(1u16)) >= (used_idx - old_idx) {
notify = false;
}
}
}
self.signalled_used = Some(used_idx);
notify
}
pub fn signal_used_queue(&mut self) -> result::Result<(), io::Error> {
if let Some(call) = self.call.as_ref() {
call.write(1)
@@ -724,6 +695,7 @@ impl<S: VhostUserBackend> VhostUserSlaveReqHandler for VhostUserHandler<S> {
self.vrings[index as usize]
.write()
.unwrap()
.mut_queue()
.set_event_idx(event_idx);
self.backend.write().unwrap().set_event_idx(event_idx);
Ok(())