mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-12 04:58:32 +03:00
nodedev: update mdevs from the mdevctl thread
Rather than directly executing mdevctl from the udev event thread when we determine that we need to re-query, schedule the mdevctl thread to run. This also helps to coalesce multiple back-to-back updates into a single one when there are multiple updates in a row or at startup when a host has a very large number of mdevs. Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com> Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
This commit is contained in:
parent
9b7fadc5dc
commit
14026db9b0
@ -1451,6 +1451,9 @@ udevGetDeviceDetails(struct udev_device *device,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void scheduleMdevctlUpdate(udevEventData *data, bool force);
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
udevRemoveOneDeviceSysPath(const char *path)
|
udevRemoveOneDeviceSysPath(const char *path)
|
||||||
{
|
{
|
||||||
@ -1483,8 +1486,7 @@ udevRemoveOneDeviceSysPath(const char *path)
|
|||||||
virNodeDeviceObjEndAPI(&obj);
|
virNodeDeviceObjEndAPI(&obj);
|
||||||
|
|
||||||
/* cannot check for mdev_types since they have already been removed */
|
/* cannot check for mdev_types since they have already been removed */
|
||||||
if (nodeDeviceUpdateMediatedDevices() < 0)
|
scheduleMdevctlUpdate(driver->privateData, false);
|
||||||
VIR_WARN("mdevctl failed to update mediated devices");
|
|
||||||
|
|
||||||
virObjectEventStateQueue(driver->nodeDeviceEventState, event);
|
virObjectEventStateQueue(driver->nodeDeviceEventState, event);
|
||||||
return 0;
|
return 0;
|
||||||
@ -1612,8 +1614,8 @@ udevAddOneDevice(struct udev_device *device)
|
|||||||
has_mdev_types = virNodeDeviceObjHasCap(obj, VIR_NODE_DEV_CAP_MDEV_TYPES);
|
has_mdev_types = virNodeDeviceObjHasCap(obj, VIR_NODE_DEV_CAP_MDEV_TYPES);
|
||||||
virNodeDeviceObjEndAPI(&obj);
|
virNodeDeviceObjEndAPI(&obj);
|
||||||
|
|
||||||
if (has_mdev_types && nodeDeviceUpdateMediatedDevices() < 0)
|
if (has_mdev_types)
|
||||||
VIR_WARN("mdevctl failed to update mediated devices");
|
scheduleMdevctlUpdate(driver->privateData, false);
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
@ -1775,8 +1777,7 @@ udevHandleOneDevice(struct udev_device *device)
|
|||||||
if (ret == 0 &&
|
if (ret == 0 &&
|
||||||
udevGetDeviceType(device, &dev_cap_type) == 0 &&
|
udevGetDeviceType(device, &dev_cap_type) == 0 &&
|
||||||
dev_cap_type == VIR_NODE_DEV_CAP_MDEV)
|
dev_cap_type == VIR_NODE_DEV_CAP_MDEV)
|
||||||
if (nodeDeviceUpdateMediatedDevices() < 0)
|
scheduleMdevctlUpdate(driver->privateData, false);
|
||||||
VIR_WARN("mdevctl failed to update mediated devices");
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user