• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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