vmm: config: Put common options in an array

This can then be used with the OptionParser::add_all() API to reduce the
number of locations the same options are added to the parser. The only
quirk is that some devices do not support an IOMMU (because they are
vhost-user / vfio-user based). There are two different versions of the
array to support that.

Signed-off-by: Rob Bradford <rbradford@meta.com>
This commit is contained in:
Rob Bradford
2026-04-04 08:56:49 -07:00
parent dde28dc38a
commit 0c837abff2

View File

@@ -1195,10 +1195,13 @@ impl RateLimiterGroupConfig {
} }
impl PciDeviceCommonConfig { impl PciDeviceCommonConfig {
const OPTIONS: &[&str] = &["id", "pci_segment"];
const OPTIONS_IOMMU: &[&str] = &["id", "iommu", "pci_segment"];
pub fn parse(input: &str) -> Result<Self> { pub fn parse(input: &str) -> Result<Self> {
let mut parser = OptionParser::new(); let mut parser = OptionParser::new();
parser.add("id").add("iommu").add("pci_segment"); parser.add_all(Self::OPTIONS_IOMMU);
parser parser
.parse_subset(input) .parse_subset(input)
@@ -1258,7 +1261,6 @@ impl DiskConfig {
.add("path") .add("path")
.add("readonly") .add("readonly")
.add("direct") .add("direct")
.add("iommu")
.add("queue_size") .add("queue_size")
.add("num_queues") .add("num_queues")
.add("vhost_user") .add("vhost_user")
@@ -1269,17 +1271,16 @@ impl DiskConfig {
.add("ops_size") .add("ops_size")
.add("ops_one_time_burst") .add("ops_one_time_burst")
.add("ops_refill_time") .add("ops_refill_time")
.add("id")
.add("_disable_io_uring") .add("_disable_io_uring")
.add("_disable_aio") .add("_disable_aio")
.add("pci_segment")
.add("serial") .add("serial")
.add("rate_limit_group") .add("rate_limit_group")
.add("queue_affinity") .add("queue_affinity")
.add("backing_files") .add("backing_files")
.add("sparse") .add("sparse")
.add("image_type") .add("image_type")
.add("lock_granularity"); .add("lock_granularity")
.add_all(PciDeviceCommonConfig::OPTIONS_IOMMU);
parser.parse(disk).map_err(Error::ParseDisk)?; parser.parse(disk).map_err(Error::ParseDisk)?;
@@ -1507,13 +1508,11 @@ impl NetConfig {
.add("offload_ufo") .add("offload_ufo")
.add("offload_csum") .add("offload_csum")
.add("mtu") .add("mtu")
.add("iommu")
.add("queue_size") .add("queue_size")
.add("num_queues") .add("num_queues")
.add("vhost_user") .add("vhost_user")
.add("socket") .add("socket")
.add("vhost_mode") .add("vhost_mode")
.add("id")
.add("fd") .add("fd")
.add("bw_size") .add("bw_size")
.add("bw_one_time_burst") .add("bw_one_time_burst")
@@ -1521,7 +1520,7 @@ impl NetConfig {
.add("ops_size") .add("ops_size")
.add("ops_one_time_burst") .add("ops_one_time_burst")
.add("ops_refill_time") .add("ops_refill_time")
.add("pci_segment"); .add_all(PciDeviceCommonConfig::OPTIONS_IOMMU);
parser.parse(net).map_err(Error::ParseNetwork)?; parser.parse(net).map_err(Error::ParseNetwork)?;
let tap = parser.get("tap"); let tap = parser.get("tap");
@@ -1772,8 +1771,7 @@ impl GenericVhostUserConfig {
.add("virtio_id") .add("virtio_id")
.add("queue_sizes") .add("queue_sizes")
.add("socket") .add("socket")
.add("id") .add_all(PciDeviceCommonConfig::OPTIONS);
.add("pci_segment");
parser parser
.parse(vhost_user) .parse(vhost_user)
.map_err(Error::ParseGenericVhostUser)?; .map_err(Error::ParseGenericVhostUser)?;
@@ -1898,8 +1896,7 @@ impl FsConfig {
.add("queue_size") .add("queue_size")
.add("num_queues") .add("num_queues")
.add("socket") .add("socket")
.add("id") .add_all(PciDeviceCommonConfig::OPTIONS);
.add("pci_segment");
parser.parse(fs).map_err(Error::ParseFileSystem)?; parser.parse(fs).map_err(Error::ParseFileSystem)?;
let tag = parser.get("tag").ok_or(Error::ParseFsTagMissing)?; let tag = parser.get("tag").ok_or(Error::ParseFsTagMissing)?;
@@ -2050,10 +2047,8 @@ impl PmemConfig {
parser parser
.add("size") .add("size")
.add("file") .add("file")
.add("iommu")
.add("discard_writes") .add("discard_writes")
.add("id") .add_all(PciDeviceCommonConfig::OPTIONS_IOMMU);
.add("pci_segment");
parser.parse(pmem).map_err(Error::ParsePersistentMemory)?; parser.parse(pmem).map_err(Error::ParsePersistentMemory)?;
let pci_common = PciDeviceCommonConfig::parse(pmem)?; let pci_common = PciDeviceCommonConfig::parse(pmem)?;
@@ -2195,9 +2190,7 @@ impl DeviceConfig {
let mut parser = OptionParser::new(); let mut parser = OptionParser::new();
parser parser
.add("path") .add("path")
.add("id") .add_all(PciDeviceCommonConfig::OPTIONS_IOMMU)
.add("iommu")
.add("pci_segment")
.add("x_nv_gpudirect_clique"); .add("x_nv_gpudirect_clique");
parser.parse(device).map_err(Error::ParseDevice)?; parser.parse(device).map_err(Error::ParseDevice)?;
@@ -2236,7 +2229,7 @@ impl UserDeviceConfig {
pub fn parse(user_device: &str) -> Result<Self> { pub fn parse(user_device: &str) -> Result<Self> {
let mut parser = OptionParser::new(); let mut parser = OptionParser::new();
parser.add("socket").add("id").add("pci_segment"); parser.add("socket").add_all(PciDeviceCommonConfig::OPTIONS);
parser.parse(user_device).map_err(Error::ParseUserDevice)?; parser.parse(user_device).map_err(Error::ParseUserDevice)?;
let pci_common = PciDeviceCommonConfig::parse(user_device)?; let pci_common = PciDeviceCommonConfig::parse(user_device)?;
@@ -2267,9 +2260,7 @@ impl VdpaConfig {
parser parser
.add("path") .add("path")
.add("num_queues") .add("num_queues")
.add("iommu") .add_all(PciDeviceCommonConfig::OPTIONS_IOMMU);
.add("id")
.add("pci_segment");
parser.parse(vdpa).map_err(Error::ParseVdpa)?; parser.parse(vdpa).map_err(Error::ParseVdpa)?;
let pci_common = PciDeviceCommonConfig::parse(vdpa)?; let pci_common = PciDeviceCommonConfig::parse(vdpa)?;
@@ -2303,9 +2294,7 @@ impl VsockConfig {
parser parser
.add("socket") .add("socket")
.add("cid") .add("cid")
.add("iommu") .add_all(PciDeviceCommonConfig::OPTIONS_IOMMU);
.add("id")
.add("pci_segment");
parser.parse(vsock).map_err(Error::ParseVsock)?; parser.parse(vsock).map_err(Error::ParseVsock)?;
let pci_common = PciDeviceCommonConfig::parse(vsock)?; let pci_common = PciDeviceCommonConfig::parse(vsock)?;