• 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 vmm_vhost::message::VhostUserProtocolFeatures;
6 
7 use crate::virtio::block::asynchronous::DEFAULT_NUM_QUEUES;
8 use crate::virtio::device_constants::block::VIRTIO_BLK_F_BLK_SIZE;
9 use crate::virtio::device_constants::block::VIRTIO_BLK_F_DISCARD;
10 use crate::virtio::device_constants::block::VIRTIO_BLK_F_FLUSH;
11 use crate::virtio::device_constants::block::VIRTIO_BLK_F_MQ;
12 use crate::virtio::device_constants::block::VIRTIO_BLK_F_RO;
13 use crate::virtio::device_constants::block::VIRTIO_BLK_F_SEG_MAX;
14 use crate::virtio::device_constants::block::VIRTIO_BLK_F_WRITE_ZEROES;
15 use crate::virtio::vhost::user::vmm::Connection;
16 use crate::virtio::vhost::user::vmm::QueueSizes;
17 use crate::virtio::vhost::user::vmm::Result;
18 use crate::virtio::vhost::user::vmm::VhostUserVirtioDevice;
19 use crate::virtio::DeviceType;
20 
21 const QUEUE_SIZE: u16 = 256;
22 
23 impl VhostUserVirtioDevice {
new_block(base_features: u64, connection: Connection) -> Result<VhostUserVirtioDevice>24     pub fn new_block(base_features: u64, connection: Connection) -> Result<VhostUserVirtioDevice> {
25         let queue_sizes = QueueSizes::AskDevice {
26             queue_size: QUEUE_SIZE,
27             default_queues: 1,
28         };
29         let max_queues = DEFAULT_NUM_QUEUES.into();
30 
31         let allow_features = 1 << VIRTIO_BLK_F_SEG_MAX
32             | 1 << VIRTIO_BLK_F_RO
33             | 1 << VIRTIO_BLK_F_BLK_SIZE
34             | 1 << VIRTIO_BLK_F_FLUSH
35             | 1 << VIRTIO_BLK_F_MQ
36             | 1 << VIRTIO_BLK_F_DISCARD
37             | 1 << VIRTIO_BLK_F_WRITE_ZEROES;
38 
39         let allow_protocol_features = VhostUserProtocolFeatures::CONFIG
40             | VhostUserProtocolFeatures::MQ
41             | VhostUserProtocolFeatures::SLAVE_REQ;
42 
43         VhostUserVirtioDevice::new(
44             connection,
45             DeviceType::Block,
46             queue_sizes,
47             max_queues,
48             allow_features,
49             allow_protocol_features,
50             base_features,
51             None,
52             false,
53         )
54     }
55 }
56