generic_stop_cpus: prevent parallel execution

Andriy Gapon avg at freebsd.org
Thu Oct 7 17:53:49 UTC 2010


Here is patch that applies the technique from panic() to generic_stop_cpus() to
prevent its parallel execution on multiple CPUs:
http://people.freebsd.org/~avg/generic_stop_cpus.diff

In theory this could lead to two CPUs stopping each other and everyone else, and
thus a total system halt.

Also, in theory, we should have some smarter locking here, because two (or more
CPUs) could be stopping unrelated sets of CPUs.  But in practice, it seems, this
function is only used to stop "all other" CPUs.  Unless I overlooked other usages,
that is.

Additionally, I took this opportunity to make amd64-specific suspend_cpus()
function use generic_stop_cpus() instead of rolling out essentially duplicate
code.  I couldn't see any reason no to consolidate, but perhaps I missed something.

Big thanks to Matthew and his employer for the idea and example.
-- 
Andriy Gapon


More information about the freebsd-hackers mailing list