1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2024-12-22 17:34:18 +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:
Boris Fiuczynski 2021-05-14 16:28:59 -05:00 committed by Michal Privoznik
parent 86ecc06c06
commit 42a5585499
9 changed files with 83 additions and 4 deletions

View File

@ -388,6 +388,16 @@
<dd> <dd>
This element represents the UUID of the mediated device. This element represents the UUID of the mediated device.
</dd> </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> </dl>
</dd> </dd>
<dt><code>ccw</code></dt> <dt><code>ccw</code></dt>

View File

@ -622,6 +622,17 @@
</attribute> </attribute>
</element> </element>
</optional> </optional>
<optional>
<element name="start">
<attribute name="type">
<choice>
<value>manual</value>
<value>auto</value>
</choice>
</attribute>
<empty/>
</element>
</optional>
<optional> <optional>
<element name="uuid"> <element name="uuid">
<ref name="UUID"/> <ref name="UUID"/>

View File

@ -85,6 +85,12 @@ VIR_ENUM_IMPL(virNodeDevDRM,
"render", "render",
); );
VIR_ENUM_IMPL(virNodeDevMdevStart,
VIR_NODE_DEV_MDEV_START_LAST,
"manual",
"auto",
);
static int static int
virNodeDevCapsDefParseString(const char *xpath, virNodeDevCapsDefParseString(const char *xpath,
xmlXPathContextPtr ctxt, xmlXPathContextPtr ctxt,
@ -528,6 +534,8 @@ virNodeDeviceCapMdevDefFormat(virBuffer *buf,
virBufferEscapeString(buf, "<type id='%s'/>\n", data->mdev.type); virBufferEscapeString(buf, "<type id='%s'/>\n", data->mdev.type);
virBufferEscapeString(buf, "<uuid>%s</uuid>\n", data->mdev.uuid); 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", virBufferAsprintf(buf, "<iommuGroup number='%u'/>\n",
data->mdev.iommuGroupNumber); data->mdev.iommuGroupNumber);
@ -1149,7 +1157,6 @@ virNodeDevCapStorageParseXML(xmlXPathContextPtr ctxt,
return -1; return -1;
} }
storage->removable_media_size = val; storage->removable_media_size = val;
ctxt->node = orignode2; ctxt->node = orignode2;
} else { } else {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
@ -1912,6 +1919,7 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt,
g_autofree xmlNodePtr *attrs = NULL; g_autofree xmlNodePtr *attrs = NULL;
size_t i; size_t i;
g_autofree char *uuidstr = NULL; g_autofree char *uuidstr = NULL;
g_autofree char *starttype = NULL;
ctxt->node = node; ctxt->node = node;
@ -1933,6 +1941,16 @@ virNodeDevCapMdevParseXML(xmlXPathContextPtr ctxt,
virUUIDFormat(uuidbuf, mdev->uuid); 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 /* 'iommuGroup' is optional, only report an error if the supplied value is
* invalid (-2), not if it's missing (-1) */ * invalid (-2), not if it's missing (-1) */
if (virXPathUInt("number(./iommuGroup[1]/@number)", if (virXPathUInt("number(./iommuGroup[1]/@number)",

View File

@ -124,6 +124,17 @@ typedef enum {
VIR_ENUM_DECL(virNodeDevDRM); 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; typedef struct _virNodeDevCapSystemHardware virNodeDevCapSystemHardware;
struct _virNodeDevCapSystemHardware { struct _virNodeDevCapSystemHardware {
char *vendor_name; char *vendor_name;
@ -151,6 +162,7 @@ struct _virNodeDevCapMdev {
char *type; char *type;
unsigned int iommuGroupNumber; unsigned int iommuGroupNumber;
char *uuid; char *uuid;
virNodeDevMdevStartType start;
virMediatedDeviceAttr **attributes; virMediatedDeviceAttr **attributes;
size_t nattributes; size_t nattributes;
}; };

View File

@ -846,6 +846,8 @@ virNodeDeviceGetSCSIHostCaps;
virNodeDeviceGetSCSITargetCaps; virNodeDeviceGetSCSITargetCaps;
virNodeDeviceGetWWNs; virNodeDeviceGetWWNs;
virNodeDeviceUpdateCaps; virNodeDeviceUpdateCaps;
virNodeDevMdevStartTypeFromString;
virNodeDevMdevStartTypeToString;
# conf/node_device_event.h # conf/node_device_event.h

View File

@ -615,7 +615,8 @@ nodeDeviceDefToMdevctlConfig(virNodeDeviceDef *def, char **buf)
if (virJSONValueObjectAppendString(json, "mdev_type", mdev->type) < 0) if (virJSONValueObjectAppendString(json, "mdev_type", mdev->type) < 0)
return -1; return -1;
if (virJSONValueObjectAppendString(json, "start", "manual") < 0) if (virJSONValueObjectAppendString(json, "start",
virNodeDevMdevStartTypeToString(mdev->start)) < 0)
return -1; return -1;
if (mdev->attributes) { if (mdev->attributes) {
@ -1014,6 +1015,8 @@ nodeDeviceParseMdevctlChildDevice(const char *parent,
mdev->uuid = g_strdup(uuid); mdev->uuid = g_strdup(uuid);
mdev->type = mdev->type =
g_strdup(virJSONValueObjectGetString(props, "mdev_type")); g_strdup(virJSONValueObjectGetString(props, "mdev_type"));
mdev->start =
virNodeDevMdevStartTypeFromString(virJSONValueObjectGetString(props, "start"));
attrs = virJSONValueObjectGet(props, "attrs"); attrs = virJSONValueObjectGet(props, "attrs");
@ -1683,6 +1686,8 @@ nodeDeviceDefCopyFromMdevctl(virNodeDeviceDef *dst,
dstmdev->uuid = g_strdup(srcmdev->uuid); dstmdev->uuid = g_strdup(srcmdev->uuid);
} }
dstmdev->start = srcmdev->start;
if (virMediatedDeviceAttrsCopy(dstmdev, srcmdev)) if (virMediatedDeviceAttrsCopy(dstmdev, srcmdev))
ret = true; ret = true;

View File

@ -4,6 +4,7 @@
<capability type='mdev'> <capability type='mdev'>
<type id='i915-GVTg_V5_4'/> <type id='i915-GVTg_V5_4'/>
<uuid>200f228a-c80a-4d50-bfb7-f5a0e4e34045</uuid> <uuid>200f228a-c80a-4d50-bfb7-f5a0e4e34045</uuid>
<start type='manual'/>
<iommuGroup number='0'/> <iommuGroup number='0'/>
</capability> </capability>
</device> </device>
@ -13,6 +14,7 @@
<capability type='mdev'> <capability type='mdev'>
<type id='i915-GVTg_V5_4'/> <type id='i915-GVTg_V5_4'/>
<uuid>de807ffc-1923-4d5f-b6c9-b20ecebc6d4b</uuid> <uuid>de807ffc-1923-4d5f-b6c9-b20ecebc6d4b</uuid>
<start type='auto'/>
<iommuGroup number='0'/> <iommuGroup number='0'/>
</capability> </capability>
</device> </device>
@ -22,6 +24,7 @@
<capability type='mdev'> <capability type='mdev'>
<type id='i915-GVTg_V5_8'/> <type id='i915-GVTg_V5_8'/>
<uuid>435722ea-5f43-468a-874f-da34f1217f13</uuid> <uuid>435722ea-5f43-468a-874f-da34f1217f13</uuid>
<start type='manual'/>
<iommuGroup number='0'/> <iommuGroup number='0'/>
<attr name='testattr' value='42'/> <attr name='testattr' value='42'/>
</capability> </capability>
@ -32,6 +35,7 @@
<capability type='mdev'> <capability type='mdev'>
<type id='vfio_ap-passthrough'/> <type id='vfio_ap-passthrough'/>
<uuid>783e6dbb-ea0e-411f-94e2-717eaad438bf</uuid> <uuid>783e6dbb-ea0e-411f-94e2-717eaad438bf</uuid>
<start type='manual'/>
<iommuGroup number='0'/> <iommuGroup number='0'/>
<attr name='assign_adapter' value='5'/> <attr name='assign_adapter' value='5'/>
<attr name='assign_adapter' value='6'/> <attr name='assign_adapter' value='6'/>

View File

@ -1 +0,0 @@
../nodedevschemadata/mdev_3627463d_b7f0_4fea_b468_f1da537d301b.xml

View File

@ -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>

View File

@ -1 +0,0 @@
../nodedevschemadata/mdev_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad.xml

View File

@ -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>