1 // Copyright 2021 The ChromiumOS Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 use data_model::Le32; 6 use virtio_sys::virtio_fs::virtio_fs_config; 7 use vmm_vhost::message::VhostUserProtocolFeatures; 8 use zerocopy::AsBytes; 9 10 use crate::virtio::device_constants::fs::FS_MAX_TAG_LEN; 11 use crate::virtio::device_constants::fs::QUEUE_SIZE; 12 use crate::virtio::vhost::user::vmm::Connection; 13 use crate::virtio::vhost::user::vmm::Error; 14 use crate::virtio::vhost::user::vmm::QueueSizes; 15 use crate::virtio::vhost::user::vmm::Result; 16 use crate::virtio::vhost::user::vmm::VhostUserVirtioDevice; 17 use crate::virtio::DeviceType; 18 19 impl VhostUserVirtioDevice { new_fs( base_features: u64, connection: Connection, tag: &str, ) -> Result<VhostUserVirtioDevice>20 pub fn new_fs( 21 base_features: u64, 22 connection: Connection, 23 tag: &str, 24 ) -> Result<VhostUserVirtioDevice> { 25 if tag.len() > FS_MAX_TAG_LEN { 26 return Err(Error::TagTooLong { 27 len: tag.len(), 28 max: FS_MAX_TAG_LEN, 29 }); 30 } 31 32 // The spec requires a minimum of 2 queues: one worker queue and one high priority queue 33 let default_queues = 2; 34 35 let mut cfg_tag = [0u8; FS_MAX_TAG_LEN]; 36 cfg_tag[..tag.len()].copy_from_slice(tag.as_bytes()); 37 38 let cfg = virtio_fs_config { 39 tag: cfg_tag, 40 // Only count the worker queues, exclude the high prio queue 41 num_request_queues: Le32::from(default_queues - 1), 42 }; 43 44 let queue_sizes = QueueSizes::AskDevice { 45 queue_size: QUEUE_SIZE, 46 default_queues: default_queues as usize, 47 }; 48 let max_queues = 2; 49 50 let allow_features = 0; 51 52 let allow_protocol_features = 53 VhostUserProtocolFeatures::MQ | VhostUserProtocolFeatures::CONFIG; 54 55 VhostUserVirtioDevice::new( 56 connection, 57 DeviceType::Fs, 58 queue_sizes, 59 max_queues, 60 allow_features, 61 allow_protocol_features, 62 base_features, 63 Some(cfg.as_bytes()), 64 false, 65 ) 66 } 67 } 68