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:
parent
86ecc06c06
commit
42a5585499
@ -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>
|
||||||
|
@ -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"/>
|
||||||
|
@ -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)",
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
@ -846,6 +846,8 @@ virNodeDeviceGetSCSIHostCaps;
|
|||||||
virNodeDeviceGetSCSITargetCaps;
|
virNodeDeviceGetSCSITargetCaps;
|
||||||
virNodeDeviceGetWWNs;
|
virNodeDeviceGetWWNs;
|
||||||
virNodeDeviceUpdateCaps;
|
virNodeDeviceUpdateCaps;
|
||||||
|
virNodeDevMdevStartTypeFromString;
|
||||||
|
virNodeDevMdevStartTypeToString;
|
||||||
|
|
||||||
|
|
||||||
# conf/node_device_event.h
|
# conf/node_device_event.h
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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'/>
|
||||||
|
@ -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