mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-21 20:15:17 +00:00
nodedev: ignore EINVAL from libudev in udevEventHandleThread
Certain udev entries might be of a size that makes libudev emit EINVAL which right now leads to udevEventHandleThread exiting. Due to no more handling events other elements of libvirt will start pushing for events to be consumed which never happens causing a busy loop burning a cpu without any gain. After evaluation of the example case discussed in in #245 and a test run ignoring EINVAL it was considered safe to add EINVAL to the ignored errnos to not exit udevEventHandleThread giving it more resilience. The root cause is in systemd and by now was discussed and fixed via https://github.com/systemd/systemd/issues/24987, but hardening libvirt to be able to better deal with EINVAL returned still is the right thing to avoid the reported busy loops on systemd with older systemd versions. Fixes: https://gitlab.com/libvirt/libvirt/-/issues/245 Signed-off-by: Christian Ehrhardt <christian.ehrhardt@canonical.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
2e16c9f202
commit
33a38492b7
@ -1865,10 +1865,12 @@ udevEventHandleThread(void *opaque G_GNUC_UNUSED)
|
||||
}
|
||||
|
||||
/* POSIX allows both EAGAIN and EWOULDBLOCK to be used
|
||||
* interchangeably when the read would block or timeout was fired
|
||||
* interchangeably when the read would block or timeout was fired.
|
||||
* EINVAL might happen on too large udev entries, ignore those for
|
||||
* the robustness of udevEventHandleThread.
|
||||
*/
|
||||
VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
|
||||
if (errno != EAGAIN && errno != EWOULDBLOCK) {
|
||||
if (errno != EAGAIN && errno != EWOULDBLOCK && errno != EINVAL) {
|
||||
VIR_WARNINGS_RESET
|
||||
virReportSystemError(errno, "%s",
|
||||
_("failed to receive device from udev "
|
||||
|
Loading…
x
Reference in New Issue
Block a user