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