mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-25 01:34:11 +03:00
nodedev: fix parent device of inactive mdevs
Inactive mdevs were simply formatting their parent name as the value received from mdevctl rather than looking up the libvirt nodedev name of the parent device. This resulted in a parent value of e.g. '0000:5b:00.0' instead of 'pci_0000_5b_00_0'. This prevented defining a new mdev device from the output of nodedev-dumpxml. Unfortunately, it's not simple to fix this comprehensively due to the fact that mdevctl supports defining (inactive) mdevs for parent devices that do not actually exist on the host (yet). So for those persistent mdev definitions that do not have a valid parent in the device list, the parent device will be set to the root "computer" device. Unfortunately, because the value of the 'parent' field now depends on the configuration of the host, the mdevctl parsing test will output 'computer' for all test devices. Fixing this would require a more extensive mock test environment. Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1979761 Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com> Reviewed-by: Shalini Chellathurai Saroja <shalini@linux.ibm.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
00d34a085c
commit
51fbbfdce8
@ -1051,6 +1051,7 @@ nodeDeviceParseMdevctlChildDevice(const char *parent,
|
||||
virJSONValue *props;
|
||||
virJSONValue *attrs;
|
||||
g_autoptr(virNodeDeviceDef) child = g_new0(virNodeDeviceDef, 1);
|
||||
g_autofree char *parent_sysfs_path = NULL;
|
||||
|
||||
/* the child object should have a single key equal to its uuid.
|
||||
* The value is an object describing the properties of the mdev */
|
||||
@ -1060,7 +1061,25 @@ nodeDeviceParseMdevctlChildDevice(const char *parent,
|
||||
uuid = virJSONValueObjectGetKey(json, 0);
|
||||
props = virJSONValueObjectGetValue(json, 0);
|
||||
|
||||
child->parent = g_strdup(parent);
|
||||
/* Look up id of parent device. mdevctl supports defining mdevs for parent
|
||||
* devices that are not present on the system (to support starting mdevs on
|
||||
* hotplug, etc) so the parent may not actually exist. */
|
||||
parent_sysfs_path = g_strdup_printf("/sys/class/mdev_bus/%s", parent);
|
||||
if (virFileExists(parent_sysfs_path)) {
|
||||
g_autofree char *canon_syspath = virFileCanonicalizePath(parent_sysfs_path);
|
||||
virNodeDeviceObj *parentobj = NULL;
|
||||
|
||||
if ((parentobj = virNodeDeviceObjListFindBySysfsPath(driver->devs,
|
||||
canon_syspath))) {
|
||||
virNodeDeviceDef *parentdef = virNodeDeviceObjGetDef(parentobj);
|
||||
child->parent = g_strdup(parentdef->name);
|
||||
virNodeDeviceObjEndAPI(&parentobj);
|
||||
|
||||
child->parent_sysfs_path = g_steal_pointer(&canon_syspath);
|
||||
}
|
||||
}
|
||||
if (!child->parent)
|
||||
child->parent = g_strdup("computer");
|
||||
child->caps = g_new0(virNodeDevCapsDef, 1);
|
||||
child->caps->data.type = VIR_NODE_DEV_CAP_MDEV;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
<device>
|
||||
<name>mdev_200f228a_c80a_4d50_bfb7_f5a0e4e34045</name>
|
||||
<parent>0000:00:02.0</parent>
|
||||
<parent>computer</parent>
|
||||
<capability type='mdev'>
|
||||
<type id='i915-GVTg_V5_4'/>
|
||||
<uuid>200f228a-c80a-4d50-bfb7-f5a0e4e34045</uuid>
|
||||
@ -9,7 +9,7 @@
|
||||
</device>
|
||||
<device>
|
||||
<name>mdev_de807ffc_1923_4d5f_b6c9_b20ecebc6d4b</name>
|
||||
<parent>0000:00:02.0</parent>
|
||||
<parent>computer</parent>
|
||||
<capability type='mdev'>
|
||||
<type id='i915-GVTg_V5_4'/>
|
||||
<uuid>de807ffc-1923-4d5f-b6c9-b20ecebc6d4b</uuid>
|
||||
@ -18,7 +18,7 @@
|
||||
</device>
|
||||
<device>
|
||||
<name>mdev_435722ea_5f43_468a_874f_da34f1217f13</name>
|
||||
<parent>0000:00:02.0</parent>
|
||||
<parent>computer</parent>
|
||||
<capability type='mdev'>
|
||||
<type id='i915-GVTg_V5_8'/>
|
||||
<uuid>435722ea-5f43-468a-874f-da34f1217f13</uuid>
|
||||
@ -28,7 +28,7 @@
|
||||
</device>
|
||||
<device>
|
||||
<name>mdev_783e6dbb_ea0e_411f_94e2_717eaad438bf</name>
|
||||
<parent>matrix</parent>
|
||||
<parent>computer</parent>
|
||||
<capability type='mdev'>
|
||||
<type id='vfio_ap-passthrough'/>
|
||||
<uuid>783e6dbb-ea0e-411f-94e2-717eaad438bf</uuid>
|
||||
|
Loading…
Reference in New Issue
Block a user