old-www/HOWTO/text/SMP-HOWTO

2369 lines
67 KiB
Plaintext
Raw Permalink Blame History

Linux SMP HOWTO
Enkh Tumenbayar, etumenba@ouray.cudenver.edu
v1.4, 9 july 2002
This HOWTO reviews main issues (and I hope solutions) related to SMP
configuration under Linux.
______________________________________________________________________
Table of Contents
1. Licensing
2. Introduction
3. Questions related to any architectures
3.1 Kernel Side
3.2 User Side
3.3 SMP Programming
3.3.1 Parallelization methods
3.3.2 The C Library
3.3.3 Languages, Compilers and debuggers
3.3.4 Other libraries
3.3.5 Other points about SMP Programming
3.4 MultiProcessor Specification Support (MPS)
3.4.1 Symmetric I/O Mode
3.4.2 Floating Point Exception Interrupt
3.4.3 Multiple I/O APIC Configurations
3.4.4 MP Configuration Table
3.4.5 MP Configuration Table Header Fields
3.4.6 Extended MP Configuration Table Entries
4. x86 architecture specific questions
4.1 Why it doesn't work on my machine?
4.2 Possible causes of crash
4.3 Motherboard specific information
4.3.1 Motherboards with known problems
4.4 Low cost SMP Linux box (dual Celeron box)
4.4.1 Is it possible to run a dual Intel Celeron box ?
4.4.2 How does Linux behave on a dual Celeron system ?
4.4.3 Celeron processors are known to be easily overclockable. And dual Celeron system ?
4.4.4 And making a quad Celeron system ?
4.4.5 What about mixing Celeron and Pentium II processor ?
5. Sparc architecture specific questions
5.1 Which Sparc machines are supported ?
5.2 Specific problem related to Sparc SMP support
6. PowerPC architecture specific questions
6.1 Which PPC machines are supported ?
6.2 Specific problem related to PPC SMP support
7. Alpha architecture specific questions
7.1 Which Alpha machines are supported ?
7.2 Specific problem related to Alpha SMP support
8. Useful pointers
8.1 Various
8.2 Multithreaded programs and library
8.3 SMP specific patches
8.4 Parallelizing/Optimizing Compilers for 586/686 machines (
9. Glossary
9.1 Definitions
9.2 Concepts
10. What's new ?
11. List of contributors
______________________________________________________________________
1. Licensing
This document is made available under the terms of the GNU Free
Documentation License. You should have received a copy with it. If
not, it is available online at http://www.fsf.org/licenses/fdl.html.
2. Introduction
Linux works on SMP (Symmetric Multi-Processors) machines. SMP support
was introduced with kernel version 2.0, and has improved steadily ever
since.
HOWTO maintained by Enkh Tumenbayar (etumenba@ouray.cudenver.edu). The
latest edition of this HOWTO can be found at
<20> http://ouray.cudenver.edu/~etumenba/smp-howto/ (USA)
If you want to contribute to this HOWTO, I would prefer a diff against
the SGML version. If you send me an email about this HOWTO, please
include a tag like [Linux SMP HOWTO] in the Subject: field of your e-
mail. It helps me to automatically sort mails (and you will have a
faster reply ;)).
This HOWTO is an improvement of a first draft
<http://www.ihoc.net/linux-smp-faq-draft.html> made by Chris Pirih and
maintained by David Mentre.
All information contained in this HOWTO is provided "as is." All
warranties, expressed, implied or statutory, concerning the accuracy
of the information of the suitability for any particular use are
hereby specifically disclaimed. While every effort has been taken to
ensure the accuracy of the information contained in this HOWTO, the
authors assume no responsibility for errors or omissions, or for
damages resulting from the use of the information contained herein.
3. Questions related to any architectures
3.1. Kernel Side
1. Does Linux support multi-threading? If I start two or more
processes, will they be distributed among the available CPUs?
Yes. Processes and kernel-threads are distributed among processors.
User-space threads are not.
2. What kind of architectures are supported in SMP?
From Alan Cox:
SMP is supported in 2.0 on the hypersparc (SS20, etc.) systems
and Intel 486, Pentium or higher machines which are Intel
MP1.1/1.4 compliant. Richard Jelinek adds: right now, systems
have been tested up to 4 CPUs and the MP standard (and so Linux)
theoretically allows up to 16 CPUs.
SMP support for UltraSparc, SparcServer, Alpha and PowerPC
machines is in available in 2.2.x.
From Ralf B<>chle:
MIPS, m68k and ARM does not support SMP; the latter two probly
won't ever.
That is, I'm going to hack on MIPS-SMP as soon as I get a SMP
box ...
3. Does SMP distribute the threads among the processors or is the
library the one in charge of it?
(Matti Aarnio) The way Linux implements threads is to treat them at
scheduling the same way as any process - thread just happens to
share several resources of the originating process; memory space,
file descriptors. See clone(2) for part of explanation.
4. How do I make a Linux SMP kernel?
Most Linux distributions don't provide a ready-made SMP-aware
kernel, which means that you'll have to make one yourself. If you
haven't made your own kernel yet, this is a great reason to learn
how. Explaining how to make a new kernel is beyond the scope of
this document; refer to the Linux Kernel Howto for more
information. (C. Polisher)
Configure the kernel and answer Y to CONFIG_SMP.
If you are using LILO, it is handy to have both SMP and non-SMP
kernel images on hand. Edit /etc/lilo.conf to create an entry for
another kernel image called "linux-smp" or something.
The next time you compile the kernel, when running a SMP kernel,
edit linux/Makefile and change "MAKE=make" to "MAKE=make -jN"
(where N = number of CPU + 1, or if you have tons of memory/swap
you can just use "-j" without a number). Feel free to experiment
with this one.
Of course you should time how long each build takes :-) Example:
___________________________________________________________________
make config
time -v sh -c 'make dep ; make clean install modules modules_install'
___________________________________________________________________
If you are using some Compaq MP compliant machines you will need to
set the operating system in the BIOS settings to "Unix
In kernel series 2.0 up to but not including 2.1.132, uncomment the
SMP=1 line in the main Makefile (/usr/src/linux/Makefile).
In the 2.2 version, configure the kernel and answer "yes" to the
question "Symmetric multi-processing support" (Michael Elizabeth
Chastain).
AND
enable real time clock support by configuring the "RTC support" item
(in "Character Devices" menu) (from Robert G. Brown). Note that
inserting RTC support actually doesn't afaik prevent the known problem
with SMP clock drift, but enabling this feature prevents lockup when
the clock is read at boot time. A note from Richard Jelinek says also
that activating the Enhanced RTC is necessary to get the second CPU
working (identified) on some original Intel Mainboards.
AND
(x86 kernel) do NOT enable APM (advanced power management)! APM and
SMP are not compatible, and your system will almost certainly (or at
least probably ;)) crash while booting if APM is enabled (Jakob
Oestergaard). Alan Cox confirms this : 2.1.x turns APM off for SMP
boxes. Basically APM is undefined in the presence of SMP systems, and
anything could occur.
AND
(x86 kernel) enable "MTRR (Memory Type Range Register) support". Some
BIOS are buggy as they do not activate cache memory for the second
processor. The MTRR support contains code that solves such processor
misconfiguration.
You must rebuild all your kernel and kernel modules when changing to
and from SMP mode. Remember to make modules and make modules_install
(from Alan Cox).
If you get module load errors, you probably did not rebuild and/or re-
install your modules. Also with some 2.2.x kernels people have
reported problems when changing the compile from SMP back to UP (uni-
processor). To fix this, save your .config file, do make mrproper,
restore your .config file, then remake your kernel (make dep, etc.)
(Wade Hampton). Do not forget to run lilo after copying your new
kernel.
Recap:
______________________________________________________________________
make config # or menuconfig or xconfig
make dep
make clean
make bzImage # or whatever you want
# copy the kernel image manually then RUN LILO
# or make lilo
make modules
make modules_install
______________________________________________________________________
5. How do I make a Linux non-SMP kernel?
In the 2.0 series, comment the SMP=1 line in the main Makefile
(/usr/src/linux/Makefile).
In the 2.2 series, configure the kernel and answer "no" to the
question "Symmetric multi-processing support" (Michael Elizabeth
Chastain).
You must rebuild all your kernel and kernel modules when changing
to and from SMP mode. Remember to make modules and make
modules_install and remember to run lilo. See notes above about
possible configuration problems.
6. How can I tell if it worked?
cat /proc/cpuinfo
Typical output (dual PentiumII):
______________________________________________________________________
processor : 0
cpu : 686
model : 3
vendor_id : GenuineIntel
[...]
bogomips : 267.06
processor : 1
cpu : 686
model : 3
vendor_id : GenuineIntel
[...]
bogomips : 267.06
______________________________________________________________________
7. What is the status of converting the kernel toward finer grained
locking and multithreading?
Linux kernel version 2.2 has signal handling, interrupts and some
I/O stuff fine grain locked. The rest is gradually migrating. All
the scheduling is SMP safe.
Kernel version 2.3 (next 2.4) has really fine grained locking. In
the 2.3 kernels the usage of the big kernel lock has basically
disappeared, all major Linux kernel subsystems are fully threaded:
networking, VFS, VM, IO, block/page caches, scheduling, interrupts,
signals, etc. (Ingo Molnar)
8. What has changed between 2.2.x and 2.4.x kernels?
(Mark Hahn) In many parts of the kernel, there's little relation
between 2.2 and 2.4. One of the biggest changes is SMP - not just
the evolutionary fine-graining of locks, but the radically revamped
VM, memory management, interrupt handling that's basically
unrelated to 2.2, fairly revolutionary net changes (thread and
zero-copy), etc.
In short, 2.2 doesn't use the hardware like 2.4 does.
9. Does Linux SMP support processor affinity?
Standard kernel
No and Yes. There is no way to force a process onto specific
CPU's but the linux scheduler has a processor bias for each
process, which tends to keep processes tied to a specific CPU.
Patch
Yes. Look at PSET - Processor Sets for the Linux kernel
<http://isunix.it.ilstu.edu/~thockin/pset/>:
The goal of this project is to make a source compatible
and functionally equivalent version of pset (as defined
by SGI - partially removed from their IRIX 6.4 kernel)
for Linux. This enables users to determine which proces<65>
sor or set of processors a process may run on. Possible
uses include forcing threads to separate processors, tim<69>
ings, security (a `root' only CPU?) and probably more.
It is focused around the syscall sysmp(). This function takes a
number of parameters that determine which function is requested.
Functions include:
<20> binding a process/thread to a specific CPU
<20> restricting a CPU's ability to execute some processes
<20> restricting a CPU from running at all
<20> forcing a cpu to run _only_ one process (and its children)
<20> getting information about a CPU's state
<20> creating/destroying sets of processors, to which processes may
be bound
10.
Where should one report SMP bugs to?
Please report bugs to linux-smp@vger.kernel.org.
11.
What about SMP performance?
If you want to gauge the performance of your SMP system, you can
run some tests made by Cameron MacKinnon and available at
http://www.phy.duke.edu/brahma/benchmarks.smp.
Also have a look at this article by Bryant, Hartner, Qi and
Venkitachalam that compares 2.2 and 2.3/2.4 UP and SMP kernels :
SMP Scalability Comparisons of Linux<75> Kernels 2.2.14 and 2.3.99
<http://www.usenix.org/publications/library/proceedings/als2000/bryantscale.html>
(Ray Bryant) (You'll find also a copy here <bryantscale.pdf>)
3.2. User Side
1. Do I really need SMP?
If you have to ask, you probably don't. :) Generally, multi-
processor systems can provide better performance than uni-processor
systems, but to realize any gains you need to consider many other
factors besides the number of CPU's. For instance, on a given
system, if the processor is generally idle much of the time due to
a slow disk drive, then this system is "input/output bound", and
probably won't benefit from additional processing power. If, on the
other hand, a system has many simultaneously executing processes,
and CPU utilization is very high, then you are likely to realize
increased system performance. SCSI disk drives can be very
effective when used with multiple processors, due to the way they
can process multiple commands without tying up the CPU. (C.
Polisher)
2. Do I get the same performance from 2-300 MHz processors as from one
600 MHz processor?
This depends on the application, but most likely not. SMP adds
some overhead that a faster uniprocessor box would not incur (Wade
Hampton). :)
3. How does one display mutiple cpu performance?
Thanks to Samuel S. Chessman, here are some useful utilities:
Character based:
http://www.cs.inf.ethz.ch/~rauch/procps.html
Basically, it's procps v1.12.2 (top, ps, et. al.) and some
patches to support SMP.
For 2.2.x, Gregory R. Warnes as made a patch available at
http://queenbee.fhcrc.org/~warnes/procps
Graphic:
xosview-1.5.1 supports SMP. And kernels above 2.1.85 (included)
the cpuX entry in /proc/stat file.
The official homepage for xosview is:
http://lore.ece.utexas.edu/~bgrayson/xosview.html
You'll find a version patched for 2.2.x kernels by Kumsup Lee :
http://www.ima.umn.edu/~klee/linux/xosview-1.6.1-5a1.tgz
By the way, you can't monitor processor scheduling precisely with
xosview, as xosview itself causes a scheduling perturbation. (H.
Peter Anvin)
And Rik van Riel tell us why:
The answer is pretty simple. Basically there are 3 processes
involved:
a. the cpu hog (low scheduling priority because it eats
CPU)
b. xosview
c. X
The CPU hog is running on one CPU. Then xosview wakes up (on
the other CPU) and starts sending commands to X, which wakes
up as well.
Since both X and xosview have a much higher priority than
the CPU hog, xosview will run on one CPU and X on the other.
Then xosview stops running and we have an idle CPU --> Linux
moves the CPU hog over to the newly idle CPU (X is still
running on the CPU our hog was running on just before).
4. How can I enable more than 1 process for my kernel compile?
use:
___________________________________________________________________
# make [modules|zImage|bzImages] MAKE="make -jX"
where X=max number of processes.
WARNING: This won't work for "make dep".
___________________________________________________________________
With a 2.2 like kernel, see also the file
/usr/src/linux/Documentation/smp.txt for specific instruction.
BTW, since running multiple compilers allows a machine with sufficient
memory to use use the otherwise wasted CPU time during I/O caused
delays, make MAKE="make -j 2" -j 2 actually helps even on uniprocessor
boxes (from Ralf B<>chle).
5. Why is the time given by the time command inaccurate? (from Joel
Marchand)
In the 2.0 series, the result given by the time command is false.
The sum user+system is right *but* the spreading between user and
system time is false.
More precisely: "The explanation is, that all time spent in
processors other than the boot cpu is accounted as system time. If
you time a program, add the user time and the system time, then you
timing will be almost right, except for also including the system
time that is correctly accounted for" (Jakob <20>stergaard).
This bug is corrected in 2.2 kernels.
3.3. SMP Programming
Section by Jakob <20>stergaard.
This section is intended to outline what works, and what doesn't when
it comes to programming multi-threaded software for SMP Linux.
3.3.1. Parallelization methods
1. POSIX Threads
2. PVM / MPI Message Passing Libraries
3. fork() -- Multiple processes
Since both fork() and PVM/MPI processes usually do not share memory,
but either communicate by means of IPC or a messaging API, they will
not be described further in this section. They are not very specific
to SMP, since they are used just as much - or more - on uniprocessor
computers, and clusters thereof.
Only POSIX Threads provide us with multiple threads sharing ressources
like - especially - memory. This is the thing that makes a SMP machine
special, allowing many processors to share their memory. To use both
(or more ;) processors of an SMP, use a kernel-thread library. A good
library is the LinuxThreads, a pthread library made by Xavier Leroy
<http://pauillac.inria.fr/~xleroy/linuxthreads/> which is now
integrated with glibc2 (aka libc6). Newer Linux distributions include
this library by default, hence you do not have to obtain a separate
package to use kernel threads.
There are implementations of threads (and POSIX threads) that are
application-level, and do not take advantage of the kernel-threading.
These thread packages keep the threading in a single process, hence do
not take advantage of SMP. However, they are good for many
applications and tend to actually run faster than kernel-threads on
single processor systems.
Multi-threading has never been really popular in the UN*X world
though. For some reason, applications requiring multiple processes or
threads, have mostly been written using fork(). Therefore, when using
the thread approach, one runs into problems of incompatible (not
thread-ready) libraries, compilers, and debuggers. GNU/Linux is no
exception to this. Hopefully the next few sections will sched a little
light over what is currently possible, and what is not.
3.3.2. The C Library
Older C libraries are not thread-safe. It is very important that you
use GNU LibC (glibc), also known as libc6. Earlier versions are, of
course possible to use, but it will cause you much more trouble than
upgrading your system will, well probably :)
If you want to use GDB to debug your programs, see below.
3.3.3. Languages, Compilers and debuggers
There is a wealth of programming languages available for GNU/Linux,
and many of them can be made to use threads one way or the other (some
languages like Ada and Java even have threads as primitives in the
language).
This section will, however, currently only describe C and C++. If you
have experience in SMP Programming with other languages, please
enlighten us.
GNU C and C++, as well as the EGCS C and C++ compilers work with the
thread support from the standard C library (glibc). There are however
a few issues:
1. When compiling C or C++, use the -D_REENTRANT define in the
compiler command line. This is necessary to make certain error-
handling functions work like the errno variable.
2. When using C++, If two threads throw exceptions concurrently, the
program will segfault. The compiler does not generate thread-safe
exception code.
The workaround is to put a
pthread_mutex_lock(&global_exception_lock) in the constructor(s) of
every class you throw(), and to put the corresponding
pthread_mutex_unlock(...) in the destructor. It's ugly, but it
works. This solution was given by Markus Ferch.
The GNU Debugger GDB as of version 4.18, should handle threads
correctly. Most Linux distribution offer a patched, thread-aware gdb.
It is not necessary to patch glibc in any way just to make it work
with threads. If you do not need to debug the software (this could be
true for all machines that are not development workstations), there is
no need to patch glibc.
Note that core-dumps are of no use when using multiple threads.
Somehow, the core dump is attached to one of the currently running
threads, and not to the program as a whole. Therefore, whenever you
are debugging anything, run it from the debugger.
Hint: If you have a thread running haywire, like eating 100% CPU time,
and you cannot seem to figure out why, here is a nice way to find out
what's going on: Run the program straight from the shell, no GDB. Make
the thread go haywire. Use top to get the PID of the process. Run GDB
like gdb program pid. This will make GDB attach itself to the process
with the PID you specified, and stop the thead. Now you have a GDB
session with the offending thread, and can use bt and the like to see
what is happening.
3.3.4. Other libraries
ElectricFence: This library is not thread safe. It should be possible,
however, to make it work in SMP environments by inserting mutex locks
in the ElectricFence code.
3.3.5. Other points about SMP Programming
1. Where can I found more information about parallel programming?
Look at the Linux Parallel Processing HOWTO
<http://yara.ecn.purdue.edu/~pplinux/PPHOWTO/pphowto.html>
Lots of useful information can be found at Parallel Processing
using Linux <http://yara.ecn.purdue.edu/~pplinux/>
Look also at the Linux Threads FAQ <http://linas.org/linux/threads-
faq.html>
2. Are there any threaded programs or libraries?
Yes. For programs, you should look at: Multithreaded programs on
linux <http://www.informatik.uni-bremen.de/~hollow/mthread.html> (I
love hyperlinks, did you know that ? ;))
As far as library are concerned, there are:
OpenGL Mesa library
Thanks to David Buccarelli, Andreas Schiffler and Emil Briggs,
it exists in a multithreaded version (right now [1998-05-11],
there is a working version that provides speedups of 5-30% on
some OpenGL benchmarks). The multithreaded stuff is now included
in the regular Mesa distribution as an experimental option. For
more information, look at the Mesa library
<http://www.ssec.wisc.edu/~brianp/Mesa.html>
BLAS
Pentium Pro Optimized BLAS and FFTs for Intel Linux
<http://www.cs.utk.edu/~ghenry/distrib/>
Multithreaded BLAS routines are not available right now, but a
dual proc library is planned for 1998-05-27, see Blas News
<http://www.cs.utk.edu/~ghenry/distrib/blasnews> for details.
The GIMP
Emil Briggs, the same guy who is involved in multithreaded Mesa,
is also working on multithreaded The GIMP plugins. Look at
http://nemo.physics.ncsu.edu/~briggs/gimp/index.html for more
info.
3.4. MultiProcessor Specification Support (MPS)
(Randy Dunlap) Linux supports MPS (MP spec.) version 1.1 and 1.4.
Linux doesn't have full support for all of MPS version 1.4.
Experience has shown that Linux usually works best when the BIOS is
configure for MP Spec. version 1.1 if that is an option in your
system's BIOS. I don't see why the MP Spec. version should matter to
Linux, but it would be an interesting exercise to find out the
differences as presented by BIOS tables, to determine why Linux fails
with MP Spec. version 1.4 in some cases, and to fix Linux so that this
wouldn't matter.
This document summarizes the major changes in MP spec. version 1.4 and
their support status in Linux.
3.4.1. Symmetric I/O Mode
The hardware must support a mode of operation in which the system can
switch easily to Symmetric I/O mode from PIC or Virtual Wire mode.
When the operating system is ready to swtich to MP operation, it
writes a 01H to the IMCR register, if that register is implemented,
and enables I/O APIC Redirection Table entries. The hardware must not
require any other action on the part of software to make the
transition to Symmetric I/O mode.
Linux recognizes and supports this MP configuration mode.
3.4.2. Floating Point Exception Interrupt
For PC/AT compatibility, the bootstrap processor must support DOS-
compatible FPU execution and exception handling while running in
either of the PC/AT-compatible modes. This means that floating point
error signals from the BSP must be routed to the interrupt request 13
signal, IRQ13, when the system is in PIC or virtual wire mode. While
floating point error signals from an application processor need not be
routed to IRQ13, platform designers may choose to connect the two. For
example, connecting the floating point error signal from application
processors to IRQ13 can be useful in the case of a platform that
supports dynamic choice of BSP during boot.
In symmetric mode, a compliant system supports only on-chip floating
point units, with error signaling via interrupt vector 16. Operating
systems must use interrupt vector 16 to manage floating point
exceptions when the system is in symmetric mode.
Linux does not use the floating point interrupt at all except in
genuine i386 processor systems which are not SMP-capable. [In these
systems, if they wire the FPU exception line in the PC/AT-compatible
way, a run-time check for #MF exception availability is performed. If
the #MF exception is available, then Linux handles this interrupt if
it happens. (Maciej W. Rozycki)
3.4.3. Multiple I/O APIC Configurations
Multiple I/O APICs are supported in Linux.
3.4.4. MP Configuration Table
This table was made optional in MPS version 1.4. If the table isn't
present, one of the default configurations should be used. An extended
section was also added to it for new table entry types.
Linux supports the optional MP Configuration Table and uses a default
configuration if the MP Config. Table is not present.
Linux tolerates extended section table entries by skipping over them
if they are found. Data in the extended table entries is not used.
3.4.5. MP Configuration Table Header Fields
New or changed fields for MP Spec. version 1.4:
<20> OEM Table Pointer: supported in Linux
<20> Extended Table Length: supported (tolerated, skipped) in Linux
<20> Extended Table Checksum: supported (tolerated, skipped) in Linux
3.4.6. Extended MP Configuration Table Entries
Entry types for System Address Space Mapping, Bus Hierarchy
Descriptor, and Compatibility Bus Address Space Modifier are defined.
Linux skips over (does not use) these extended MP Configuration table
entries. Apparently this isn't critical to any shipping systems.
4. x86 architecture specific questions
4.1. Why it doesn't work on my machine?
1. Can I use my Cyrix/AMD/non-Intel CPU in SMP?
Yes. Current AMD Athlon MP processors support SMP with the AMD
760MP chipset. There are several boards available featuring this
chipset, e.g. from Tyan, ASUS, etc. Athlon/SMP is supported by
recent 2.4.x kernels and also by the latest 2.2.x kernels. (David
Haring)
2. Why doesn't my old Compaq work?
Put it into MP1.1/1.4 compliant mode.
check "Configure Hardware" -> "View / Edit details" -> "Advanced
mode" (F7 I think) for a configuration option "APIC mode" and set
this to "full Table mode". This is an official Compaq
recommandation. (Daniel Roesen)
(Adrian Portelli)To do this:
a. Press F10 when the server boots to enter the System
Configuration Utility
b. Press Enter to dismiss the splash screen
c. Immediately press CTRL+A
d. A message will appear informing you that you are now in
"Advanced Mode"
e. Then select "Configure Hardware" -> "View / Edit details"
f. You will then see the advanced settings (intermixed with the
ordinary ones)
g. Stroll down to "APIC Mode" and then select "Fully Mapped"
h. Save changes and reboot
3. I can't get my Compaq SystemPro work in SMP mode.
(Maciej W. Rozycki) Chances are that your Compaq do not make use of
82489DX APICs as they were introduced quite late -- in late 1992 or
early 1993. There used to be i486 machines that implemented the
APIC architecture. 82489DX is the chip that was used for them and
it contained a local APIC unit and an I/O APIC unit.
4. Why doesnt my ALR work?
From Robert Hyatt : ALR Revolution quad-6 seems quite safe, while
some older revolution quad machines without P6 processors seem
"iffy"...
5. Why does SMP go so slowly? or Why does one CPU show a very low
bogomips value while the first one is normal?
From Alan Cox: If one of your CPU's is reporting a very low
bogomips value the cache is not enabled on it. Your vendor probably
provides a buggy BIOS. Get the patch to work around this or better
yet send it back and buy a board from a competent supplier.
A 2.0 kernel (> 2.0.36) contains the MTRR patch which should solve
this problem (select option "Handle buggy SMP BIOSes with bad MTRR
setup" in the "General setup" menu).
I think buggy SMP BIOS handling is automatic in latest 2.2 kernels.
6. I've heard IBM machines have problems
Some IBM machines have the MP1.4 bios block in the EBDA, allowed
but not supported below 2.2 kernels.
There is an old 486SLC based IBM SMP box. Linux/SMP requires
hardware FPU support.
7. Is there any advantage of Intel MP 1.4 over 1.1 specification?
Nope (according to Alan :) ), 1.4 is just a stricker specs of 1.1.
Please see the Useful Pointers <SMP-HOWTO-8.html> for comparison
between MP 1.4 and 1.1.
8. Why does the clock drift so rapidly when I run linux SMP?
This is known problem with IRQ handling and long kernel locks in
the 2.0 series kernels. Consider upgrading to a later 2.2 kernel.
From Jakob Oestergaard: Or, consider running xntpd. That should
keep your clock right on time. (I think that I've heard that
enabling RTC in the kernel also fixes the clock drift. It works for
me! but I'm not sure whether that's general or I'm just being
lucky)
There are some kernel fixes in the later 2.2.x series that may fix
this.
9. Why are my CPU's numbered 0 and 2 instead of 0 and 1 (or some other
odd numbering)?
The CPU number is assigned by the MB manufacturer and doesn't mean
anything. Ignore it.
10.
My quad-Xeon system hangs as soon as it has decompressed the kernel
(Doug Ledford) Try recompiling LILO with LARGE_EBDA support and
then making sure to always use make bzImage when compiling the
kernel. That appears to have fixed the SMP boot hangs here on
Intel multi-Xeon boards. However, please note that this also
appears to break LILO in that the root= option no longer works, so
make sure you rdev your kernel image at the same time you run lilo
to make sure that the kernel loads the correct root filesystem at
boot.
(Robert M. Hyatt) With 3 cpus, do you have a terminator in the 4th
slot?
11.
During boot machine hang signaling an "unexpected IO-APIC" warning
Short Answer: Change your MP setting from 1.4 to 1.1 (BIOS
option), and boot with "noapic" option at boot prompt.
Long Answer: This message has nothing to do with your performance
problems or why all interrupts go to one CPU. This message is for
the ACPI(IO-APIC) maintainers to keep an eye on when there is new
hardware. (Earle Nietzel)
To summarize the article found in official kernel documentation:
a. The "unexpected IO-APIC" is just an indicator that your
motherboard is not on the whitelist.
b. Cat your /proc/interrupts and if you see any line with IO-APIC
then everything is fine because IO-APIC IRQ's are enabled.
12.
Do I need to do change MP from 1.4 to 1.1 and boot with (noapic) at
the same time?
It depends.
I found that I do not need to turn off IO-APIC if I backed down
from MP 1.4 and 1.1. Apparently some Xeon-based boards need to do
both, but ASUS CUV4X boards do not. Turning off IO-APIC support
needlessly imposes a probably small performance penalty on ASUS
owners. (Vladimir G. Ivanovic)
Some IBM Netfinity machines will have problems initializing the
onboard SCSI controller if MPS 1.1 is selected. Each possible LUB
of each possible device on each possible bus will be queried with a
timeout. Booting takes a uselessly long time. (E. Robert Bogusta)
There are reports that system with ASUS4X-DLS motherboard ran fine
with IO-APIC enabled with MP 1.4.
For CUV4X-D motherboard, disabling the IDE controllers you probably
can boot with MP 1.4 and APIC enabled.
13.
Is there performance loss by running "noapic"?
(David Mentre) It has minor impact, except if you have high
interrupt load (i.e., nearly nobody).
14.
My motherboard is an ASUS-CUV4X-DLS with the VIA 694XDP chipset. If
I boot with the noapic flag, the machine boots fine and
/proc/cpuinfo show sboth processors. However, /proc interrupts does
not show any sharing of the interrupts.
Probably you need to upgrade your BIOS version to 1010.
15.
What are pros and cons of Xeons vs. Athlons?
Xeon's chipset (440GX) and accompanying motherboard (supermicro
S2DGE) I'd be using is probably (much?) more reliable and well-
supported under Linux SMP than Athlons' (AMD 760/760MP) simply
because they've been around longer and through many more
iterations.
Xeon's larger cache (1mb on the dual 400's I'm considering) might
give performance enhancement (and given that I don't have only a
single scientific code I'm planning to run on this, it's probably
not helpful to test benchmark specifically for my code).
Athlon's significiantly has faster clock rate (along with full-
speed L2 cache in Thunderbirds, although at only 384kb) and much
higher memory bandwidth with PC2100 DDR memory could help a lot.
Cost is unclear until 760MP boards and PC2100 memory are released,
but it will probably be $950 to get two 1GHz 385km L2
Thunderbirds, dual motherboard and 512mb of ECC PC2100 vs $750 to
get two 400MHz 1mb L2 Xeons, dual motherboard and 512mb of ECC
PC100. (Daniel Freedman)
16.
My system locks up during heavy NFS traffic
Try the later 2.2.x kernels and the knfsd patches. This is
currently under investigation. (Wade Hampton)
17.
My system locks up with no oops messages
If you are using kernels 2.2.11 or 2.2.12, get the latest kernel.
For example 2.2.13 has a number of SMP fixes. Several people have
reported these kernels to be unstable for SMP. These same kernels
may have NFS problems that can cause lockups. Also, use a serial
console to capture your oops messages. (Wade Hampton)
If the problem remains (and the other suggestions on this list
didn't help either), then you could try the latest 2.3 kernels.
They have more verbose (and more robust) SMP/APIC code, and
automatic hard-lockup-prevention code which will produce meaningful
oopses instead of a silent hang. (Ingo Molnar)
(Osamu Aoki) You MUST also disable all BIOS related power save
features. Example of good configuration (Dual Celeron 466 Abit
BP6):
___________________________________________________________________
POWER MANAGEMENT SETUP.
ACPI: Disabled
POWER MANAGEMENT: Disabled
PM CONTROL by APM: No
___________________________________________________________________
If power management features are activated, some random freeze can
occur.
18.
Debugging lockups
(item by Wade Hampton)
A good means of debugging lockups is to get the ikd patch from
Andrea Arcangeli: ftp://ftp.suse.com/pub/people/andrea/kernel-
patches
There are several of debug options, but do NOT use the soft lockup
option! For newer SMP boxes, turn kernel debugging then turn on
the NMI oopser. To verify that the NMI oopser is working, after
booting the new kernel, /cat /proc/interrupts and verify that you
are getting NMIs. When the box locks up, you should get an OOPS.
You may also try the %eip option. This allows the kernel to print
on the console the %eip address every time a kernel function is
called. When the box locks up, write down the first column ordered
by the second column then lookup the addresses in the System.map
file. This works only in console mode.
Also note that the use of a serial console can greatly facilitate
debugging kernel lockups, not just SMP kernel lockups!
19.
"APIC error interrupt on CPU#n, should never happen" messages in
logs
A message like:
___________________________________________________________________
APIC error interrupt on CPU#0, should never happen.
... APIC ESR0: 00000002
... APIC ESR1: 00000000
___________________________________________________________________
indicates a 'receive checksum error'. This cannot be caused by Linux
as the APIC message checksumming part is completely in hardware. It
might be marginal hardware. As long as you dont see any instability,
they are not a problem - APIC messages are retried until delivered.
(Ingo Molnar)
4.2. Possible causes of crash
In this section you'll find some possible reasons for a crash of an
SMP machine (credits are due to Jakob <20>stergaard for this part). As
far as I (David) know, theses problems are Intel specific.
<20> Cooling problems
>From Ralf B<>chle: [Related to case size and fans] It's important
that the air is flowing. It of course can't where cables etc. are
preventing this like in too small cases. On the other side I've
seen oversized cases causing big problems. There are some tower
cases on the market that actually are worse for cooling than
desktops. In short, the right thing is thinking about aerodynamics
in the case. Extra cases for hot peripherals are usefull as well.
Of course you can always go to Radio Shack (or similar) and get
another fan. You can use the lm_sensors to monitor the CPU
temperature of newer PII and PIII processors. This might help you
to determine if heat is a problem. (Wade Hampton)
<20> Bad memory
Don't buy cheap RAM and don't use mixed RAM modules on a
motherboard that is picky about it.
Especially Tyan motherboards are known to be picky about RAM speed.
There have been some report of 10ns PC100 RAM being sold with
motherboards where the CPU really needs 8ns RAM. (Wade Hampton)
<20> Bad combination of different stepping CPUs
Check /proc/cpuinfo to see that your CPUs are same stepping.
<20> If your system is unstable, then DON'T overclock it!
...and even if it is stable, DON'T overclock.
>From Ralf B<>chle: Overclocking causes very subtle problems. I
have a nice example, one of my overclocked old machines
misscomputes a couple of pixels of a 640 x 400 fractal. The
problem is only visible when comparing them using tools. So better
say never, nuncas, jamais, niemals overclock.
<20> 2.0.x kernel and fast ethernet (from Robert G. Brown)
2.0.x kernels on high performance fast ethernet systems have
significant (and known) problems with a race/deadlock condition in
the networking interrupt handler.
The solution is to get the latest 100BT development drivers from
CESDIS Linux Ethernet device drivers site
<http://cesdis.gsfc.nasa.gov/linux/drivers/> (ones that define
SMPCHECK).
<20> A bug in the 440FX chipset (from Emil Briggs)
If you had a system using the 440FX chipset then your problem with
the lockups was possibly due to a documented errata in the chipset.
Here is a reference
References: Intel 440FX PCIset 82441FX (PMC) and 82442FX (DBX)
Specification Update. pg. 13
http://www.intel.com/design/pcisets/specupdt/297654.htm
The problem can be fixed with a BIOS workaround (Or a kernel patch)
and in fact David Wragg wrote a patch that's included with Richard
Gooch's MTTR patch. For more information and a fix look here:
http://nemo.physics.ncsu.edu/~briggs/vfix.html
<20> DONT run emm386.exe before booting linux SMP
>From Mark Duguid, dumb rule #1 with W6LI motherboards. ;)
<20> If the machine reboots/freezes after a while, there can be two good
BIOS + memory related reasons (from Jakob <20>stergaard)
<20> If the BIOS has settings like "memory hole at 16M" and/or "OS/2
memory > 64MB", try disabling them both. Linux does not always
react well with theese options.
<20> If you have more than 64 MB of memory in the machine, and you
specified the exact number manually in the LILO configuration, you
should specify one MB less than you actually have in the machine.
If you have 128 MB, you lilo.conf line looks like:
append="mem=127M"
<20> Be aware of IRQ related problems
Sometime, some cards are not recognized or can trigger IRQ
conflicts. Try shuffling cards on slots in different ways and
possibly moving them to different IRQs.
Contributed by hASCII : removing an " append="hisax=9,2,3"" line in
lilo.conf allowed using a kernel from the 2.1.xx series with
activated ISDN + Hisax support. Kernels from the 2.0.xx series
doesn't make problems like this.
Try also to set BIOS setup option like "MP 1.4 mode" or "route PCI
interrupts through IOAPIC", or "OS Type" not set to DOS neither
Novell (Ingo Molnar).
<20> Floppy access while sound is active
If you lockup when trying to access the floppy (for example while
sound is playing) you may have to edit drivers/pci/quirks.c and set
/int isa_dma_bridge_buggy = 1; This is a problem with my Dell WS400
dual PII/300, 2.2.x, SMP (Wade Hampton).
4.3. Motherboard specific information
Please note: Some more specific information can be found with the list
of Motherboards rumored to run Linux SMP <http://www.nlug.org/smp/>
4.3.1. Motherboards with known problems
<20> none right now
4.4. Low cost SMP Linux box (dual Celeron box)
(St<53>phane <20>colivet)
The lowest cost SMP Linux boxes with nowadays buyable processors are
dual Celeron systems. Such a system is not officially possible
according to Intel. Better think about the second generation of
Celeron, those with 128 Kb L2 cache.
4.4.1. Is it possible to run a dual Intel Celeron box ?
Official answer from Intel: no, Celeron cannot work in SMP mode.
Practical answer: it is possible, but requires hardware alteration for
Slot 1 processors. Alteration is described by Tomohiro Kawada on his
Dual Celeron System <http://kikumaru.w-
w.ne.jp/pc/celeron/index_e.html> page. Of course, this kind of
modification removes warranties... Some versions of Celeron processor
are also available in Socket 370 format. In that case, alteration may
just be done on the Socket 370 to Slot 1 adapter or may even be sold
pre-wired for SMP use. (Andy Poling, Hans - Erik Skyttberg, James
Beard)
There is also a motherboard (ABIT BP6) allowing two Celerons in Socket
370 format to be inserted (Martijn Kruithof, Ryan McCue). ABIT
Computer BP6 verified tested and native to linux with dual ppga socket
370 (Andre Hedrick).
4.4.2. How does Linux behave on a dual Celeron system ?
Fine, thank you.
4.4.3. Celeron system ? Celeron processors are known to be easily
overclockable. And dual
It may work. However, overclocking this kind of system is not as easy
as overclocking a mono-processor one. It is definitly not a good idea
for a production system. For personal use, dual Celeron 300A systems
running rock-solid at 450 MHz have been reported. (numerous people)
4.4.4. And making a quad Celeron system ?
It is impossible. Celeron processors have nearly the same features as
basic Pentium II chips. If you want more than 2 processors in your
system, you'll have to look at Pentium Pro, Pentium II Xeon or Pentium
III (?) boxes.
4.4.5. What about mixing Celeron and Pentium II processor ?
A system using a "re-enable" Celeron processor and a Pentium II
processor with the same steppings may theorically work.
Alexandre Charbey as made such a system:
<20> Asus P2B-D motherboard, proc 1: Celeron 366, proc 2: Pentium II
400@266
<20> 66Mhz and 75Mhz bus frenquencies where functionnal
<20> the fastest processor (in this case the Celeron) should be put on
the second slot. Swapping processors (fatest first) leads to quick
failure.
5. Sparc architecture specific questions
5.1. Which Sparc machines are supported ?
Quoting the UltraLinux <http://ultra.linux.cz/> web page (only SMP
systems):
<20> UltraSPARC PCI based workstations: Ultra60, Ultra450
<20> UltraSPARC SBUS based servers: Enterprise 1, 2, 150
<20> UltraSPARC SBUS based large servers: Enterprise 3000, 4000, 5000,
6000, 10000
<20> UltraSPARC PCI based servers: Enterprise 250, 450
<20> SPARC sun4m SMP machines (Anton Blanchard)
<20> Starfire E10000 <http://linuxcare.com.au/anton/e10000/>
UltraLinux has ran on a 14 CPUs machine (see the dmesg output
<http://lwn.net/1998/1210/a/dm-sparc.html>) and on a Starfire E10000
with 24 CPUs (see the dmesg output
<http://linuxcare.com.au/anton/e10000/dmesg_24.shtml>).
The SparcStation 10 and SparcStations 20 are SMP capable machine and
according to the FAQABOSS <http://fagaboss.sunhelp.org> the following
combinations are known to work:
<20> 2xSM40 ( model 402 )
<20> 2xSM41 ( model 412 )
<20> 2xSM51 ( model 512 )
<20> 2xSM512 ( model 514 )
<20> 2xSM61 ( model 612 )
<20> 2xSM71 ( model 712 )
<20> 2xSM81 ( model 812 )
And, as stated earlier, CPU modules in SparcStations 10 and can run a
different clock speeds, the following ones _SHOULD_ work:
<20> 2xSM50
<20> SM41, SM51
<20> SM41, SM61
<20> SM51, SM61
<20> SM71, SM81
How does it performs? Well, it is fast, really fast. Some of the java
Demos can run faster on a dual HyperSparc 125Mhz 128MB ( ywing ) than
on a dual celeron BP6 433@433Mhz 192MB ( calimero ). The same applies
for the Gimp. When it comes to compiling calimero runs faster than
ywing. Both computers running 2.2.16 kernel and calimero's hard disk
subsystem is full SCSI.
One important detail when you plan to have different CPU modules in
your computer is to have the same kind of modules, you cannot mix
SuperSparc and HyperSparc for example, but you can have an odd number
of CPUs, for example 3. They are said to be able to run modules at
different clock speed as written in this article form AcesHardware ,
but I have not witnessed it. (Lionel, trollhunter Bouchpan-Lerus-
Juery)
5.2. Specific problem related to Sparc SMP support
(David Miller) There should not be any worries.
The only known problem, and one we don't intend to fix, is that if you
build an SMP kernel for 32-bit (ie. non-ultrasparc) systems, this
kernel will not work on sun4c systems.
6. PowerPC architecture specific questions
6.1. Which PPC machines are supported ?
<20> PowerSurge boards (including UMAX s900)
<20> PowerMac
<20> Motorola MTX: support under developement. Patches not yet
integrated into the main kernel (Troy Benjegerdes)
(Cort Dougan) Not supported: PPC RS/6000 systems
6.2. Specific problem related to PPC SMP support
Nothing. Usual SMP compiling (see above). As usual, be aware, modules
are specific either for UP or SMP. Recompile them. (Paul Mackerras)
7. Alpha architecture specific questions
7.1. Which Alpha machines are supported ?
(Geerten Kuiper) SMP works for most, if not all, AXP servers.
(Jay A Estabrook) SMP does seem to work on most of our [Compaq] boxes
with 2 or more CPUs. That includes :
<20> AS2000/2100 (SABLE)
<20> AS4000/4100 (RAWHIDE)
<20> DS20 (DP264)
<20> GS320 (see the bootlog for a 31 CPUs machine
<http://lwn.net/daily/gs320.php3>)
It does not include :
<20> AS2100A (LYNX)
<20> TurboLaser bigboys (8200/8400)
(Alpha Processor Inc) SMP support has been qualified for all API SMP
systems starting from later 2.2-series kernels (approximately kernel
2.2.7). At the time of writing, that is :
<20> DP264
<20> UP2000
See API's support website <http://www.alpha-
processor.com/support/index.shtml> for more info.
7.2. Specific problem related to Alpha SMP support
None (really ? :-)
8. Useful pointers
8.1. Various
<20> Parallel Processing using Linux
<http://yara.ecn.purdue.edu/~pplinux/>
<20> Linux Parallel Processing HOWTO
<http://yara.ecn.purdue.edu/~pplinux/PPHOWTO/pphowto.html>
<20> linux-smp mailing list
To subscribe, send subscribe linux-smp in the message body at
majordomo@vger.kernel.org
To unsubscribe, send unsubscribe linux-smp in the message body at
majordomo@vger.kernel.org
Linux SMP archives <http://www.linuxhq.com/lnxlists/linux-smp/>
Linux SMP archives at progressive-comp.com <http://www.progressive-
comp.com/Lists/?l=linux-smp&r=1&w=2#linux-smp>
<20> pthread library made by Xavier Leroy
<http://pauillac.inria.fr/~xleroy/linuxthreads/>
<20> Motherboards rumored to run Linux SMP <http://www.nlug.org/smp/>
<20> procps <http://www.cs.inf.ethz.ch/~rauch/procps.html>
<20> procps patch for 2.2.x <http://queenbee.fhcrc.org/~warnes/procps>
<20> xosview <http://lore.ece.utexas.edu/~bgrayson/xosview.html>
<20> xosview for 2.2.x
<http://www.ima.umn.edu/~klee/linux/xosview-1.6.1-5a1.tgz>
<20> SMP Performance of Linux
<http://www.phy.duke.edu/brahma/benchmarks.smp>
<20> CESDIS Linux Ethernet device drivers site
<http://cesdis.gsfc.nasa.gov/linux/drivers/>
<20> Dual Celeron System <http://kikumaru.w-
w.ne.jp/pc/celeron/index_e.html>
<20> LaTeX document describing implementation of MultiProcessor Linux
<http://www.linuxhq.com/kernel/v2.4/doc/smp.tex>
<20> IRQ affinity <http://www.linuxhq.com/kernel/v2.4/doc/IRQ-
affinity.txt.html>
8.2. Multithreaded programs and library
<20> Linux Threads FAQ <http://linas.org/linux/threads-faq.html>
<20> Multithreaded programs on linux <http://www.informatik.uni-
bremen.de/~hollow/mthread.html>
<20> Pentium Pro Optimized BLAS and FFTs for Intel Linux
<http://www.cs.utk.edu/~ghenry/distrib/> (not available right now,
but a dual proc library is planned for 5/27/98, see Blas News
<http://www.cs.utk.edu/~ghenry/distrib/blasnews> for details)
<20> Mesa library <http://www.ssec.wisc.edu/~brianp/Mesa.html> (with
experimental multi-threading)
<20> Parallel plugins for The GIMP
<http://nemo.physics.ncsu.edu/~briggs/gimp/index.html>
8.3. SMP specific patches
<20> Patch for a bug in the 440FX chipset
<http://nemo.physics.ncsu.edu/~briggs/vfix.html>
<20> PSET - Processor Sets for the Linux kernel
<http://isunix.it.ilstu.edu/~thockin/pset/>
<20> Ingo Molnar SMP patches <http://www.redhat.com/~mingo/> (for
experts only, please read linux-smp@vger.kernel.org)
8.4. ( Sumit Roy ) Parallelizing/Optimizing Compilers for 586/686
machines
<20> Pentium Compiler Group <http://www.goof.com/pcg/> creators of pgcc
<20> Absoft <http://www.absoft.com/> , Fortran 90 and Fortran 77
compilers
<20> The Portland Group, Inc. <http://www.pgroup.com/>, supports the
OpenMP <http://www.openmp.org> standard for Fortran parallelization
on Linux
<20> Pacific-Sierra Research Corporation <http://www.psrv.com/>, has a
free F90 compiler for Linux, as well as parallelizing compilers for
SMP Linux
<20> Applied Parallel Research <http://s006.infomall.org/index.html>,
currently have parallelizing compilers for WinNT
<20> KAI <http://www.kai.com> has a C++-Compiler for Linux, that
understands OpenMPI. It is called Guide_OpenMP. Info under
http://www.kai.com/parallel/kappro/guide. (Gero Wedemann)
9. Glossary
9.1. Definitions
<20> SMP Symmetric Multi-Processors.
<20> UP Uni-Processor: system with one processor.
<20> APIC Advanced Programmable Interrupt Controler.
<20> thread A thread is a processor activity in a process. The same
process can have multiple threads. Those threads share the process
address space and can therefore share data.
<20> pthread Posix thread, threads defined by the Posix standard.
<20> process Program in execution, with its environment.
<20> MTRR Memory Type Range Register
<20> APM Advanced Power Management.
<20> FPU Floating Point Unit. Also called arithmetic co-processor.
<20> IRQ Interrupt ReQuest.
<20> EBDA Extended BIOS Data Area.
<20> ACPI Advanced Configuration and Power Interface.
<20> oops Internal kernel error.
<20> Cluster Group of computers that achieve a common computation (also
known as Beowulf within the Linux community).
9.2. Concepts
<20> Data Races
A data race happens when to processes want to modify a shared
variable concurrently without protecting themselves from the effect
of the other process.
Let A a shared variable. Let P1 and P2 two processes that access
this variable. Those two processes are making the same following
operation: "read A in tmp variable (local to the precess); do tmp =
tmp + 1 ; write tmp in A". If the A variable is not protected by a
lock, resulting executions could not correspond to what is
espected. For example, here is two examples if one do not lock A:
case #1:
A=0
P1: read A -> tmp1 (so tmp1 is 0)
P2: read A -> tmp2 (so tmp2 is 0)
P1: tmp1 = tmp1 + 1 (so tmp1 is 1)
P2: tmp2 = tmp2 + 1 (so tmp2 is 1)
P1: tmp1 -> write A (so A is 1)
P2: tmp2 -> write A (so A is 1)
case #2:
A=0
P1: read A -> tmp1 (so tmp1 is 0)
P1: tmp1 = tmp1 + 1 (so tmp1 is 1)
P1: tmp1 -> write A (so A is 1)
P2: read A -> tmp2 (so tmp2 is 1)
P2: tmp2 = tmp2 + 1 (so tmp2 is 2)
P2: tmp2 -> write A (so A is 2)
To avoid this kind of problem, one uses a lock:
A=0:
P1: lock A
P1: read A -> tmp1 (so tmp1 is 0)
P2: lock A (so P2 is blocked)
P1: tmp1 = tmp1 + 1 (so tmp1 is 1)
P1: tmp1 -> write A (so A is 1)
P1: unlock A (so P2 is unblocked)
P2: read A -> tmp2 (so tmp2 is 1)
P2: tmp2 = tmp2 + 1 (so tmp2 is 2)
P2: tmp2 -> write A (so A is 2)
P2: unlock A
<20> Deadlock
This is an inter-blocking that occurs when two processes want to
access at shared variables mutually locked. For example, let A and
B two locks and P1 and P2 two processes:
P1: lock A
P2: lock B
P1: lock B (so P1 is blocked by P2)
P2: lock A (so P2 is blocked by P1)
Process P1 is blocked because it is waiting for the unlocking of B
variable by P2. However P2 also needs the A variable to finish its
computation and free B. So we have a deadlock.
In this example, the problem is very simple. But imagine what can
happen in a 2 millions of lines of code (like the linux kernel) with
hundreds of locks. :-)
10. What's new ?
v1.14, 9 july 2002
<20> First release since in almost two years
<20> Added article Multiprocessor Specification Support (Randy
Dunlap)
<20> Added explanation of "unexpected IO-APIC" problem
<20> Added a note on changes between 2.2.x and 2.4.x kernels
<20> Added new section update on SPARC (Lionel, trollhunter Bouchpan-
Lerust-Juery)
<20> Added various questions and answers
<20> Deleted "SMP specific limit with current kernel (2.2)": outdated
<20> Changed word "current" from kernel 2.2 documents
v1.12.1, 25 october 2000
<20> Put all authors in Bryant, Hartner, Qi and Venkitachalam paper
v1.12, 22 october 2000
<20> Explanation on why not trust Xosview on scheduling (Rik van
Riel)
<20> A pointer to an article that compares 2.2 and 2.4 kernels (Ray
Bryant)
v1.11, 8 october 2000
<20> Linux boots on a Sun E1000 with 24 CPUs
<20> Linux boots on a AlphaServer with 31 CPUs
v1.10, 5 october 2000
<20> New linux-smp mailing-list adress : linux-smp@vger.kernel.org
(me)
<20> Tell where to find RTC setting in kernel config (Patrick Doyle)
<20> glossary updated and concepts added (from a french version made
by Ludovic Danigo)
<20> Fixed an inconsistency (Matthias Schniedermeyer)
<20> Deleted wrong links (Johan Ekenberg)
v1.9.1, 28 september 2000
<20> updated with a submission from Stig Telfer detailing SMP support
on API Alpha systems
v1.9, 13 january 2000
<20> Remember to disable all BIOS power-save features (Osamu Aoki)
<20> Explain how to access to Compaq server into advanced
configuration mode (Adrian Portelli)
v1.8, 8 november 1999
<20> quad-celeron motherboard was a hoax, restored old paragraph
(Simen Timian Thoresen)
v1.7, 6 november 1999
<20> new introduction (C. Polisher aka cp)
<20> numerous typo and grammatical fixes (cp)
<20> introductory paragraph on kernel compilation (cp)
<20> introductory paragraph on SMP need (cp)
<20> reference on KAI optimizing compiler (Gero Wedemann)
<20> quad-celeron motherboard exists (Jeffrey H. Ingber)
v1.6, 21 october 1999
<20> added information on xosview scheduling perturbation
<20> added "APIC error interrupt on CPU#n" message information
<20> added information on hard lockup
<20> deleted section "How to optain maximum performance" (was
obsolete)
<20> added info on dual systems with different x86 procs (a Celeron
and a P-II)
v1.5, 4 october 1999
<20> more precision in PSET description
v1.4, 30 september 1999
<20> precize to enable MTRR support for an x86 SMP kernel (me)
v1.3, 29 september 1999
<20> many many grammar and typographical fixes (Wade Hampton aka hww)
<20> added info in short introduction related to 2.2/2.4/2.0 diffs
(hww)
<20> added step by step things to do to recompile a kernel (hww and
me)
<20> added info related to SMP/UP modules problems (hww)
<20> added precision in Posix Threads section related to user (hww)
vs. kernel threads (hww)
<20> new item about NFS and kernel lock (hww)
<20> new item about kernel lock without message (hww)
<20> new item about debugging lockup problems (hww)
<20> added info about heating problems (hww)
<20> miscellaneous updates I've forget about (hww)
<20> new item about floppy access and sound (hww)
v1.2, 27 september 1999
<20> name change: this document is now a HOWTO. TWD, and fast!
(Guylhem Aznar)
v1.1, 26 september 1999
<20> added a link to first Chris Pirih FAQ draft
<20> expanted an IRQ related problems
v1.00, 25 september 1999
<20> first upgrade in a long long time!
<20> reprocessed the whole FAQ: 2.2 is here and 2.4 soon
<20> added kernel locking information from Ingo Molnar
<20> deleted item "How will my application perform under SMP?":
outdated
<20> deleted item "My SMP system is locking up all the time.":
outdated
<20> deleted item "You are running 2.0.35 aren't you ?": outdated
<20> deleted item "Some hardware is also known to cause problems.":
outdated
<20> blanked section "Motherboards with known problems". We should
restart from scratch
<20> deleted section "Motherboards with NO known problems": outdated
<20> updated dual celeron section (numerous people)
<20> added "SPARC sun4m SMP machines" to supported SMP sparc machines
(Anton Blanchard)
<20> added a "During boot machine hang signaling an IOAPIC problem"
item in "Why it doesn't work on my machine?" section
<20> added a "What about SMP performances?" item
<20> updated "Why doesn't my old Compaq work?" item
<20> fixed an outdated pointer
<20> added a pointer to Ingo test SMP patches
v0.54, 13 march 1999
<20> Added a section about SMP Alpha systems
v0.53, 08 march 1999
<20> Added a section about SMP PowerPC systems
v0.52, 07 march 1999
<20> Added a section about SMP Sparc systems
v0.51, 06 march 1999
<20> Added a dual-celeron section
<20> Deleted Adaptec section
<20> Updated procps link
<20> Updated xosview link
<20> Added an answer for quad Xeon boot hang
<20> Updated item about glibc patch for gd: should be included in RH
5.2
v0.50, 03 february 1999
<20> Updated "Multithreaded programs on linux" link
v0.49, 13 january 1999
<20> Update about CONFIG_SMP. Added .txt to Documentation/smp.
(Michael Elizabeth Chastain)
v0.48, 10 december 1998
<20> Mispelled corrected. Email address corrected.
v0.47, 20 november 1998
<20> Added that 2.0.36 as the MTRR patch (related to the BogoMips
problem)
v0.46, 10 november 1998
<20> Update about Epox KP6-LS motherboards
v0.45, 25 october 1998
<20> Corrected an error regarding /proc/stat file
<20> Added a pointer to CESDIS Ethernet Linux Drivers site
v0.44, 14 october 1998
<20> Updated the link to the web page: Motherboards rumored to run
Linux SMP
<20> Added Jakob explanation how to time SMP systems with 2.0 kernels
v0.43, 9 september 1998
<20> Updated first question in section 3.1
<20> Updated mt-Mesa link: multi-threaded is now included as
experimental in the Mesa distribution
v0.42, 2 september 1998
<20> Minor cosmetic update in sect 3.3
<20> Two links (multithreaded Mesa and SMP performance) marked
outdated
<20> Updated the item about threads and exceptions in C++ (sect 3.3)
v0.41, 1 september 1998
<20> Added a major section: "3.3 SMP Programming" written by Jakob
<20>stergaard
<20> moved some item of section "3.2 User side" in sect 3.3
v0.40, 27 august 1998
<20> Updated section 3.1, item 7: processor affinity
v0.39, 27 august 1998
<20> Updated needed Award BIOS version for Tyan motherboards (hASCII)
<20> Added an item on IRQ in the crash section (me and hASCII)
<20> Added good support of Asus P2B-DS (Ulf Rompe)
<20> Added another smp-list archive in pointer section (Hank
Leininger)
v0.38, 8 august 1998
<20> Added a pointer to the Linux Threads FAQ
v0.37, 30 July 1998
<20> Emil Briggs is working on parallel plugins for Gimp (see "Is
there any threaded programs or library?", sect. "User side")
v0.36, 26 July 1998
<20> Thanks to Jakob <20>stergaard, two changes in "Possible causes of
Crash"
<20> Changed 2.0.33 to 2.0.35 (latest stable)
<20> Added a "BIOS related causes of failure"
v0.35, 14 July 1998
<20> Added N440BX Server Board in Motherboards with NO problems
<20> Added a succes story for GigaByte motherboard with BIOS upgrade
<20> Added a "How to obtain maximum performance ?" section (waiting
for your contributions ;)
v0.34, 10 june 1998
<20> Added a "Parallelizing/Optimizing Compilers for 586/686
machines" section in section "Useful Pointers", thanks to Sumit
Roy
<20> Corrected a mispelling, "Asus P/I-UP5" is in fact "Asus P/I-
P65UP5"
v0.33, 3 june 1998
<20> Yet another success story for a GigaByte DLX Motherboard.
<20> A tip for Tyan motherboards, disable the "DRAM Fast Leadoff"
BIOS option
v0.32, 27 may 1998
<20> Asus P/I-UP5 added in the motherboard-with-NO-problem section
v0.31, 18 may 1998
<20> Elitegroup P6LX2-A works with 2.1.100 and 101
<20> Bugs should be reported to linux-smp@vger.rutgers.edu
v0.30, 12 may 1998
<20> SuperMicro is now in the motherboard-with-NO-problem section
v0.29, 11 may 1998
<20> A success story for a GigaByte 686 motherboard with 2.1.101
<20> Added a new item in the "User Side" section: "Is there any
threaded programs or library?"
<20> OpenGL Mesa library is beeing multithreaded. Cool! See the new
section for details.
v0.28, 09 may 1998
<20> A US mirror of this FAQ is now available (see Introduction)
<20> Merge of the two confusing Gigabyte 686 entries
v0.27, 05 may 1998
<20> New info for the Adaptec and TekRam drivers
<20> Micronics W6-LI motherboard works under SMP
11. List of contributors
Many thanks to those who help me to maintain this HOWTO:
1. Tigran A. Aivazian
2. John Aldrich
3. Niels Ammerlaan
4. H. Peter Anvin
5. Osamu Aoki
6. Guylhem Aznar
7. Ralf B<>chle
8. James Beard
9. Troy Benjegerdes
10.
Anton Blanchard
11.
Emil Briggs
12.
Robert G. Brown
13.
Ray Bryant
14.
Alexandre Charbey
15.
Michael Elizabeth Chastain
16.
Samuel S. Chessman
17.
Alan Cox
18.
Andrew Crane
19.
Cort Dougan
20.
Patrick Doyle
21.
Mark Duguid
22.
St<53>phane <20>colivet
23.
Johan Ekenberg
24.
Jocelyne Erhel
25.
Jay A Estabrook
26.
Byron Faber
27.
Mark Garlanger
28.
hASCII
29.
Wade Hampton
30.
Andre Hedrick
31.
Claus-Justus Heine
32.
Benedikt Heinen
33.
Florian Hinzmann
34.
Moni Hollmann
35.
Robert M. Hyatt
36.
Jeffrey H. Ingber
37.
Richard Jelinek
38.
Tony Kocurko
39.
Geerten Kuiper
40.
Martijn Kruithof
41.
Doug Ledford
42.
Kumsup Lee
43.
Hank Leininger
44.
Ryan McCue
45.
Paul Mackerras
46.
Cameron MacKinnon
47.
Joel Marchand
48.
David Maslen
49.
Chris Mauritz
50.
Jean-Francois Micouleau
51.
David Miller
52.
Ingo Molnar
53.
Ulf Nielsen
54.
Jakob Oestergaard
55.
C Polisher
56.
Adrian Portelli
57.
Matt Ranney
58.
Daniel Roesen
59.
Ulf Rompe
60.
Jean-Michel Rouet
61.
Volker Reichelt
62.
Sean Reifschneider
63.
Rik van Riel
64.
Sumit Roy
65.
Thomas Schenk
66.
Matthias Schniedermeyer
67.
Terry Shull
68.
Chris K. Skinner
69.
Hans - Erik Skyttberg
70.
Szakacsits Szabolcs
71.
Jukka Tainio
72.
Stig Telfer
73.
Simen Timian Thoresen
74.
El Warren
75.
Gregory R. Warnes
76.
Gero Wedemann
77.
Christopher Allen Wing
78.
Leonard N. Zubkoff
79.
Mark Hahn
80.
David Haring
81.
David Mentre
82.
Earle Nietzel
83.
Rick Lindsley
84.
Vladimir G. Ivanovic
85.
Daniel Freedman
86.
Matti Aarnio
87.
Maciej W. Rozycki