chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
udev: use usec_t and now()
[elogind.git]
/
src
/
udev
/
udevd.c
diff --git
a/src/udev/udevd.c
b/src/udev/udevd.c
index 176e4e293052e4ced91eadbdd43aec988d78bacf..b69f3f87de90a12625bfeb7674651d5f78b5e46b 100644
(file)
--- a/
src/udev/udevd.c
+++ b/
src/udev/udevd.c
@@
-95,8
+95,9
@@
struct event {
size_t devpath_len;
const char *devpath_old;
dev_t devnum;
size_t devpath_len;
const char *devpath_old;
dev_t devnum;
- bool is_block;
int ifindex;
int ifindex;
+ bool is_block;
+ bool nodelay;
};
static inline struct event *node_to_event(struct udev_list_node *node)
};
static inline struct event *node_to_event(struct udev_list_node *node)
@@
-121,7
+122,7
@@
struct worker {
struct udev_monitor *monitor;
enum worker_state state;
struct event *event;
struct udev_monitor *monitor;
enum worker_state state;
struct event *event;
- u
nsigned long long
event_start_usec;
+ u
sec_t
event_start_usec;
};
/* passed from worker to main process */
};
/* passed from worker to main process */
@@
-377,7
+378,7
@@
out:
worker->monitor = worker_monitor;
worker->pid = pid;
worker->state = WORKER_RUNNING;
worker->monitor = worker_monitor;
worker->pid = pid;
worker->state = WORKER_RUNNING;
- worker->event_start_usec = now
_usec(
);
+ worker->event_start_usec = now
(CLOCK_MONOTONIC
);
worker->event = event;
event->state = EVENT_RUNNING;
udev_list_node_append(&worker->node, &worker_list);
worker->event = event;
event->state = EVENT_RUNNING;
udev_list_node_append(&worker->node, &worker_list);
@@
-408,7
+409,7
@@
static void event_run(struct event *event)
worker_ref(worker);
worker->event = event;
worker->state = WORKER_RUNNING;
worker_ref(worker);
worker->event = event;
worker->state = WORKER_RUNNING;
- worker->event_start_usec = now
_usec(
);
+ worker->event_start_usec = now
(CLOCK_MONOTONIC
);
event->state = EVENT_RUNNING;
return;
}
event->state = EVENT_RUNNING;
return;
}
@@
-438,8
+439,10
@@
static int event_queue_insert(struct udev_device *dev)
event->devpath_len = strlen(event->devpath);
event->devpath_old = udev_device_get_devpath_old(dev);
event->devnum = udev_device_get_devnum(dev);
event->devpath_len = strlen(event->devpath);
event->devpath_old = udev_device_get_devpath_old(dev);
event->devnum = udev_device_get_devnum(dev);
- event->is_block =
(strcmp("block", udev_device_get_subsystem(dev)) == 0
);
+ event->is_block =
streq("block", udev_device_get_subsystem(dev)
);
event->ifindex = udev_device_get_ifindex(dev);
event->ifindex = udev_device_get_ifindex(dev);
+ if (streq(udev_device_get_subsystem(dev), "firmware"))
+ event->nodelay = true;
udev_queue_export_device_queued(udev_queue_export, dev);
log_debug("seq %llu queued, '%s' '%s'\n", udev_device_get_seqnum(dev),
udev_queue_export_device_queued(udev_queue_export, dev);
log_debug("seq %llu queued, '%s' '%s'\n", udev_device_get_seqnum(dev),
@@
-519,6
+522,10
@@
static bool is_devpath_busy(struct event *event)
return true;
}
return true;
}
+ /* allow to bypass the dependency tracking */
+ if (event->nodelay)
+ continue;
+
/* parent device event found */
if (event->devpath[common] == '/') {
event->delaying_seqnum = loop_event->seqnum;
/* parent device event found */
if (event->devpath[common] == '/') {
event->delaying_seqnum = loop_event->seqnum;
@@
-891,7
+898,6
@@
static int mem_size_mb(void)
static int convert_db(struct udev *udev)
{
char filename[UTIL_PATH_SIZE];
static int convert_db(struct udev *udev)
{
char filename[UTIL_PATH_SIZE];
- FILE *f;
struct udev_enumerate *udev_enumerate;
struct udev_list_entry *list_entry;
struct udev_enumerate *udev_enumerate;
struct udev_list_entry *list_entry;
@@
-907,11
+913,7
@@
static int convert_db(struct udev *udev)
if (access(filename, F_OK) < 0)
return 0;
if (access(filename, F_OK) < 0)
return 0;
- f = fopen("/dev/kmsg", "we");
- if (f != NULL) {
- fprintf(f, "<30>systemd-udevd[%u]: converting old udev database\n", getpid());
- fclose(f);
- }
+ print_kmsg("converting old udev database\n");
udev_enumerate = udev_enumerate_new(udev);
if (udev_enumerate == NULL)
udev_enumerate = udev_enumerate_new(udev);
if (udev_enumerate == NULL)
@@
-1040,14
+1042,17
@@
static void kernel_cmdline_options(struct udev *udev)
else
opt = s;
else
opt = s;
- if (startswith(opt, "udev.log-priority="))
-
udev_set_log_priority(udev, util_log_priority(opt + 18))
;
+ if (startswith(opt, "udev.log-priority="))
{
+
int prio
;
- if (startswith(opt, "udev.children-max="))
+ prio = util_log_priority(opt + 18);
+ log_set_max_level(prio);
+ udev_set_log_priority(udev, prio);
+ } else if (startswith(opt, "udev.children-max=")) {
children_max = strtoul(opt + 18, NULL, 0);
children_max = strtoul(opt + 18, NULL, 0);
-
- if (startswith(opt, "udev.exec-delay="))
+ } else if (startswith(opt, "udev.exec-delay=")) {
exec_delay = strtoul(opt + 16, NULL, 0);
exec_delay = strtoul(opt + 16, NULL, 0);
+ }
free(s);
}
free(s);
}
@@
-1058,7
+1063,6
@@
static void kernel_cmdline_options(struct udev *udev)
int main(int argc, char *argv[])
{
struct udev *udev;
int main(int argc, char *argv[])
{
struct udev *udev;
- FILE *f;
sigset_t mask;
int daemonize = false;
int resolve_names = 1;
sigset_t mask;
int daemonize = false;
int resolve_names = 1;
@@
-1083,8
+1087,9
@@
int main(int argc, char *argv[])
if (udev == NULL)
goto exit;
if (udev == NULL)
goto exit;
- log_
open(
);
+ log_
set_target(LOG_TARGET_AUTO
);
log_parse_environment();
log_parse_environment();
+ log_open();
udev_set_log_fn(udev, udev_main_log);
log_debug("version %s\n", VERSION);
label_init("/dev");
udev_set_log_fn(udev, udev_main_log);
log_debug("version %s\n", VERSION);
label_init("/dev");
@@
-1109,7
+1114,7
@@
int main(int argc, char *argv[])
case 'D':
debug = true;
log_set_max_level(LOG_DEBUG);
case 'D':
debug = true;
log_set_max_level(LOG_DEBUG);
- udev_set_log_priority(udev, LOG_
INFO
);
+ udev_set_log_priority(udev, LOG_
DEBUG
);
break;
case 'N':
if (strcmp (optarg, "early") == 0) {
break;
case 'N':
if (strcmp (optarg, "early") == 0) {
@@
-1157,7
+1162,7
@@
int main(int argc, char *argv[])
mkdir("/run/udev", 0755);
mkdir("/run/udev", 0755);
- dev_setup();
+ dev_setup(
NULL
);
static_dev_create_from_modules(udev);
/* before opening new files, make sure std{in,out,err} fds are in a sane state */
static_dev_create_from_modules(udev);
/* before opening new files, make sure std{in,out,err} fds are in a sane state */
@@
-1179,7
+1184,7
@@
int main(int argc, char *argv[])
}
if (systemd_fds(udev, &fd_ctrl, &fd_netlink) >= 0) {
}
if (systemd_fds(udev, &fd_ctrl, &fd_netlink) >= 0) {
- /* get control and netlink socket from
from
systemd */
+ /* get control and netlink socket from systemd */
udev_ctrl = udev_ctrl_new_from_fd(udev, fd_ctrl);
if (udev_ctrl == NULL) {
log_error("error taking over udev control socket");
udev_ctrl = udev_ctrl_new_from_fd(udev, fd_ctrl);
if (udev_ctrl == NULL) {
log_error("error taking over udev control socket");
@@
-1264,11
+1269,7
@@
int main(int argc, char *argv[])
sd_notify(1, "READY=1");
}
sd_notify(1, "READY=1");
}
- f = fopen("/dev/kmsg", "we");
- if (f != NULL) {
- fprintf(f, "<30>systemd-udevd[%u]: starting version " VERSION "\n", getpid());
- fclose(f);
- }
+ print_kmsg("starting version " VERSION "\n");
if (!debug) {
int fd;
if (!debug) {
int fd;
@@
-1373,7
+1374,7
@@
int main(int argc, char *argv[])
udev_list_node_init(&worker_list);
for (;;) {
udev_list_node_init(&worker_list);
for (;;) {
- static u
nsigned long long
last_usec;
+ static u
sec_t
last_usec;
struct epoll_event ev[8];
int fdcount;
int timeout;
struct epoll_event ev[8];
int fdcount;
int timeout;
@@
-1444,7
+1445,7
@@
int main(int argc, char *argv[])
if (worker->state != WORKER_RUNNING)
continue;
if (worker->state != WORKER_RUNNING)
continue;
- if ((now
_usec(
) - worker->event_start_usec) > 30 * 1000 * 1000) {
+ if ((now
(CLOCK_MONOTONIC
) - worker->event_start_usec) > 30 * 1000 * 1000) {
log_error("worker [%u] %s timeout; kill it\n", worker->pid,
worker->event ? worker->event->devpath : "<idle>");
kill(worker->pid, SIGKILL);
log_error("worker [%u] %s timeout; kill it\n", worker->pid,
worker->event ? worker->event->devpath : "<idle>");
kill(worker->pid, SIGKILL);
@@
-1478,13
+1479,13
@@
int main(int argc, char *argv[])
}
/* check for changed config, every 3 seconds at most */
}
/* check for changed config, every 3 seconds at most */
- if ((now
_usec(
) - last_usec) > 3 * 1000 * 1000) {
+ if ((now
(CLOCK_MONOTONIC
) - last_usec) > 3 * 1000 * 1000) {
if (udev_rules_check_timestamp(rules))
reload = true;
if (udev_builtin_validate(udev))
reload = true;
if (udev_rules_check_timestamp(rules))
reload = true;
if (udev_builtin_validate(udev))
reload = true;
- last_usec = now
_usec(
);
+ last_usec = now
(CLOCK_MONOTONIC
);
}
/* reload requested, HUP signal received, rules changed, builtin changed */
}
/* reload requested, HUP signal received, rules changed, builtin changed */
@@
-1492,7
+1493,7
@@
int main(int argc, char *argv[])
worker_kill(udev);
rules = udev_rules_unref(rules);
udev_builtin_exit(udev);
worker_kill(udev);
rules = udev_rules_unref(rules);
udev_builtin_exit(udev);
- reload =
0
;
+ reload =
false
;
}
/* event has finished */
}
/* event has finished */
@@
-1504,7
+1505,7
@@
int main(int argc, char *argv[])
dev = udev_monitor_receive_device(monitor);
if (dev != NULL) {
dev = udev_monitor_receive_device(monitor);
if (dev != NULL) {
- udev_device_set_usec_initialized(dev, now
_usec(
));
+ udev_device_set_usec_initialized(dev, now
(CLOCK_MONOTONIC
));
if (event_queue_insert(dev) < 0)
udev_device_unref(dev);
}
if (event_queue_insert(dev) < 0)
udev_device_unref(dev);
}
@@
-1512,6
+1513,7
@@
int main(int argc, char *argv[])
/* start new events */
if (!udev_list_node_is_empty(&event_list) && !udev_exit && !stop_exec_queue) {
/* start new events */
if (!udev_list_node_is_empty(&event_list) && !udev_exit && !stop_exec_queue) {
+ udev_builtin_init(udev);
if (rules == NULL)
rules = udev_rules_new(udev, resolve_names);
if (rules != NULL)
if (rules == NULL)
rules = udev_rules_new(udev, resolve_names);
if (rules != NULL)