virtio-devices: vdpa: Simplify vring enabling

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
Sebastien Boeuf 2022-10-12 10:54:45 +02:00
parent 22be5f9d0f
commit 02f951a9c3

View File

@ -9,6 +9,7 @@ use crate::{
VIRTIO_F_IOMMU_PLATFORM, VIRTIO_F_IOMMU_PLATFORM,
}; };
use std::{ use std::{
collections::BTreeMap,
io, result, io, result,
sync::{atomic::Ordering, Arc, Mutex}, sync::{atomic::Ordering, Arc, Mutex},
}; };
@ -86,7 +87,7 @@ pub struct Vdpa {
id: String, id: String,
vhost: VhostKernVdpa<GuestMemoryAtomic<GuestMemoryMmap>>, vhost: VhostKernVdpa<GuestMemoryAtomic<GuestMemoryMmap>>,
iova_range: VhostVdpaIovaRange, iova_range: VhostVdpaIovaRange,
enabled_num_queues: Option<usize>, enabled_queues: BTreeMap<usize, bool>,
backend_features: u64, backend_features: u64,
} }
@ -124,20 +125,21 @@ impl Vdpa {
id, id,
vhost, vhost,
iova_range, iova_range,
enabled_num_queues: None, enabled_queues: BTreeMap::new(),
backend_features, backend_features,
}) })
} }
fn enable_vrings(&mut self, num_queues: usize, enable: bool) -> Result<()> { fn enable_vrings(&mut self, enable: bool) -> Result<()> {
for queue_index in 0..num_queues { for (queue_index, enabled) in self.enabled_queues.iter_mut() {
self.vhost if *enabled != enable {
.set_vring_enable(queue_index, enable) self.vhost
.map_err(Error::SetVringEnable)?; .set_vring_enable(*queue_index, enable)
.map_err(Error::SetVringEnable)?;
*enabled = enable;
}
} }
self.enabled_num_queues = if enable { Some(num_queues) } else { None };
Ok(()) Ok(())
} }
@ -213,7 +215,7 @@ impl Vdpa {
.map_err(Error::SetConfigCall)?; .map_err(Error::SetConfigCall)?;
} }
self.enable_vrings(queues.len(), true)?; self.enable_vrings(true)?;
self.vhost self.vhost
.set_status( .set_status(
@ -223,9 +225,7 @@ impl Vdpa {
} }
fn reset_vdpa(&mut self) -> Result<()> { fn reset_vdpa(&mut self) -> Result<()> {
if let Some(num_queues) = self.enabled_num_queues { self.enable_vrings(false)?;
self.enable_vrings(num_queues, false)?;
}
self.vhost.set_status(0).map_err(Error::SetStatus) self.vhost.set_status(0).map_err(Error::SetStatus)
} }