Hannes Reinecke wrote:
Hi all,
Seewer Philippe wrote:
Harald Hoyer wrote:
[ .. ]
Please don't do that. That way we actually loose the benefit of doing as
much in parallel as possible. Instead please consider the patch below.
I've been fiddling with this for a few weeks now. It basically replaces
the current "wait-for-root" loop with a loop that queries the udev-queue
and only exits if either root is available or all udev events have been
processed.
D'accord.
[snip]
Ah, if it were so easy.
This approach work perfectly for any device which does synchronous scanning.
For a device doing asynchronous scan you're out of luck here as the device
might start spitting out udev events at any time, even after the udev
queue is empty.
Damned. I didn't think about that. Any hints how I could simulate that with kvm/qemu?
EG usb or qla2xxx have a habit of doing so. So either you implement
checks for each device (-type) which detects if the device is still
scanning or you indeed just wait until the device appears.
There actually is no problem with the latter, as all the design
goal here is to have _every_ device initialization in the background
/ asynchronously by udev.
So in foreground we indeed just have to wait for the device node
to appear. Even the udev queue check is pointless here; either
we have a device node, in which case we can continue regardless
of how many events are still in the udev queue;
or we don't have one, in which case it quite irrelevant if
udev has still events to process or not.
Just blindly waiting for the node to appear is dangerous. We might not
know which node to wait for or we might not have one at all (like
nfsroot for example). And in cases where the node never appears due to
lack of drivers,hardware,cmdline,... we'd never bail out without a timeout.
Suggestion: What about a solution like this?
while [ ! -d $NEWROOT/proc ] ; do
while [ ! -d $NEWROOT/proc ] ; do
#...current code as in my patch
done
if [ ! -d $NEWROOT/proc ] ; do
# No root around, give devices some time to do things asynchronous
# and settle
sleep 5
# If the queue is still empty, bail
udevadm settle --timeout 1 && break
fi
done
Sleeping is not a real solution, as is just simply fiddling with timeouts.
Same goes for counting, that's why I tried to implement the udev-queue
approach after all. But I can't think of any other solution that does
not poll a devicenode.
--
To unsubscribe from this list: send the line "unsubscribe initramfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html