On Tuesday 08 July 2008 12:16, Vladimir Dronnikov wrote:
> 3. not read -> become a master. open ".modules.dep.do-not-edit!!!" for
> exclusive write. all other concurrent modprobes have to wait till the master
> closes the file.

This "exclusive write" stuff is notorious for breaking on
non-local filesystems, NFS, etc... I prefer the scheme where
atomicity is achieved by rename().

> The spiky edges here are:
> i) by definition it is mandatory locking that is needed to lock
> ".modules.dep.do-not-edit!!!". That way concurrent modprobes just block in
> open() and there's no need for ugly workarounds. Do we have mandatory
> locking?

We do. Sometimes :)

> ii) string xreallocations. but you've introduced xrealloc_vector() which can
> fit.
> 
> I've been using my modprobe about a week.
> 
> When modprove enters alias searching loop, it tries to generate
> > new modprobe.dep.bb for the benefit of other mdprobes, since
> > it is going to scan all modules anyway. It creates
> > modprobe.dep.bb.new with O_EXCL. If that fails, other modprobe
> > is already doing that, so just wait for it to disappear
> > (other modprobe will rename it to modprobe.dep.bb)
> > and use modprobe.dep.bb.
> 
> O_EXCL is definitely not enough here. All 20 concurrents will generate the
> full stuff and then the last spawned will win.

Let me clarify: file is opened with O_CREAT + O_EXCL _before_
modprobe starts expensive directory scan. If it fails with EEXIST,
modprobe understands that it is the "second" one and it will _not_
do the scan. It will wait for modprobe.dep.bb.new to "disappear"
("first" modprobe is expected to do the scan, write out
modprobe.dep.bb.new and rename("modprobe.dep.bb.new", "modprobe.dep.bb")).
At this moment "second" modprobe opens and reads modprobe.dep.bb.

This way, only one modprobe will do the scan.

It is semi-trivial to implement that in modprobe-small.c,
I will try to find the time in next few days for that.
--
vda
_______________________________________________
busybox mailing list
busybox@busybox.net
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to