forked from pool/systemd
48af67da26
- udev: path_id - handle Hyper-V devices add: 1008-udev-path_id-handle-Hyper-V-devices.patch - keymap: Update the list of Samsung Series 9 models add: 1009-keymap-Update-the-list-of-Samsung-Series-9-models.patch - keymap: Add Samsung 700T add: 1010-keymap-Add-Samsung-700T.patch - libudev: avoid leak during realloc failure add: 1011-libudev-avoid-leak-during-realloc-failure.patch - libudev: do not resolve $attr{device} symlinks add: 1012-libudev-do-not-resolve-attr-device-symlinks.patch - libudev: validate 'udev' argument to udev_enumerate_new() add: 1013-libudev-validate-udev-argument-to-udev_enumerate_new.patch - udev: fix whitespace add: 1014-udev-fix-whitespace.patch - udev: properly handle symlink removal by 'change' event add: 1015-udev-properly-handle-symlink-removal-by-change-event.patch - udev: builtin - do not fail builtin initialization if one of them returns an error add: 1016-udev-builtin-do-not-fail-builtin-initialization-if-o.patch - udev: use usec_t and now() add: 1017-udev-use-usec_t-and-now.patch closing an non-existent dbus connection and getting assertion failures. - udev: path_id - handle Hyper-V devices add: 1008-udev-path_id-handle-Hyper-V-devices.patch - keymap: Update the list of Samsung Series 9 models add: 1009-keymap-Update-the-list-of-Samsung-Series-9-models.patch - keymap: Add Samsung 700T add: 1010-keymap-Add-Samsung-700T.patch OBS-URL: https://build.opensuse.org/request/show/147673 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/systemd?expand=0&rev=120
131 lines
4.9 KiB
Diff
131 lines
4.9 KiB
Diff
Without treating events with timeouts specially some drivers would
|
|
cause a 30 seconds stall on boot: .
|
|
|
|
I also received reports of some drivers not working at all, even
|
|
after the timeout.
|
|
|
|
We will remove this patch when more drivers have been fixed in
|
|
the kernel (3.4?).
|
|
|
|
This reverts 43d5c5f03645c4b842659f9b5bd0ae465e885e92 and
|
|
57c6f8ae5f52a6e8ffc66a54966346f733dded39.
|
|
---
|
|
|
|
Note: this is mostly a FYI, and whether or not it makes sense
|
|
to apply this upstream depends on how big problems other report
|
|
regarding this issue.
|
|
|
|
src/libudev-device.c | 19 +++++++++++++++++++
|
|
src/libudev-private.h | 1 +
|
|
src/udevd.c | 13 ++++++++++---
|
|
4 files changed, 32 insertions(+), 3 deletions(-)
|
|
|
|
Index: systemd-195/src/libudev/libudev-device.c
|
|
===================================================================
|
|
--- systemd-195.orig/src/libudev/libudev-device.c
|
|
+++ systemd-195/src/libudev/libudev-device.c
|
|
@@ -68,6 +68,7 @@ struct udev_device {
|
|
struct udev_list tags_list;
|
|
unsigned long long int seqnum;
|
|
unsigned long long int usec_initialized;
|
|
+ int timeout;
|
|
int devlink_priority;
|
|
int refcount;
|
|
dev_t devnum;
|
|
@@ -162,6 +163,21 @@ static int udev_device_set_devnum(struct
|
|
return 0;
|
|
}
|
|
|
|
+int udev_device_get_timeout(struct udev_device *udev_device)
|
|
+{
|
|
+ return udev_device->timeout;
|
|
+}
|
|
+
|
|
+static int udev_device_set_timeout(struct udev_device *udev_device, int timeout)
|
|
+{
|
|
+ char num[32];
|
|
+
|
|
+ udev_device->timeout = timeout;
|
|
+ snprintf(num, sizeof(num), "%u", timeout);
|
|
+ udev_device_add_property(udev_device, "TIMEOUT", num);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
const char *udev_device_get_devpath_old(struct udev_device *udev_device)
|
|
{
|
|
return udev_device->devpath_old;
|
|
@@ -418,6 +434,8 @@ void udev_device_add_property_from_strin
|
|
udev_device_set_devpath_old(udev_device, &property[12]);
|
|
} else if (startswith(property, "SEQNUM=")) {
|
|
udev_device_set_seqnum(udev_device, strtoull(&property[7], NULL, 10));
|
|
+ } else if (startswith(property, "TIMEOUT=")) {
|
|
+ udev_device_set_timeout(udev_device, strtoull(&property[8], NULL, 10));
|
|
} else if (startswith(property, "IFINDEX=")) {
|
|
udev_device_set_ifindex(udev_device, strtoull(&property[8], NULL, 10));
|
|
} else if (startswith(property, "DEVMODE=")) {
|
|
@@ -605,6 +623,7 @@ struct udev_device *udev_device_new(stru
|
|
udev_list_init(udev, &udev_device->sysattr_value_list, true);
|
|
udev_list_init(udev, &udev_device->sysattr_list, false);
|
|
udev_list_init(udev, &udev_device->tags_list, true);
|
|
+ udev_device->timeout = -1;
|
|
udev_device->watch_handle = -1;
|
|
/* copy global properties */
|
|
udev_list_entry_foreach(list_entry, udev_get_properties_list_entry(udev))
|
|
Index: systemd-195/src/libudev/libudev-private.h
|
|
===================================================================
|
|
--- systemd-195.orig/src/libudev/libudev-private.h
|
|
+++ systemd-195/src/libudev/libudev-private.h
|
|
@@ -65,6 +65,7 @@ const char *udev_device_get_id_filename(
|
|
void udev_device_set_is_initialized(struct udev_device *udev_device);
|
|
int udev_device_add_tag(struct udev_device *udev_device, const char *tag);
|
|
void udev_device_cleanup_tags_list(struct udev_device *udev_device);
|
|
+int udev_device_get_timeout(struct udev_device *udev_device);
|
|
unsigned long long udev_device_get_usec_initialized(struct udev_device *udev_device);
|
|
void udev_device_set_usec_initialized(struct udev_device *udev_device, unsigned long long usec_initialized);
|
|
int udev_device_get_devlink_priority(struct udev_device *udev_device);
|
|
Index: systemd-195/src/udev/udevd.c
|
|
===================================================================
|
|
--- systemd-195.orig/src/udev/udevd.c
|
|
+++ systemd-195/src/udev/udevd.c
|
|
@@ -388,7 +388,7 @@ out:
|
|
}
|
|
}
|
|
|
|
-static void event_run(struct event *event)
|
|
+static void event_run(struct event *event, bool force)
|
|
{
|
|
struct udev_list_node *loop;
|
|
|
|
@@ -414,7 +414,7 @@ static void event_run(struct event *even
|
|
return;
|
|
}
|
|
|
|
- if (children >= children_max) {
|
|
+ if (!force && children >= children_max) {
|
|
if (children_max > 1)
|
|
log_debug("maximum number (%i) of children reached\n", children);
|
|
return;
|
|
@@ -450,6 +450,13 @@ static int event_queue_insert(struct ude
|
|
|
|
event->state = EVENT_QUEUED;
|
|
udev_list_node_append(&event->node, &event_list);
|
|
+
|
|
+ /* run all events with a timeout set immediately */
|
|
+ if (udev_device_get_timeout(dev) > 0) {
|
|
+ event_run(event, true);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -559,7 +566,7 @@ static void event_queue_start(struct ude
|
|
if (is_devpath_busy(event))
|
|
continue;
|
|
|
|
- event_run(event);
|
|
+ event_run(event, false);
|
|
}
|
|
}
|
|
|