> > 2. Maintain a global mask of current targets of smp_call_function()
> > CPUs. A given CPU may proceed if it is not a current target
> > and if none of its target CPUs are already in the mask.
> > This mask would be manipulated under a global lock.
> >
> > 3. As in #2 above, but use per-CPU counters. This allows the
> > current CPU to proceed if it is not a target, but also allows
> > concurrent smp_call_function()s to proceed even if their
> > lists of target CPUs overlap.
> >
> > 4. #2 or #3, but where CPUs can proceed freely if their allocation
> > succeeded.
> >
> > 5. If a given CPU is waiting for other CPUs to respond, it polls
> > its own list (with irqs disabled), thus breaking the deadlock.
> > This means that you cannot call smp_call_function() while holding
> > a lock that might be acquired by the called function, but that
> > is not a new prohibition -- the only safe way to hold such a
> > lock is with irqs disabled, and you are not allowed to call
> > the smp_call_function() with irqs disabled in the first place
> > (right?).
> >
> > #5 might actually work...
>
> Yeah, #5 sounds quite promising. I'll see if I can work up a patch for
> that, or if you feel so inclined, I'll definitely take patches :-)
>
> The branch is 'generic-ipi' on git://git.kernel.dk/linux-2.6-block.git
> The link is pretty slow, so it's best pull'ed off of Linus base. Or just
> grab the patches from the gitweb interface:
>
>
http://git.kernel.dk/?p=linux-2.6-block.git;a=shortlog;h=refs/heads/generic-ipi