mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2025-02-21 19:02:30 +00:00
vhost_user_backend: call get_used_event from needs_notification
This change, combined with the compiler hint to inline get_used_event, shortens the window between the memory read and the actual check by calling get_used_event from needs_notification. Without it, when putting enough pressure on the vring, it's possible that a notification is wrongly omitted, causing the queue to stall. Signed-off-by: Sergio Lopez <slp@redhat.com>
This commit is contained in:
parent
536323d9fb
commit
3957d1ee27
@ -126,8 +126,7 @@ impl<F: FileSystem + Send + Sync + 'static> VhostUserFsBackend<F> {
|
||||
.map_err(Error::ProcessQueue)?;
|
||||
if self.event_idx {
|
||||
if let Some(used_idx) = vring.mut_queue().add_used(mem, head_index, 0) {
|
||||
let used_event = vring.mut_queue().get_used_event(mem);
|
||||
if vring.needs_notification(Wrapping(used_idx), used_event) {
|
||||
if vring.needs_notification(&mem, Wrapping(used_idx)) {
|
||||
vring.signal_used_queue().map_err(Error::SignalQueue)?;
|
||||
}
|
||||
used_any = true;
|
||||
|
@ -235,11 +235,7 @@ impl Vring {
|
||||
self.event_idx = enabled;
|
||||
}
|
||||
|
||||
pub fn needs_notification(
|
||||
&mut self,
|
||||
used_idx: Wrapping<u16>,
|
||||
used_event: Option<Wrapping<u16>>,
|
||||
) -> bool {
|
||||
pub fn needs_notification(&mut self, mem: &GuestMemoryMmap, used_idx: Wrapping<u16>) -> bool {
|
||||
if !self.event_idx {
|
||||
return true;
|
||||
}
|
||||
@ -247,7 +243,7 @@ impl Vring {
|
||||
let mut notify = true;
|
||||
|
||||
if let Some(old_idx) = self.signalled_used {
|
||||
if let Some(used_event) = used_event {
|
||||
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;
|
||||
}
|
||||
|
@ -197,8 +197,7 @@ impl VhostUserBlkBackend {
|
||||
|
||||
if self.event_idx {
|
||||
if let Some(used_idx) = vring.mut_queue().add_used(mem, head.index, len) {
|
||||
let used_event = vring.mut_queue().get_used_event(mem);
|
||||
if vring.needs_notification(Wrapping(used_idx), used_event) {
|
||||
if vring.needs_notification(&mem, Wrapping(used_idx)) {
|
||||
debug!("signalling queue");
|
||||
vring.signal_used_queue().unwrap();
|
||||
} else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user