From: Boris Fiuczynski <fiuczy@xxxxxxxxxxxxx> This adds a new element to the mdev capabilities xml schema that represents the start policy for a defined mediated device. The actual auto-start functionality is handled behind the scenes by mdevctl, but it wasn't yet hooked up in libvirt. Signed-off-by: Boris Fiuczynski <fiuczy@xxxxxxxxxxxxx> Signed-off-by: Jonathon Jongsma <jjongsma@xxxxxxxxxx> --- docs/formatnode.html.in | 10 ++++++++++ docs/schemas/nodedev.rng | 11 ++++++++++ src/conf/node_device_conf.c | 20 ++++++++++++++++++- src/conf/node_device_conf.h | 12 +++++++++++ src/libvirt_private.syms | 2 ++ src/node_device/node_device_driver.c | 7 ++++++- .../mdevctl-list-multiple.out.xml | 4 ++++ ...v_3627463d_b7f0_4fea_b468_f1da537d301b.xml | 1 + ...v_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad.xml | 1 + 9 files changed, 66 insertions(+), 2 deletions(-) diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in index c58cd01395..3065570405 100644 --- a/docs/formatnode.html.in +++ b/docs/formatnode.html.in @@ -384,6 +384,16 @@ The order that they appear in the xml definition determines the order that they will be written to the device. </dd> + <dt><code>start</code></dt> + <dd> + This element represents the start policy for the device. It + has a required attribute <code>type</code>, which can have a + value of <code>auto</code> or <code>manual</code>. Mediated + devices with an <code>auto</code> start type will be started + automatically by the host when the parent device becomes + available (either on boot, or when the parent device is + attached). Otherwise the device must be started manually. + </dd> </dl> </dd> <dt><code>ccw</code></dt> diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng index 777227c38a..660cbda3be 100644 --- a/docs/schemas/nodedev.rng +++ b/docs/schemas/nodedev.rng @@ -622,6 +622,17 @@ </attribute> </element> </optional> + <optional> + <element name="start"> + <attribute name="type"> + <choice> + <value>manual</value> + <value>auto</value> + </choice> + </attribute> + <empty/> + </element> + </optional> <optional> <element name="uuid"> <ref name="UUID"/> diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 861f43f6c4..9c1192fe3b 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -85,6 +85,12 @@ VIR_ENUM_IMPL(virNodeDevDRM, "render", ); +VIR_ENUM_IMPL(virNodeDevMdevStart, + VIR_NODE_DEV_MDEV_START_LAST, + "manual", + "auto", +); + static int virNodeDevCapsDefParseString(const char *xpath, xmlXPathContextPtr ctxt, @@ -528,6 +534,8 @@ virNodeDeviceCapMdevDefFormat(virBuffer *buf, virBufferEscapeString(buf, "<type id='%s'/>\n", data->mdev.type); virBufferEscapeString(buf, "<uuid>%s</uuid>\n", data->mdev.uuid); + virBufferEscapeString(buf, "<start type='%s'/>\n", + virNodeDevMdevStartTypeToString(data->mdev.start)); virBufferAsprintf(buf, "<iommuGroup number='%u'/>\n", data->mdev.iommuGroupNumber); @@ -1149,7 +1157,6 @@ virNodeDevCapStorageParseXML(xmlXPathContextPtr ctxt, return -1; } storage->removable_media_size = val; - ctxt->node = orignode2; } else { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1923,6 +1930,7 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt, g_autofree xmlNodePtr *attrs = NULL; size_t i; g_autofree char *uuidstr = NULL; + g_autofree char *starttype = NULL; ctxt->node = node; @@ -1944,6 +1952,16 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt, virUUIDFormat(uuidbuf, mdev->uuid); } + if ((starttype = virXPathString("string(./start[1]/@type)", ctxt))) { + if ((mdev->start = virNodeDevMdevStartTypeFromString(starttype)) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown mdev start type '%s' for '%s'"), starttype, def->name); + return -1; + } + } else { + mdev->start = VIR_NODE_DEV_MDEV_START_MANUAL; + } + /* 'iommuGroup' is optional, only report an error if the supplied value is * invalid (-2), not if it's missing (-1) */ if (virXPathUInt("number(./iommuGroup[1]/@number)", diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h index a60562e4fe..1a31133c4c 100644 --- a/src/conf/node_device_conf.h +++ b/src/conf/node_device_conf.h @@ -124,6 +124,17 @@ typedef enum { VIR_ENUM_DECL(virNodeDevDRM); +typedef enum { + /* Keep in sync with VIR_ENUM_IMPL in node_device_conf.c */ + VIR_NODE_DEV_MDEV_START_MANUAL, + VIR_NODE_DEV_MDEV_START_AUTO, + + VIR_NODE_DEV_MDEV_START_LAST +} virNodeDevMdevStartType; + +VIR_ENUM_DECL(virNodeDevMdevStart); + + typedef struct _virNodeDevCapSystemHardware virNodeDevCapSystemHardware; struct _virNodeDevCapSystemHardware { char *vendor_name; @@ -151,6 +162,7 @@ struct _virNodeDevCapMdev { char *type; unsigned int iommuGroupNumber; char *uuid; + virNodeDevMdevStartType start; virMediatedDeviceAttr **attributes; size_t nattributes; }; diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 1df4b8cfe8..7aae36de56 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -846,6 +846,8 @@ virNodeDeviceGetSCSIHostCaps; virNodeDeviceGetSCSITargetCaps; virNodeDeviceGetWWNs; virNodeDeviceUpdateCaps; +virNodeDevMdevStartTypeFromString; +virNodeDevMdevStartTypeToString; # conf/node_device_event.h diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c index 8a0a2c3847..a9f605715b 100644 --- a/src/node_device/node_device_driver.c +++ b/src/node_device/node_device_driver.c @@ -615,7 +615,8 @@ nodeDeviceDefToMdevctlConfig(virNodeDeviceDef *def, char **buf) if (virJSONValueObjectAppendString(json, "mdev_type", mdev->type) < 0) return -1; - if (virJSONValueObjectAppendString(json, "start", "manual") < 0) + if (virJSONValueObjectAppendString(json, "start", + virNodeDevMdevStartTypeToString(mdev->start)) < 0) return -1; if (mdev->attributes) { @@ -1014,6 +1015,8 @@ nodeDeviceParseMdevctlChildDevice(const char *parent, mdev->uuid = g_strdup(uuid); mdev->type = g_strdup(virJSONValueObjectGetString(props, "mdev_type")); + mdev->start = + virNodeDevMdevStartTypeFromString(virJSONValueObjectGetString(props, "start")); attrs = virJSONValueObjectGet(props, "attrs"); @@ -1683,6 +1686,8 @@ nodeDeviceDefCopyFromMdevctl(virNodeDeviceDef *dst, dstmdev->uuid = g_strdup(srcmdev->uuid); } + dstmdev->start = srcmdev->start; + if (virMediatedDeviceAttrsCopy(dstmdev, srcmdev)) ret = true; diff --git a/tests/nodedevmdevctldata/mdevctl-list-multiple.out.xml b/tests/nodedevmdevctldata/mdevctl-list-multiple.out.xml index cf7e966256..83a3010455 100644 --- a/tests/nodedevmdevctldata/mdevctl-list-multiple.out.xml +++ b/tests/nodedevmdevctldata/mdevctl-list-multiple.out.xml @@ -4,6 +4,7 @@ <capability type='mdev'> <type id='i915-GVTg_V5_4'/> <uuid>200f228a-c80a-4d50-bfb7-f5a0e4e34045</uuid> + <start type='manual'/> <iommuGroup number='0'/> </capability> </device> @@ -13,6 +14,7 @@ <capability type='mdev'> <type id='i915-GVTg_V5_4'/> <uuid>de807ffc-1923-4d5f-b6c9-b20ecebc6d4b</uuid> + <start type='auto'/> <iommuGroup number='0'/> </capability> </device> @@ -22,6 +24,7 @@ <capability type='mdev'> <type id='i915-GVTg_V5_8'/> <uuid>435722ea-5f43-468a-874f-da34f1217f13</uuid> + <start type='manual'/> <iommuGroup number='0'/> <attr name='testattr' value='42'/> </capability> @@ -32,6 +35,7 @@ <capability type='mdev'> <type id='vfio_ap-passthrough'/> <uuid>783e6dbb-ea0e-411f-94e2-717eaad438bf</uuid> + <start type='manual'/> <iommuGroup number='0'/> <attr name='assign_adapter' value='5'/> <attr name='assign_adapter' value='6'/> diff --git a/tests/nodedevxml2xmlout/mdev_3627463d_b7f0_4fea_b468_f1da537d301b.xml b/tests/nodedevxml2xmlout/mdev_3627463d_b7f0_4fea_b468_f1da537d301b.xml index 470e5917ec..30dda60e87 100644 --- a/tests/nodedevxml2xmlout/mdev_3627463d_b7f0_4fea_b468_f1da537d301b.xml +++ b/tests/nodedevxml2xmlout/mdev_3627463d_b7f0_4fea_b468_f1da537d301b.xml @@ -3,6 +3,7 @@ <parent>computer</parent> <capability type='mdev'> <type id='mtty-1'/> + <start type='manual'/> <iommuGroup number='12'/> </capability> </device> diff --git a/tests/nodedevxml2xmlout/mdev_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad.xml b/tests/nodedevxml2xmlout/mdev_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad.xml index 106f759333..1988ffa679 100644 --- a/tests/nodedevxml2xmlout/mdev_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad.xml +++ b/tests/nodedevxml2xmlout/mdev_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad.xml @@ -4,6 +4,7 @@ <parent>ap_matrix</parent> <capability type='mdev'> <type id='vfio_ap-passthrough'/> + <start type='manual'/> <iommuGroup number='0'/> </capability> </device> -- 2.31.1