Rename the methods in the interface of VirtioTransport

This commit is contained in:
Cautreoxit
2024-11-14 21:05:38 +08:00
committed by Tate, Hongliang Tian
parent 300403e3eb
commit 3cb7f5b721
6 changed files with 23 additions and 20 deletions

View File

@ -410,7 +410,7 @@ impl DeviceInner {
/// Flushes any cached data from the guest to the persistent storage on the host. /// Flushes any cached data from the guest to the persistent storage on the host.
/// This will be ignored if the device doesn't support the `VIRTIO_BLK_F_FLUSH` feature. /// This will be ignored if the device doesn't support the `VIRTIO_BLK_F_FLUSH` feature.
fn flush(&self, bio_request: BioRequest) { fn flush(&self, bio_request: BioRequest) {
if self.transport.lock().device_features() & BlockFeatures::FLUSH.bits() == 0 { if self.transport.lock().read_device_features() & BlockFeatures::FLUSH.bits() == 0 {
bio_request.bios().for_each(|bio| { bio_request.bios().for_each(|bio| {
bio.complete(BioStatus::Complete); bio.complete(BioStatus::Complete);
}); });

View File

@ -51,7 +51,7 @@ impl NetworkDevice {
pub fn init(mut transport: Box<dyn VirtioTransport>) -> Result<(), VirtioDeviceError> { pub fn init(mut transport: Box<dyn VirtioTransport>) -> Result<(), VirtioDeviceError> {
let virtio_net_config = VirtioNetConfig::new(transport.as_mut()); let virtio_net_config = VirtioNetConfig::new(transport.as_mut());
let features = NetworkFeatures::from_bits_truncate(Self::negotiate_features( let features = NetworkFeatures::from_bits_truncate(Self::negotiate_features(
transport.device_features(), transport.read_device_features(),
)); ));
debug!("virtio_net_config = {:?}", virtio_net_config); debug!("virtio_net_config = {:?}", virtio_net_config);
debug!("features = {:?}", features); debug!("features = {:?}", features);

View File

@ -40,17 +40,19 @@ fn virtio_component_init() -> Result<(), ComponentInitError> {
socket::init(); socket::init();
while let Some(mut transport) = pop_device_transport() { while let Some(mut transport) = pop_device_transport() {
// Reset device // Reset device
transport.set_device_status(DeviceStatus::empty()).unwrap(); transport
.write_device_status(DeviceStatus::empty())
.unwrap();
// Set to acknowledge // Set to acknowledge
transport transport
.set_device_status(DeviceStatus::ACKNOWLEDGE | DeviceStatus::DRIVER) .write_device_status(DeviceStatus::ACKNOWLEDGE | DeviceStatus::DRIVER)
.unwrap(); .unwrap();
// negotiate features // negotiate features
negotiate_features(&mut transport); negotiate_features(&mut transport);
// change to features ok status // change to features ok status
transport transport
.set_device_status( .write_device_status(
DeviceStatus::ACKNOWLEDGE | DeviceStatus::DRIVER | DeviceStatus::FEATURES_OK, DeviceStatus::ACKNOWLEDGE | DeviceStatus::DRIVER | DeviceStatus::FEATURES_OK,
) )
.unwrap(); .unwrap();
@ -87,7 +89,7 @@ fn pop_device_transport() -> Option<Box<dyn VirtioTransport>> {
} }
fn negotiate_features(transport: &mut Box<dyn VirtioTransport>) { fn negotiate_features(transport: &mut Box<dyn VirtioTransport>) {
let features = transport.device_features(); let features = transport.read_device_features();
let mask = ((1u64 << 24) - 1) | (((1u64 << 24) - 1) << 50); let mask = ((1u64 << 24) - 1) | (((1u64 << 24) - 1) << 50);
let device_specified_features = features & mask; let device_specified_features = features & mask;
let device_support_features = match transport.device_type() { let device_support_features = match transport.device_type() {
@ -101,7 +103,7 @@ fn negotiate_features(transport: &mut Box<dyn VirtioTransport>) {
let mut support_feature = Feature::from_bits_truncate(features); let mut support_feature = Feature::from_bits_truncate(features);
support_feature.remove(Feature::RING_EVENT_IDX); support_feature.remove(Feature::RING_EVENT_IDX);
transport transport
.set_driver_features(features & (support_feature.bits | device_support_features)) .write_driver_features(features & (support_feature.bits | device_support_features))
.unwrap(); .unwrap();
} }

View File

@ -201,7 +201,7 @@ impl VirtioTransport for VirtioMmioTransport {
self.common_device.io_mem().slice(0x100..0x200) self.common_device.io_mem().slice(0x100..0x200)
} }
fn device_features(&self) -> u64 { fn read_device_features(&self) -> u64 {
// select low // select low
field_ptr!(&self.layout, VirtioMmioLayout, device_features_select) field_ptr!(&self.layout, VirtioMmioLayout, device_features_select)
.write_once(&0u32) .write_once(&0u32)
@ -219,7 +219,7 @@ impl VirtioTransport for VirtioMmioTransport {
device_feature_high << 32 | device_feature_low as u64 device_feature_high << 32 | device_feature_low as u64
} }
fn set_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError> { fn write_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError> {
let low = features as u32; let low = features as u32;
let high = (features >> 32) as u32; let high = (features >> 32) as u32;
field_ptr!(&self.layout, VirtioMmioLayout, driver_features_select) field_ptr!(&self.layout, VirtioMmioLayout, driver_features_select)
@ -237,7 +237,7 @@ impl VirtioTransport for VirtioMmioTransport {
Ok(()) Ok(())
} }
fn device_status(&self) -> DeviceStatus { fn read_device_status(&self) -> DeviceStatus {
DeviceStatus::from_bits( DeviceStatus::from_bits(
field_ptr!(&self.layout, VirtioMmioLayout, status) field_ptr!(&self.layout, VirtioMmioLayout, status)
.read_once() .read_once()
@ -246,7 +246,7 @@ impl VirtioTransport for VirtioMmioTransport {
.unwrap() .unwrap()
} }
fn set_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError> { fn write_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError> {
field_ptr!(&self.layout, VirtioMmioLayout, status) field_ptr!(&self.layout, VirtioMmioLayout, status)
.write_once(&(status.bits() as u32)) .write_once(&(status.bits() as u32))
.unwrap(); .unwrap();

View File

@ -24,23 +24,24 @@ pub mod pci;
pub trait VirtioTransport: Sync + Send + Debug { pub trait VirtioTransport: Sync + Send + Debug {
// ====================Device related APIs======================= // ====================Device related APIs=======================
/// Get device type.
fn device_type(&self) -> VirtioDeviceType; fn device_type(&self) -> VirtioDeviceType;
/// Get device features. /// Get device features.
fn device_features(&self) -> u64; fn read_device_features(&self) -> u64;
/// Set driver features. /// Set driver features.
fn set_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError>; fn write_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError>;
/// Get device status. /// Get device status.
fn device_status(&self) -> DeviceStatus; fn read_device_status(&self) -> DeviceStatus;
/// Set device status. /// Set device status.
fn set_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError>; fn write_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError>;
// Set to driver ok status // Set to driver ok status
fn finish_init(&mut self) { fn finish_init(&mut self) {
self.set_device_status( self.write_device_status(
DeviceStatus::ACKNOWLEDGE DeviceStatus::ACKNOWLEDGE
| DeviceStatus::DRIVER | DeviceStatus::DRIVER
| DeviceStatus::FEATURES_OK | DeviceStatus::FEATURES_OK

View File

@ -132,7 +132,7 @@ impl VirtioTransport for VirtioPciTransport {
memory.slice(offset..offset + length) memory.slice(offset..offset + length)
} }
fn device_features(&self) -> u64 { fn read_device_features(&self) -> u64 {
// select low // select low
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_feature_select) field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_feature_select)
.write_once(&0u32) .write_once(&0u32)
@ -150,7 +150,7 @@ impl VirtioTransport for VirtioPciTransport {
device_feature_high << 32 | device_feature_low as u64 device_feature_high << 32 | device_feature_low as u64
} }
fn set_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError> { fn write_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError> {
let low = features as u32; let low = features as u32;
let high = (features >> 32) as u32; let high = (features >> 32) as u32;
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, driver_feature_select) field_ptr!(&self.common_cfg, VirtioPciCommonCfg, driver_feature_select)
@ -168,14 +168,14 @@ impl VirtioTransport for VirtioPciTransport {
Ok(()) Ok(())
} }
fn device_status(&self) -> DeviceStatus { fn read_device_status(&self) -> DeviceStatus {
let status = field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_status) let status = field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_status)
.read_once() .read_once()
.unwrap(); .unwrap();
DeviceStatus::from_bits(status).unwrap() DeviceStatus::from_bits(status).unwrap()
} }
fn set_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError> { fn write_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError> {
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_status) field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_status)
.write_once(&(status.bits())) .write_once(&(status.bits()))
.unwrap(); .unwrap();