Re: [PATCH] Limit number of concurrent hotplug processes

From: Andrew Morton
Date: Mon Jul 26 2004 - 15:49:04 EST


Hannes Reinecke <hare@xxxxxxx> wrote:
>
> >
> >> Any comments/suggestions welcome; otherwise please apply.
> >
> >
> > I suggest you just use a semaphore, initialised to a suitable value:
> >
> >
> > static struct semaphore foo = __SEMAPHORE_INITIALIZER(foo, 50);
> >
> >
> > {
> > ...
> > down(&foo);
> > ...
> > up(&foo);
> > ...
> > }
> >
> Hmm; looks good, but: It's not possible to reliably change the maximum
> number of processes on the fly.
>
> The trivial way of course it when the waitqueue is empty and no
> processes are holding the semaphore. But it's quite non-obvious how this
> should work if processes are already holding the semaphore.
> We would need to wait for those processes to finish, setting the length
> of the queue to 0 (to disallow any other process from grabbing the
> semaphore), and atomically set the queue length to the new value.
> Apart from the fact that we would need a worker thread for that
> (otherwise the calling process might block indefinitely), there is no
> guarantee that the queue ever will become empty, as hotplug processes
> might be generated at any time.
>
> Or is there an easier way?

Well if you want to increase the maximum number by ten you do:

for (i = 0; i < 10; i++)
up(&foo);

and similarly for decreasing the limit. That will involve doing down()s,
which will automatically wait for the current number of threads to fall to
the desired level.

But I don't really see a need to tune this on the fly - probably the worse
problem occurs during bootup when the operator cannot perform tuning.

So a __setup parameter seems to be the best way of providing tunability.
Initialise the semaphore in usermodehelper_init().
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/