virtio-devices: balloon: Port to VirtioCommon for feature handling

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford
2020-09-03 10:37:36 +01:00
committed by Sebastien Boeuf
parent dc9f1e4cdf
commit 4bb00224b4
+8 -16
View File
@@ -14,7 +14,7 @@
use super::{ use super::{
ActivateError, ActivateResult, EpollHelper, EpollHelperError, EpollHelperHandler, Queue, ActivateError, ActivateResult, EpollHelper, EpollHelperError, EpollHelperHandler, Queue,
VirtioDevice, VirtioDeviceType, EPOLL_HELPER_EVENT_LAST, VIRTIO_F_VERSION_1, VirtioCommon, VirtioDevice, VirtioDeviceType, EPOLL_HELPER_EVENT_LAST, VIRTIO_F_VERSION_1,
}; };
use crate::seccomp_filters::{get_seccomp_filter, Thread}; use crate::seccomp_filters::{get_seccomp_filter, Thread};
use crate::vm_memory::GuestMemory; use crate::vm_memory::GuestMemory;
@@ -308,12 +308,11 @@ impl EpollHelperHandler for BalloonEpollHandler {
// Virtio device for exposing entropy to the guest OS through virtio. // Virtio device for exposing entropy to the guest OS through virtio.
pub struct Balloon { pub struct Balloon {
common: VirtioCommon,
id: String, id: String,
resize: VirtioBalloonResize, resize: VirtioBalloonResize,
kill_evt: Option<EventFd>, kill_evt: Option<EventFd>,
pause_evt: Option<EventFd>, pause_evt: Option<EventFd>,
avail_features: u64,
pub acked_features: u64,
config: Arc<Mutex<VirtioBalloonConfig>>, config: Arc<Mutex<VirtioBalloonConfig>>,
queue_evts: Option<Vec<EventFd>>, queue_evts: Option<Vec<EventFd>>,
interrupt_cb: Option<Arc<dyn VirtioInterrupt>>, interrupt_cb: Option<Arc<dyn VirtioInterrupt>>,
@@ -332,12 +331,14 @@ impl Balloon {
config.num_pages = (size >> PAGE_SHIFT) as u32; config.num_pages = (size >> PAGE_SHIFT) as u32;
Ok(Balloon { Ok(Balloon {
common: VirtioCommon {
avail_features,
acked_features: 0u64,
},
id, id,
resize: VirtioBalloonResize::new()?, resize: VirtioBalloonResize::new()?,
kill_evt: None, kill_evt: None,
pause_evt: None, pause_evt: None,
avail_features,
acked_features: 0u64,
config: Arc::new(Mutex::new(config)), config: Arc::new(Mutex::new(config)),
queue_evts: None, queue_evts: None,
interrupt_cb: None, interrupt_cb: None,
@@ -372,20 +373,11 @@ impl VirtioDevice for Balloon {
} }
fn features(&self) -> u64 { fn features(&self) -> u64 {
self.avail_features self.common.avail_features
} }
fn ack_features(&mut self, value: u64) { fn ack_features(&mut self, value: u64) {
let mut v = value; self.common.ack_features(value)
// Check if the guest is ACK'ing a feature that we didn't claim to have.
let unrequested_features = v & !self.avail_features;
if unrequested_features != 0 {
warn!("Received acknowledge request for unknown feature.");
// Don't count these features as acked.
v &= !unrequested_features;
}
self.acked_features |= v;
} }
fn read_config(&self, offset: u64, data: &mut [u8]) { fn read_config(&self, offset: u64, data: &mut [u8]) {