mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
virtio-devices: block: Expose device topology
If the disk is backed by a block device on the host a non-default topology will be available and that topology can be advertised by virtio block. Fixes: #3262 Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
committed by
Sebastien Boeuf
parent
3b0d278ba3
commit
4773e23c77
@@ -422,7 +422,9 @@ impl Block {
|
|||||||
|
|
||||||
let mut avail_features = (1u64 << VIRTIO_F_VERSION_1)
|
let mut avail_features = (1u64 << VIRTIO_F_VERSION_1)
|
||||||
| (1u64 << VIRTIO_BLK_F_FLUSH)
|
| (1u64 << VIRTIO_BLK_F_FLUSH)
|
||||||
| (1u64 << VIRTIO_BLK_F_CONFIG_WCE);
|
| (1u64 << VIRTIO_BLK_F_CONFIG_WCE)
|
||||||
|
| (1u64 << VIRTIO_BLK_F_BLK_SIZE)
|
||||||
|
| (1u64 << VIRTIO_BLK_F_TOPOLOGY);
|
||||||
|
|
||||||
if iommu {
|
if iommu {
|
||||||
avail_features |= 1u64 << VIRTIO_F_IOMMU_PLATFORM;
|
avail_features |= 1u64 << VIRTIO_F_IOMMU_PLATFORM;
|
||||||
@@ -432,10 +434,31 @@ impl Block {
|
|||||||
avail_features |= 1u64 << VIRTIO_BLK_F_RO;
|
avail_features |= 1u64 << VIRTIO_BLK_F_RO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let topology = disk_image.topology();
|
||||||
|
info!("Disk topology: {:?}", topology);
|
||||||
|
|
||||||
|
let logical_block_size = if topology.logical_block_size > 512 {
|
||||||
|
topology.logical_block_size
|
||||||
|
} else {
|
||||||
|
512
|
||||||
|
};
|
||||||
|
|
||||||
|
// Calculate the exponent that maps physical block to logical block
|
||||||
|
let mut physical_block_exp = 0;
|
||||||
|
let mut size = logical_block_size;
|
||||||
|
while size < topology.physical_block_size {
|
||||||
|
physical_block_exp += 1;
|
||||||
|
size <<= 1;
|
||||||
|
}
|
||||||
|
|
||||||
let disk_nsectors = disk_size / SECTOR_SIZE;
|
let disk_nsectors = disk_size / SECTOR_SIZE;
|
||||||
let mut config = VirtioBlockConfig {
|
let mut config = VirtioBlockConfig {
|
||||||
capacity: disk_nsectors,
|
capacity: disk_nsectors,
|
||||||
writeback: 1,
|
writeback: 1,
|
||||||
|
blk_size: topology.logical_block_size as u32,
|
||||||
|
physical_block_exp,
|
||||||
|
min_io_size: (topology.minimum_io_size / logical_block_size) as u16,
|
||||||
|
opt_io_size: (topology.optimal_io_size / logical_block_size) as u32,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user