mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 21:34:54 +03:00
nodedev: support auto-start property for mdevs
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@linux.ibm.com> Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
86ecc06c06
commit
42a5585499
@ -388,6 +388,16 @@
|
||||
<dd>
|
||||
This element represents the UUID of the mediated 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>
|
||||
|
@ -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"/>
|
||||
|
@ -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,
|
||||
@ -1912,6 +1919,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;
|
||||
|
||||
@ -1933,6 +1941,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)",
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -846,6 +846,8 @@ virNodeDeviceGetSCSIHostCaps;
|
||||
virNodeDeviceGetSCSITargetCaps;
|
||||
virNodeDeviceGetWWNs;
|
||||
virNodeDeviceUpdateCaps;
|
||||
virNodeDevMdevStartTypeFromString;
|
||||
virNodeDevMdevStartTypeToString;
|
||||
|
||||
|
||||
# conf/node_device_event.h
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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'/>
|
||||
|
@ -1 +0,0 @@
|
||||
../nodedevschemadata/mdev_3627463d_b7f0_4fea_b468_f1da537d301b.xml
|
@ -0,0 +1,9 @@
|
||||
<device>
|
||||
<name>mdev_3627463d_b7f0_4fea_b468_f1da537d301b</name>
|
||||
<parent>computer</parent>
|
||||
<capability type='mdev'>
|
||||
<type id='mtty-1'/>
|
||||
<start type='manual'/>
|
||||
<iommuGroup number='12'/>
|
||||
</capability>
|
||||
</device>
|
@ -1 +0,0 @@
|
||||
../nodedevschemadata/mdev_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad.xml
|
@ -0,0 +1,10 @@
|
||||
<device>
|
||||
<name>mdev_ee0b88c4-f554-4dc1-809d-b2a01e8e48ad</name>
|
||||
<path>/sys/devices/vfio_ap/matrix/mdev_ee0b88c4-f554-4dc1-809d-b2a01e8e48ad</path>
|
||||
<parent>ap_matrix</parent>
|
||||
<capability type='mdev'>
|
||||
<type id='vfio_ap-passthrough'/>
|
||||
<start type='manual'/>
|
||||
<iommuGroup number='0'/>
|
||||
</capability>
|
||||
</device>
|
Loading…
Reference in New Issue
Block a user