virtio-devices: vhost-user-block: 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 8c42dd3811
commit edb7ac5922
+11 -16
View File
@@ -1,7 +1,9 @@
// Copyright 2019 Intel Corporation. All Rights Reserved. // Copyright 2019 Intel Corporation. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
use super::super::{ActivateError, ActivateResult, Queue, VirtioDevice, VirtioDeviceType}; use super::super::{
ActivateError, ActivateResult, Queue, VirtioCommon, VirtioDevice, VirtioDeviceType,
};
use super::handler::*; use super::handler::*;
use super::vu_common_ctrl::*; use super::vu_common_ctrl::*;
use super::{Error, Result}; use super::{Error, Result};
@@ -32,12 +34,11 @@ struct SlaveReqHandler {}
impl VhostUserMasterReqHandler for SlaveReqHandler {} impl VhostUserMasterReqHandler for SlaveReqHandler {}
pub struct Blk { pub struct Blk {
common: VirtioCommon,
id: String, id: String,
vhost_user_blk: Master, vhost_user_blk: Master,
kill_evt: Option<EventFd>, kill_evt: Option<EventFd>,
pause_evt: Option<EventFd>, pause_evt: Option<EventFd>,
avail_features: u64,
acked_features: u64,
config: VirtioBlockConfig, config: VirtioBlockConfig,
queue_sizes: Vec<u16>, queue_sizes: Vec<u16>,
queue_evts: Option<Vec<EventFd>>, queue_evts: Option<Vec<EventFd>>,
@@ -138,12 +139,14 @@ impl Blk {
} }
Ok(Blk { Ok(Blk {
common: VirtioCommon {
avail_features,
acked_features,
},
id, id,
vhost_user_blk, vhost_user_blk,
kill_evt: None, kill_evt: None,
pause_evt: None, pause_evt: None,
avail_features,
acked_features,
config, config,
queue_sizes: vec![vu_cfg.queue_size; vu_cfg.num_queues], queue_sizes: vec![vu_cfg.queue_size; vu_cfg.num_queues],
queue_evts: None, queue_evts: None,
@@ -176,19 +179,11 @@ impl VirtioDevice for Blk {
} }
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: {:x}", v);
// 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]) {
@@ -259,7 +254,7 @@ impl VirtioDevice for Blk {
queues, queues,
queue_evts, queue_evts,
&interrupt_cb, &interrupt_cb,
self.acked_features, self.common.acked_features,
) )
.map_err(ActivateError::VhostUserBlkSetup)?; .map_err(ActivateError::VhostUserBlkSetup)?;