X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fudev%2Fudevd.c;h=42cf994b0d8d7887cf9aafb8316e5d4e00d3db75;hb=bcadcb64ee9831013a223d9efbc784e7cce23a44;hp=0a3ab687fda0822a8a926dc11743cf512df69a5f;hpb=1d600df55bdba448b05d6f8293028d6b6702914b;p=elogind.git diff --git a/src/udev/udevd.c b/src/udev/udevd.c index 0a3ab687f..42cf994b0 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -98,7 +98,9 @@ struct event { dev_t devnum; int ifindex; bool is_block; +#ifdef HAVE_FIRMWARE bool nodelay; +#endif }; static inline struct event *node_to_event(struct udev_list_node *node) @@ -442,8 +444,10 @@ static int event_queue_insert(struct udev_device *dev) event->devnum = udev_device_get_devnum(dev); event->is_block = streq("block", udev_device_get_subsystem(dev)); event->ifindex = udev_device_get_ifindex(dev); +#ifdef HAVE_FIRMWARE if (streq(udev_device_get_subsystem(dev), "firmware")) event->nodelay = true; +#endif udev_queue_export_device_queued(udev_queue_export, dev); log_debug("seq %llu queued, '%s' '%s'\n", udev_device_get_seqnum(dev), @@ -523,9 +527,11 @@ static bool is_devpath_busy(struct event *event) return true; } +#ifdef HAVE_FIRMWARE /* allow to bypass the dependency tracking */ if (event->nodelay) continue; +#endif /* parent device event found */ if (event->devpath[common] == '/') { @@ -813,7 +819,11 @@ static void static_dev_create_from_modules(struct udev *udev) char buf[4096]; FILE *f; - uname(&kernel); + if (uname(&kernel) < 0) { + log_error("uname failed: %m"); + return; + } + strscpyl(modules, sizeof(modules), ROOTPREFIX "/lib/modules/", kernel.release, "/modules.devname", NULL); f = fopen(modules, "re"); if (f == NULL) @@ -873,29 +883,6 @@ static void static_dev_create_from_modules(struct udev *udev) fclose(f); } -static int mem_size_mb(void) -{ - FILE *f; - char buf[4096]; - long int memsize = -1; - - f = fopen("/proc/meminfo", "re"); - if (f == NULL) - return -1; - - while (fgets(buf, sizeof(buf), f) != NULL) { - long int value; - - if (sscanf(buf, "MemTotal: %ld kB", &value) == 1) { - memsize = value / 1024; - break; - } - } - - fclose(f); - return memsize; -} - static int systemd_fds(struct udev *udev, int *rctrl, int *rnetlink) { int ctrl = -1, netlink = -1; @@ -1272,13 +1259,13 @@ int main(int argc, char *argv[]) } if (children_max <= 0) { - int memsize = mem_size_mb(); + cpu_set_t cpu_set; - /* set value depending on the amount of RAM */ - if (memsize > 0) - children_max = 16 + (memsize / 8); - else - children_max = 16; + children_max = 8; + + if (sched_getaffinity(0, sizeof (cpu_set), &cpu_set) == 0) { + children_max += CPU_COUNT(&cpu_set) * 2; + } } log_debug("set children_max to %u\n", children_max);