From: Boris Fiuczynski <fiuczy(a)linux.ibm.com>
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(a)linux.ibm.com>
Signed-off-by: Jonathon Jongsma <jjongsma(a)redhat.com>
---
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