Skip to contentSkip to conversation

udevd messages lost on exit?

DISCUSSION James Hunt 2 participants 4 messages Sep 30, 2011

lore
Share & tools
lore

James Hunt

author
#0 lore raw

Hi All,

I'm investigating a problem in Ubuntu Oneiric where we think udev messages maybe be getting lost due to the way that we're stopping udevd:

https://bugs.launchpad.net/ubuntu/+source/udev/+bug/818177

In summary, at the end of our initramfs, we are doing this:

  # Stop udevd, we'll miss a few events while we run init, but we catch up
  udevadm control --exit

  # Move /dev to the real filesystem
  mount -n -o move /dev ${rootmnt}/dev

The problem is that most notably when using lvm2 the "--exit" call seems to be causing udev messages relating to the *rootfs* to be lost so that the system fails to boot.

Looking at udevd.c, it does the following when requested to exit:

  /* discard queued events and kill workers */
  event_queue_cleanup(udev, EVENT_QUEUED);
  worker_kill(udev, 0);

I'm currently trying to debug what is left in the queue to get a better handle on this, but I am wondering if "udevadm control --exit" should request that udevd drain the queues rather than discarding the messages for our case. Is the reason the messages are discarded to avoid slowing down the boot coupled with the expectation that the caller will use "udevadm trigger" to catch up later?

Kind regards,

James.

#1 lore raw
Quoted 18 lines · James Hunt

I'm investigating a problem in Ubuntu Oneiric where we think udev messages maybe be getting lost due to the way that we're stopping udevd:

 https://bugs.launchpad.net/ubuntu/+source/udev/+bug/818177

In summary, at the end of our initramfs, we are doing this:

 # Stop udevd, we'll miss a few events while we run init, but we catch up udevadm control --exit

 # Move /dev to the real filesystem
 mount -n -o move /dev ${rootmnt}/dev

The problem is that most notably when using lvm2 the "--exit" call seems to be causing udev messages relating to the *rootfs* to be lost so that the system fails to boot.

Looking at udevd.c, it does the following when requested to exit:

Quoted 8 lines

 /* discard queued events and kill workers */
 event_queue_cleanup(udev, EVENT_QUEUED);
 worker_kill(udev, 0);

I'm currently trying to debug what is left in the queue to get a better handle on this, but I am wondering if "udevadm control --exit" should request that udevd drain the queues rather than discarding the messages for our case. Is the reason the messages are discarded to avoid slowing down the boot coupled with the expectation that the caller will use "udevadm trigger" to catch up later?

--exit just does a clean shutdown, it will not check for pending events, only already running stuff will be properly finished, but nothing new will be started.

If you want queued stuff, queued in udevd or the kernel, to be all handled before exiting, add a call to 'settle' before the --exit call.

Kay

author
#2 lore raw
In reply to James Hunt
Quoted 3 lines · Kay Sievers

--exit just does a clean shutdown, it will not check for pending events, only already running stuff will be properly finished, but nothing new will be started.

So if events are pending in udevd they will be lost unless trigger is called?

Quoted 2 lines

If you want queued stuff, queued in udevd or the kernel, to be all handled before exiting, add a call to 'settle' before the --exit call.

Is that combination atomic?

Kind regards,

James Hunt

#3 lore raw
In reply to James Hunt
Quoted 5 lines · James Hunt
Quoted 3 lines · Kay Sievers

--exit just does a clean shutdown, it will not check for pending events, only already running stuff will be properly finished, but nothing new will be started.

So if events are pending in udevd they will be lost unless trigger is called?

There is no idea at all of any continuous handling of events from initramfs to the real root. These are completely different rule sets and the stuff from initramfs needs to be replayed anyway.

Quoted 3 lines
Quoted 2 lines

If you want queued stuff, queued in udevd or the kernel, to be all handled before exiting, add a call to 'settle' before the --exit call.

Is that combination atomic?

See above. You need to trigger anyway. The rootfs might configure the devices differently than the initramfs. The device database usually much more stuff to carry.

Kay