From 9ffead8ee94a8ea201a022e4d00148a9f887145b Mon Sep 17 00:00:00 2001 From: Patrick Roy Date: Mon, 24 Mar 2025 15:34:38 +0000 Subject: [PATCH] refactor: don't duplicate VIRTIO_F_* constants in generated modules Add a dedicated virtio_config.rs module that is bindgen'd from virtio_config.h and contains exactly the VIRTIO_F constants. This avoid the VIRTIO_F constants being redefined across bindgen'd modules for the block, net and rng devices (or in the case of the balloon device, avoids one device using another's bindgen module). Since this completely eliminates all contents from virtio_rng.rs, delete that module. Note that for some reason, my laptop's virtio_config.h was missing half the constants, despite upstream 6.8 headers containing them. So I bindgen'd this file on a .metal where all the constants were present in the header. Lastly, there's the question of the vsock modules, which has manually written bindings in the uapi module, contained in `vsock/mod.rs`. I tried autogenerating these, but bindgen chokes on the enum-constants contained in virtio_vsock.h, so I'm leaving that as-is for now, apart from deduplicating the VIRTIO_F_* constants. Signed-off-by: Patrick Roy --- src/vmm/src/devices/virtio/balloon/device.rs | 2 +- .../src/devices/virtio/block/vhost_user/device.rs | 5 ++--- src/vmm/src/devices/virtio/block/virtio/device.rs | 3 ++- src/vmm/src/devices/virtio/generated/mod.rs | 2 +- src/vmm/src/devices/virtio/generated/virtio_blk.rs | 13 ------------- .../generated/{virtio_rng.rs => virtio_config.rs} | 0 src/vmm/src/devices/virtio/generated/virtio_net.rs | 13 ------------- src/vmm/src/devices/virtio/net/device.rs | 2 +- src/vmm/src/devices/virtio/rng/device.rs | 2 +- src/vmm/src/devices/virtio/vsock/device.rs | 3 ++- src/vmm/src/devices/virtio/vsock/mod.rs | 9 --------- tools/bindgen.sh | 13 +++++-------- 12 files changed, 15 insertions(+), 52 deletions(-) rename src/vmm/src/devices/virtio/generated/{virtio_rng.rs => virtio_config.rs} (100%) diff --git a/src/vmm/src/devices/virtio/balloon/device.rs b/src/vmm/src/devices/virtio/balloon/device.rs index 9205808a7fd..186f09275bc 100644 --- a/src/vmm/src/devices/virtio/balloon/device.rs +++ b/src/vmm/src/devices/virtio/balloon/device.rs @@ -25,7 +25,7 @@ use super::{ }; use crate::devices::virtio::balloon::BalloonError; use crate::devices::virtio::device::{IrqTrigger, IrqType}; -use crate::devices::virtio::generated::virtio_blk::VIRTIO_F_VERSION_1; +use crate::devices::virtio::generated::virtio_config::VIRTIO_F_VERSION_1; use crate::logger::IncMetric; use crate::utils::u64_to_usize; use crate::vstate::memory::{Address, ByteValued, Bytes, GuestAddress, GuestMemoryMmap}; diff --git a/src/vmm/src/devices/virtio/block/vhost_user/device.rs b/src/vmm/src/devices/virtio/block/vhost_user/device.rs index 34948035c6b..c9907744080 100644 --- a/src/vmm/src/devices/virtio/block/vhost_user/device.rs +++ b/src/vmm/src/devices/virtio/block/vhost_user/device.rs @@ -15,9 +15,8 @@ use vmm_sys_util::eventfd::EventFd; use super::{NUM_QUEUES, QUEUE_SIZE, VhostUserBlockError}; use crate::devices::virtio::block::CacheType; use crate::devices::virtio::device::{DeviceState, IrqTrigger, IrqType, VirtioDevice}; -use crate::devices::virtio::generated::virtio_blk::{ - VIRTIO_BLK_F_FLUSH, VIRTIO_BLK_F_RO, VIRTIO_F_VERSION_1, -}; +use crate::devices::virtio::generated::virtio_blk::{VIRTIO_BLK_F_FLUSH, VIRTIO_BLK_F_RO}; +use crate::devices::virtio::generated::virtio_config::VIRTIO_F_VERSION_1; use crate::devices::virtio::generated::virtio_ring::VIRTIO_RING_F_EVENT_IDX; use crate::devices::virtio::queue::Queue; use crate::devices::virtio::vhost_user::{VhostUserHandleBackend, VhostUserHandleImpl}; diff --git a/src/vmm/src/devices/virtio/block/virtio/device.rs b/src/vmm/src/devices/virtio/block/virtio/device.rs index bb374bce5b9..e2b134a9f25 100644 --- a/src/vmm/src/devices/virtio/block/virtio/device.rs +++ b/src/vmm/src/devices/virtio/block/virtio/device.rs @@ -25,8 +25,9 @@ use crate::devices::virtio::block::CacheType; use crate::devices::virtio::block::virtio::metrics::{BlockDeviceMetrics, BlockMetricsPerDevice}; use crate::devices::virtio::device::{DeviceState, IrqTrigger, IrqType, VirtioDevice}; use crate::devices::virtio::generated::virtio_blk::{ - VIRTIO_BLK_F_FLUSH, VIRTIO_BLK_F_RO, VIRTIO_BLK_ID_BYTES, VIRTIO_F_VERSION_1, + VIRTIO_BLK_F_FLUSH, VIRTIO_BLK_F_RO, VIRTIO_BLK_ID_BYTES, }; +use crate::devices::virtio::generated::virtio_config::VIRTIO_F_VERSION_1; use crate::devices::virtio::generated::virtio_ring::VIRTIO_RING_F_EVENT_IDX; use crate::devices::virtio::queue::Queue; use crate::devices::virtio::{ActivateError, TYPE_BLOCK}; diff --git a/src/vmm/src/devices/virtio/generated/mod.rs b/src/vmm/src/devices/virtio/generated/mod.rs index b96b3e4efea..ab1a73dae7d 100644 --- a/src/vmm/src/devices/virtio/generated/mod.rs +++ b/src/vmm/src/devices/virtio/generated/mod.rs @@ -11,6 +11,6 @@ #![allow(non_snake_case)] pub mod virtio_blk; +pub mod virtio_config; pub mod virtio_net; pub mod virtio_ring; -pub mod virtio_rng; diff --git a/src/vmm/src/devices/virtio/generated/virtio_blk.rs b/src/vmm/src/devices/virtio/generated/virtio_blk.rs index 635861506cf..624ef389ccd 100644 --- a/src/vmm/src/devices/virtio/generated/virtio_blk.rs +++ b/src/vmm/src/devices/virtio/generated/virtio_blk.rs @@ -15,19 +15,6 @@ unsafe_op_in_unsafe_fn )] -pub const VIRTIO_F_NOTIFY_ON_EMPTY: u32 = 24; -pub const VIRTIO_F_ANY_LAYOUT: u32 = 27; -pub const VIRTIO_F_VERSION_1: u32 = 32; -pub const VIRTIO_F_ACCESS_PLATFORM: u32 = 33; -pub const VIRTIO_F_IOMMU_PLATFORM: u32 = 33; -pub const VIRTIO_F_RING_PACKED: u32 = 34; -pub const VIRTIO_F_IN_ORDER: u32 = 35; -pub const VIRTIO_F_ORDER_PLATFORM: u32 = 36; -pub const VIRTIO_F_SR_IOV: u32 = 37; -pub const VIRTIO_F_NOTIFICATION_DATA: u32 = 38; -pub const VIRTIO_F_NOTIF_CONFIG_DATA: u32 = 39; -pub const VIRTIO_F_RING_RESET: u32 = 40; -pub const VIRTIO_F_ADMIN_VQ: u32 = 41; pub const VIRTIO_BLK_F_SIZE_MAX: u32 = 1; pub const VIRTIO_BLK_F_SEG_MAX: u32 = 2; pub const VIRTIO_BLK_F_GEOMETRY: u32 = 4; diff --git a/src/vmm/src/devices/virtio/generated/virtio_rng.rs b/src/vmm/src/devices/virtio/generated/virtio_config.rs similarity index 100% rename from src/vmm/src/devices/virtio/generated/virtio_rng.rs rename to src/vmm/src/devices/virtio/generated/virtio_config.rs diff --git a/src/vmm/src/devices/virtio/generated/virtio_net.rs b/src/vmm/src/devices/virtio/generated/virtio_net.rs index 839cbd8b782..6d5adaac8f6 100644 --- a/src/vmm/src/devices/virtio/generated/virtio_net.rs +++ b/src/vmm/src/devices/virtio/generated/virtio_net.rs @@ -15,19 +15,6 @@ unsafe_op_in_unsafe_fn )] -pub const VIRTIO_F_NOTIFY_ON_EMPTY: u32 = 24; -pub const VIRTIO_F_ANY_LAYOUT: u32 = 27; -pub const VIRTIO_F_VERSION_1: u32 = 32; -pub const VIRTIO_F_ACCESS_PLATFORM: u32 = 33; -pub const VIRTIO_F_IOMMU_PLATFORM: u32 = 33; -pub const VIRTIO_F_RING_PACKED: u32 = 34; -pub const VIRTIO_F_IN_ORDER: u32 = 35; -pub const VIRTIO_F_ORDER_PLATFORM: u32 = 36; -pub const VIRTIO_F_SR_IOV: u32 = 37; -pub const VIRTIO_F_NOTIFICATION_DATA: u32 = 38; -pub const VIRTIO_F_NOTIF_CONFIG_DATA: u32 = 39; -pub const VIRTIO_F_RING_RESET: u32 = 40; -pub const VIRTIO_F_ADMIN_VQ: u32 = 41; pub const VIRTIO_NET_F_CSUM: u32 = 0; pub const VIRTIO_NET_F_GUEST_CSUM: u32 = 1; pub const VIRTIO_NET_F_CTRL_GUEST_OFFLOADS: u32 = 2; diff --git a/src/vmm/src/devices/virtio/net/device.rs b/src/vmm/src/devices/virtio/net/device.rs index 38f6f7ee147..fff04d1da1a 100755 --- a/src/vmm/src/devices/virtio/net/device.rs +++ b/src/vmm/src/devices/virtio/net/device.rs @@ -16,7 +16,7 @@ use vmm_sys_util::eventfd::EventFd; use super::NET_QUEUE_MAX_SIZE; use crate::devices::virtio::device::{DeviceState, IrqTrigger, IrqType, VirtioDevice}; -use crate::devices::virtio::generated::virtio_blk::VIRTIO_F_VERSION_1; +use crate::devices::virtio::generated::virtio_config::VIRTIO_F_VERSION_1; use crate::devices::virtio::generated::virtio_net::{ VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, VIRTIO_NET_F_GUEST_UFO, VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_TSO6, VIRTIO_NET_F_HOST_UFO, diff --git a/src/vmm/src/devices/virtio/rng/device.rs b/src/vmm/src/devices/virtio/rng/device.rs index 9c9021b66d9..97ac8676e0a 100644 --- a/src/vmm/src/devices/virtio/rng/device.rs +++ b/src/vmm/src/devices/virtio/rng/device.rs @@ -13,7 +13,7 @@ use super::metrics::METRICS; use super::{RNG_NUM_QUEUES, RNG_QUEUE}; use crate::devices::DeviceError; use crate::devices::virtio::device::{DeviceState, IrqTrigger, IrqType, VirtioDevice}; -use crate::devices::virtio::generated::virtio_rng::VIRTIO_F_VERSION_1; +use crate::devices::virtio::generated::virtio_config::VIRTIO_F_VERSION_1; use crate::devices::virtio::iov_deque::IovDequeError; use crate::devices::virtio::iovec::IoVecBufferMut; use crate::devices::virtio::queue::{FIRECRACKER_MAX_QUEUE_SIZE, Queue}; diff --git a/src/vmm/src/devices/virtio/vsock/device.rs b/src/vmm/src/devices/virtio/vsock/device.rs index 4626484ab2a..aa114f6cccb 100644 --- a/src/vmm/src/devices/virtio/vsock/device.rs +++ b/src/vmm/src/devices/virtio/vsock/device.rs @@ -31,6 +31,7 @@ use super::packet::{VSOCK_PKT_HDR_SIZE, VsockPacketRx, VsockPacketTx}; use super::{VsockBackend, defs}; use crate::devices::virtio::ActivateError; use crate::devices::virtio::device::{DeviceState, IrqTrigger, IrqType, VirtioDevice}; +use crate::devices::virtio::generated::virtio_config::{VIRTIO_F_IN_ORDER, VIRTIO_F_VERSION_1}; use crate::devices::virtio::queue::Queue as VirtQueue; use crate::devices::virtio::vsock::VsockError; use crate::devices::virtio::vsock::metrics::METRICS; @@ -49,7 +50,7 @@ pub(crate) const VIRTIO_VSOCK_EVENT_TRANSPORT_RESET: u32 = 0; /// - VIRTIO_F_IN_ORDER: the device returns used buffers in the same order that the driver makes /// them available. pub(crate) const AVAIL_FEATURES: u64 = - (1 << uapi::VIRTIO_F_VERSION_1 as u64) | (1 << uapi::VIRTIO_F_IN_ORDER as u64); + (1 << VIRTIO_F_VERSION_1 as u64) | (1 << VIRTIO_F_IN_ORDER as u64); /// Structure representing the vsock device. #[derive(Debug)] diff --git a/src/vmm/src/devices/virtio/vsock/mod.rs b/src/vmm/src/devices/virtio/vsock/mod.rs index fe338e95763..859e198860b 100644 --- a/src/vmm/src/devices/virtio/vsock/mod.rs +++ b/src/vmm/src/devices/virtio/vsock/mod.rs @@ -57,15 +57,6 @@ mod defs { pub mod uapi { - /// Virtio feature flags. - /// Defined in `/include/uapi/linux/virtio_config.h`. - /// - /// The device processes available buffers in the same order in which the device - /// offers them. - pub const VIRTIO_F_IN_ORDER: usize = 35; - /// The device conforms to the virtio spec version 1.0. - pub const VIRTIO_F_VERSION_1: u32 = 32; - /// Virtio vsock device ID. /// Defined in `include/uapi/linux/virtio_ids.h`. pub const VIRTIO_ID_VSOCK: u32 = 19; diff --git a/tools/bindgen.sh b/tools/bindgen.sh index 872b3427b67..86817a0561f 100755 --- a/tools/bindgen.sh +++ b/tools/bindgen.sh @@ -71,25 +71,22 @@ fc-bindgen \ --allowlist-var "VIRTIO_RING_F_EVENT_IDX" \ "$KERNEL_HEADERS_HOME/include/linux/virtio_ring.h" >src/vmm/src/devices/virtio/generated/virtio_ring.rs +info "BINDGEN virtio_config.h" +fc-bindgen \ + --allowlist-var "VIRTIO_F_.*" \ + "$KERNEL_HEADERS_HOME/include/linux/virtio_config.h" >src/vmm/src/devices/virtio/generated/virtio_config.rs + info "BINDGEN virtio_blk.h" fc-bindgen \ --allowlist-var "VIRTIO_BLK_.*" \ - --allowlist-var "VIRTIO_F_.*" \ "$KERNEL_HEADERS_HOME/include/linux/virtio_blk.h" >src/vmm/src/devices/virtio/generated/virtio_blk.rs info "BINDGEN virtio_net.h" fc-bindgen \ --allowlist-var "VIRTIO_NET_F_.*" \ - --allowlist-var "VIRTIO_F_.*" \ --allowlist-type "virtio_net_hdr_v1" \ "$KERNEL_HEADERS_HOME/include/linux/virtio_net.h" >src/vmm/src/devices/virtio/generated/virtio_net.rs -info "BINDGEN virtio_rng.h" -fc-bindgen \ - --allowlist-var "VIRTIO_RNG_.*" \ - --allowlist-var "VIRTIO_F_.*" \ - "$KERNEL_HEADERS_HOME/include/linux/virtio_rng.h" >src/vmm/src/devices/virtio/generated/virtio_rng.rs - info "BINDGEN prctl.h" fc-bindgen \ --allowlist-var "PR_.*" \