diff options
Diffstat (limited to 'testing/udev')
-rw-r--r-- | testing/udev/0001-udevd-kill-hanging-event-processes-after-30-seconds.patch | 162 | ||||
-rw-r--r-- | testing/udev/PKGBUILD | 102 | ||||
-rw-r--r-- | testing/udev/udev.install | 65 |
3 files changed, 0 insertions, 329 deletions
diff --git a/testing/udev/0001-udevd-kill-hanging-event-processes-after-30-seconds.patch b/testing/udev/0001-udevd-kill-hanging-event-processes-after-30-seconds.patch deleted file mode 100644 index 3ff89ae43..000000000 --- a/testing/udev/0001-udevd-kill-hanging-event-processes-after-30-seconds.patch +++ /dev/null @@ -1,162 +0,0 @@ -From e64fae5573e566ce4fd9b23c68ac8f3096603314 Mon Sep 17 00:00:00 2001 -From: Kay Sievers <kay.sievers@vrfy.org> -Date: Wed, 18 Jan 2012 05:06:18 +0100 -Subject: [PATCH] udevd: kill hanging event processes after 30 seconds - -Some broken kernel drivers load firmware synchronously in the module init -path and block modprobe until the firmware request is fulfilled. - -The modprobe-generated firmware request is a direct child device of the -device which caused modprobe to run. Child device event are blocked until -the parent device is handled. This dead-locks until the kernel firmware -loading timeout of 60 seconds is reached. - -The hanging modprobe event should now time-out and allow the firmware -event to run before the 60 second kernel timeout. ---- - src/udev-event.c | 2 +- - src/udevd.c | 62 +++++++++++++++++++++++++++++++++++++++++++---------- - 2 files changed, 51 insertions(+), 13 deletions(-) - -diff --git a/src/udev-event.c b/src/udev-event.c -index 9bdc518..f0b9548 100644 ---- a/src/udev-event.c -+++ b/src/udev-event.c -@@ -49,7 +49,7 @@ struct udev_event *udev_event_new(struct udev_device *dev) - udev_list_init(udev, &event->run_list, false); - event->fd_signal = -1; - event->birth_usec = now_usec(); -- event->timeout_usec = 60 * 1000 * 1000; -+ event->timeout_usec = 30 * 1000 * 1000; - dbg(event->udev, "allocated event %p\n", event); - return event; - } -diff --git a/src/udevd.c b/src/udevd.c -index 11ab19a..77a1e79 100644 ---- a/src/udevd.c -+++ b/src/udevd.c -@@ -133,6 +133,7 @@ struct worker { - struct udev_monitor *monitor; - enum worker_state state; - struct event *event; -+ unsigned long long event_start_usec; - }; - - /* passed from worker to main process */ -@@ -372,6 +373,7 @@ out: - close(fd_inotify); - close(worker_watch[WRITE_END]); - udev_rules_unref(rules); -+ udev_builtin_exit(udev); - udev_monitor_unref(worker_monitor); - udev_unref(udev); - udev_log_close(); -@@ -389,6 +391,7 @@ out: - worker->monitor = worker_monitor; - worker->pid = pid; - worker->state = WORKER_RUNNING; -+ worker->event_start_usec = now_usec(); - worker->event = event; - event->state = EVENT_RUNNING; - udev_list_node_append(&worker->node, &worker_list); -@@ -419,6 +422,7 @@ static void event_run(struct event *event) - worker_ref(worker); - worker->event = event; - worker->state = WORKER_RUNNING; -+ worker->event_start_usec = now_usec(); - event->state = EVENT_RUNNING; - return; - } -@@ -610,9 +614,11 @@ static void worker_returned(int fd_worker) - continue; - - /* worker returned */ -- worker->event->exitcode = msg.exitcode; -- event_queue_delete(worker->event, true); -- worker->event = NULL; -+ if (worker->event) { -+ worker->event->exitcode = msg.exitcode; -+ event_queue_delete(worker->event, true); -+ worker->event = NULL; -+ } - if (worker->state != WORKER_KILLED) - worker->state = WORKER_IDLE; - worker_unref(worker); -@@ -796,7 +802,7 @@ static void handle_signal(struct udev *udev, int signo) - } - - if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { -- if (worker->event != NULL) { -+ if (worker->event) { - err(udev, "worker [%u] failed while handling '%s'\n", - pid, worker->event->devpath); - worker->event->exitcode = -32; -@@ -1574,25 +1580,57 @@ int main(int argc, char *argv[]) - break; - - /* timeout at exit for workers to finish */ -- timeout = 60 * 1000; -- } else if (udev_list_node_is_empty(&event_list) && children > 2) { -- /* set timeout to kill idle workers */ -- timeout = 3 * 1000; -- } else { -+ timeout = 30 * 1000; -+ } else if (udev_list_node_is_empty(&event_list) && children <= 2) { -+ /* we are idle */ - timeout = -1; -+ } else { -+ /* kill idle or hanging workers */ -+ timeout = 3 * 1000; - } - fdcount = epoll_wait(fd_ep, ev, ARRAY_SIZE(ev), timeout); - if (fdcount < 0) - continue; - - if (fdcount == 0) { -+ struct udev_list_node *loop; -+ -+ /* timeout */ - if (udev_exit) { -- info(udev, "timeout, giving up waiting for workers to finish\n"); -+ err(udev, "timeout, giving up waiting for workers to finish\n"); - break; - } - -- /* timeout - kill idle workers */ -- worker_kill(udev, 2); -+ /* kill idle workers */ -+ if (udev_list_node_is_empty(&event_list)) { -+ info(udev, "cleanup idle workers\n"); -+ worker_kill(udev, 2); -+ } -+ -+ /* check for hanging events */ -+ udev_list_node_foreach(loop, &worker_list) { -+ struct worker *worker = node_to_worker(loop); -+ -+ if (worker->state != WORKER_RUNNING) -+ continue; -+ -+ if ((now_usec() - worker->event_start_usec) > 30 * 1000 * 1000) { -+ err(udev, "worker [%u] timeout, kill it\n", worker->pid, -+ worker->event ? worker->event->devpath : "<idle>"); -+ kill(worker->pid, SIGKILL); -+ worker->state = WORKER_KILLED; -+ /* drop reference taken for state 'running' */ -+ worker_unref(worker); -+ if (worker->event) { -+ err(udev, "seq %llu '%s' killed\n", -+ udev_device_get_seqnum(worker->event->dev), worker->event->devpath); -+ worker->event->exitcode = -64; -+ event_queue_delete(worker->event, true); -+ worker->event = NULL; -+ } -+ } -+ } -+ - } - - is_worker = is_signal = is_inotify = is_netlink = is_ctrl = false; --- -1.7.8.3 - diff --git a/testing/udev/PKGBUILD b/testing/udev/PKGBUILD deleted file mode 100644 index 2a30f0dce..000000000 --- a/testing/udev/PKGBUILD +++ /dev/null @@ -1,102 +0,0 @@ -# $Id: PKGBUILD 147236 2012-01-24 23:31:40Z tomegun $ -# Maintainer: Tom Gundersen <teg@jklm.no> -# Contributor: Aaron Griffin <aaron@archlinux.org> -# Contributor: Tobias Powalowski <tpowa@archlinux.org> -# Contributor: Thomas Bächler <thomas@archlinux.org> - -pkgbase="udev" -pkgname=('udev' 'udev-compat') -pkgver=179 -pkgrel=1 -arch=(i686 x86_64) -url="http://git.kernel.org/?p=linux/hotplug/udev.git;a=summary" -license=('GPL') -groups=('base') -options=(!makeflags !libtool) -makedepends=('gobject-introspection' 'gperf' 'libxslt' 'usbutils' 'kmod') -source=(ftp://ftp.kernel.org/pub/linux/utils/kernel/hotplug/$pkgbase-$pkgver.tar.xz) - -build() { - cd $srcdir/$pkgbase-$pkgver - - ./configure --prefix=/usr \ - --with-rootprefix= \ - --sysconfdir=/etc \ - --bindir=/sbin \ - --libdir=/usr/lib \ - --with-rootlibdir=/lib \ - --libexecdir=/lib \ - --with-systemdsystemunitdir=/lib/systemd/system \ - --enable-udev_acl - - make -} - -package_udev() { - pkgdesc="The userspace dev tools (udev)" - depends=('util-linux' 'libusb-compat' 'glib2' 'kmod' 'pciutils' 'usbutils' 'pciutils') - install=udev.install - backup=(etc/udev/udev.conf) - - cd $srcdir/$pkgbase-$pkgver - make DESTDIR=${pkgdir} install - - # create framebuffer blacklist - install -d -m755 ${pkgdir}/lib/modprobe.d/ - for mod in $(find /lib/modules/*/kernel/drivers/video -name '*fb.ko.gz' -exec basename {} .ko.gz \;); do - echo "blacklist $mod" - done | sort -u > $pkgdir/lib/modprobe.d/framebuffer_blacklist.conf - - # /dev/loop0 is created for convenience, to autoload the module if necessary - # this is no longer needed when util-linux-2.21 is released as /dev/loop-control - # will be used instead. In that case move this to udev-compat - install -d -m755 ${pkgdir}/lib/udev/devices/ - mknod ${pkgdir}/lib/udev/devices/loop0 b 7 0 - chgrp disk ${pkgdir}/lib/udev/devices/loop0 - - # udevd moved, symlink to make life easy for restarting udevd manually - ln -s /lib/udev/udevd ${pkgdir}/sbin/udevd - - # Replace dialout/tape/cdrom group in rules with uucp/storage/optical group - for i in $pkgdir/lib/udev/rules.d/*.rules; do - sed -i -e 's#GROUP="dialout"#GROUP="uucp"#g; - s#GROUP="tape"#GROUP="storage"#g; - s#GROUP="cdrom"#GROUP="optical"#g' $i - done -} - -package_udev-compat() { - pkgdesc="The userspace dev tools (udev) - additional rules for older kernels" - depends=('udev') - groups=('') - install -d -m755 ${pkgdir}/lib/udev/rules.d - install -D -m644 ${srcdir}/${pkgbase}-${pkgver}/rules/misc/30-kernel-compat.rules ${pkgdir}/lib/udev/rules.d/30-kernel-compat.rules - - # create static nodes to be compatible with on-demand module - # loading in the most recent kernel - # - # the list of nodes is generated from /lib/modules/`most recent kernel`/modprobe.devname - # excluding any devices not included in the LTS kernel and any entries in the - # modprobe.devname file of the LTS kernel (if it exists). - - install -d -m755 ${pkgdir}/lib/udev/devices - cd ${pkgdir}/lib/udev/devices - - install -d -m755 net - mknod net/tun c 10 200 - mknod ppp c 108 0 -# mknod loop-control c 10 237 -- does not exist in old kernels - mknod uinput c 10 223 - install -d -m755 mapper - mknod mapper/control c 10 236 - install -d -m755 snd - mknod snd/timer c 116 33 - mknod snd/seq c 116 1 - mknod btrfs-control c 10 234 - mknod autofs c 10 235 - mknod fuse c 10 229 - install -d -m755 cpu - mknod cpu/microcode c 10 184 - -} -md5sums=('7d2880f66ea39146aae928f19ff3ca09') diff --git a/testing/udev/udev.install b/testing/udev/udev.install deleted file mode 100644 index c49c5006f..000000000 --- a/testing/udev/udev.install +++ /dev/null @@ -1,65 +0,0 @@ -# arg 1: the new package version -# arg 2: the old package version - -post_upgrade() { - if [ "$(vercmp $2 175)" -lt 0 ]; then - echo "ATTENTION UDEV:" - echo "----------" - if [ "$(vercmp $2 168)" -lt 0 ]; then - echo "Kernel 2.6.32 or newer is now required." - echo " --" - echo "OSS emulation modules are not loaded by default, add to rc.conf if needed." - echo " --" - echo "Arch specific cd symlinks are now no longer created." - echo " --" - echo "cd and net persistent rules will no longer be autogenerated," - echo "see <https://wiki.archlinux.org/index.php/Udev> for details." - echo " --" - echo "Errors are now logged (possibly to the console) by default." - echo " --" - fi - if [ "$(vercmp $2 171)" -lt 0 ]; then - echo "Arch's custom blacklisting logic has been removed. MOD_AUTOLOAD and" - echo "blacklisting in MODULES no longer works." - echo "See 'man modprobe.conf' for a replacement to blacklisting." - echo "To disable a module mod1 on the kernel command line, use" - echo "mod1.disable=1" - echo "or" - echo "modprobe.blacklist=mod1" - echo " --" - echo "The following modules are no longer unconditionally loaded:" - echo " pcspkr irtty-sir analog lp ppdev ide-generic" - echo "Add them to MODULES in rc.conf if you need them." - echo " --" - fi - if [ "$(vercmp $2 172)" -lt 0 ]; then - echo "Blacklisting of framebuffer devices has moved from /etc/modprobe.d to" - echo "/lib/modprobe.d. Any customizations shoud be done to the file in /etc, as it" - echo "takes precedence." - echo " --" - echo "kbd and rtc devices are no longer world readable." - echo " --" - echo "rtc is no longer in the audio group and fb devices are no longer in" - echo "the video group, as permissions and ownership of fb devices are controlled" - echo "by X." - echo " --" - fi - if [ "$(vercmp $2 174)" -lt 0 ]; then - echo "We now use upstream rules for assigning devices to the 'disk', 'optical'," - echo "'scanner' and 'video' groups. Beware of any changes." - echo " --" - echo "We no longer create symlinks from /dev/<dev> to /dev/<dev>0." - echo " --" - echo "For security reasons, we no longer add devices to the 'storage' group. Use" - echo "udisks and friends, or add custom rules to /etc/udev.d/rules/, if you want" - echo "this functionality back." - echo " --" - echo "We no longer create the static nodes on install needed for an initrd-less boot" - echo "where devtmpfs is not mounted by the kernel, this only affects fresh installs." - echo " --" - fi - echo "devtmpfs support is now a hard requirement. Users of the official Arch kernels" - echo "have this enabled." - echo "---------------" - fi -} |