Skip to content

Commit

Permalink
Merge branch 'semaphore' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/git/willy/misc

* 'semaphore' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc:
  Remove __DECLARE_SEMAPHORE_GENERIC
  Remove asm/semaphore.h
  Remove use of asm/semaphore.h
  Add missing semaphore.h includes
  Remove mention of semaphores from kernel-locking
  • Loading branch information
torvalds committed Jul 24, 2008
2 parents 3fde80e + b552068 commit 7540081
Show file tree
Hide file tree
Showing 29 changed files with 30 additions and 68 deletions.
57 changes: 24 additions & 33 deletions Documentation/DocBook/kernel-locking.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -219,10 +219,10 @@
</para>

<sect1 id="lock-intro">
<title>Three Main Types of Kernel Locks: Spinlocks, Mutexes and Semaphores</title>
<title>Two Main Types of Kernel Locks: Spinlocks and Mutexes</title>

<para>
There are three main types of kernel locks. The fundamental type
There are two main types of kernel locks. The fundamental type
is the spinlock
(<filename class="headerfile">include/asm/spinlock.h</filename>),
which is a very simple single-holder lock: if you can't get the
Expand All @@ -239,14 +239,6 @@
can't sleep (see <xref linkend="sleeping-things"/>), and so have to
use a spinlock instead.
</para>
<para>
The third type is a semaphore
(<filename class="headerfile">include/linux/semaphore.h</filename>): it
can have more than one holder at any time (the number decided at
initialization time), although it is most commonly used as a
single-holder lock (a mutex). If you can't get a semaphore, your
task will be suspended and later on woken up - just like for mutexes.
</para>
<para>
Neither type of lock is recursive: see
<xref linkend="deadlock"/>.
Expand Down Expand Up @@ -278,7 +270,7 @@
</para>

<para>
Semaphores still exist, because they are required for
Mutexes still exist, because they are required for
synchronization between <firstterm linkend="gloss-usercontext">user
contexts</firstterm>, as we will see below.
</para>
Expand All @@ -289,18 +281,17 @@

<para>
If you have a data structure which is only ever accessed from
user context, then you can use a simple semaphore
(<filename>linux/linux/semaphore.h</filename>) to protect it. This
is the most trivial case: you initialize the semaphore to the number
of resources available (usually 1), and call
<function>down_interruptible()</function> to grab the semaphore, and
<function>up()</function> to release it. There is also a
<function>down()</function>, which should be avoided, because it
user context, then you can use a simple mutex
(<filename>include/linux/mutex.h</filename>) to protect it. This
is the most trivial case: you initialize the mutex. Then you can
call <function>mutex_lock_interruptible()</function> to grab the mutex,
and <function>mutex_unlock()</function> to release it. There is also a
<function>mutex_lock()</function>, which should be avoided, because it
will not return if a signal is received.
</para>

<para>
Example: <filename>linux/net/core/netfilter.c</filename> allows
Example: <filename>net/netfilter/nf_sockopt.c</filename> allows
registration of new <function>setsockopt()</function> and
<function>getsockopt()</function> calls, with
<function>nf_register_sockopt()</function>. Registration and
Expand Down Expand Up @@ -515,7 +506,7 @@
<listitem>
<para>
If you are in a process context (any syscall) and want to
lock other process out, use a semaphore. You can take a semaphore
lock other process out, use a mutex. You can take a mutex
and sleep (<function>copy_from_user*(</function> or
<function>kmalloc(x,GFP_KERNEL)</function>).
</para>
Expand Down Expand Up @@ -662,7 +653,7 @@
<entry>SLBH</entry>
<entry>SLBH</entry>
<entry>SLBH</entry>
<entry>DI</entry>
<entry>MLI</entry>
<entry>None</entry>
</row>

Expand Down Expand Up @@ -692,8 +683,8 @@
<entry>spin_lock_bh</entry>
</row>
<row>
<entry>DI</entry>
<entry>down_interruptible</entry>
<entry>MLI</entry>
<entry>mutex_lock_interruptible</entry>
</row>

</tbody>
Expand Down Expand Up @@ -1310,7 +1301,7 @@ as Alan Cox says, <quote>Lock data, not code</quote>.
<para>
There is a coding bug where a piece of code tries to grab a
spinlock twice: it will spin forever, waiting for the lock to
be released (spinlocks, rwlocks and semaphores are not
be released (spinlocks, rwlocks and mutexes are not
recursive in Linux). This is trivial to diagnose: not a
stay-up-five-nights-talk-to-fluffy-code-bunnies kind of
problem.
Expand All @@ -1335,7 +1326,7 @@ as Alan Cox says, <quote>Lock data, not code</quote>.

<para>
This complete lockup is easy to diagnose: on SMP boxes the
watchdog timer or compiling with <symbol>DEBUG_SPINLOCKS</symbol> set
watchdog timer or compiling with <symbol>DEBUG_SPINLOCK</symbol> set
(<filename>include/linux/spinlock.h</filename>) will show this up
immediately when it happens.
</para>
Expand Down Expand Up @@ -1558,7 +1549,7 @@ the amount of locking which needs to be done.
<title>Read/Write Lock Variants</title>

<para>
Both spinlocks and semaphores have read/write variants:
Both spinlocks and mutexes have read/write variants:
<type>rwlock_t</type> and <structname>struct rw_semaphore</structname>.
These divide users into two classes: the readers and the writers. If
you are only reading the data, you can get a read lock, but to write to
Expand Down Expand Up @@ -1681,7 +1672,7 @@ the amount of locking which needs to be done.
#include &lt;linux/slab.h&gt;
#include &lt;linux/string.h&gt;
+#include &lt;linux/rcupdate.h&gt;
#include &lt;linux/semaphore.h&gt;
#include &lt;linux/mutex.h&gt;
#include &lt;asm/errno.h&gt;

struct object
Expand Down Expand Up @@ -1913,7 +1904,7 @@ machines due to caching.
</listitem>
<listitem>
<para>
<function> put_user()</function>
<function>put_user()</function>
</para>
</listitem>
</itemizedlist>
Expand All @@ -1927,13 +1918,13 @@ machines due to caching.

<listitem>
<para>
<function>down_interruptible()</function> and
<function>down()</function>
<function>mutex_lock_interruptible()</function> and
<function>mutex_lock()</function>
</para>
<para>
There is a <function>down_trylock()</function> which can be
There is a <function>mutex_trylock()</function> which can be
used inside interrupt context, as it will not sleep.
<function>up()</function> will also never sleep.
<function>mutex_unlock()</function> will also never sleep.
</para>
</listitem>
</itemizedlist>
Expand Down Expand Up @@ -2023,7 +2014,7 @@ machines due to caching.
<para>
Prior to 2.5, or when <symbol>CONFIG_PREEMPT</symbol> is
unset, processes in user context inside the kernel would not
preempt each other (ie. you had that CPU until you have it up,
preempt each other (ie. you had that CPU until you gave it up,
except for interrupts). With the addition of
<symbol>CONFIG_PREEMPT</symbol> in 2.5.4, this changed: when
in user context, higher priority tasks can "cut in": spinlocks
Expand Down
8 changes: 0 additions & 8 deletions Documentation/feature-removal-schedule.txt
Original file line number Diff line number Diff line change
Expand Up @@ -300,14 +300,6 @@ Who: [email protected]

---------------------------

What: asm/semaphore.h
When: 2.6.26
Why: Implementation became generic; users should now include
linux/semaphore.h instead.
Who: Matthew Wilcox <[email protected]>

---------------------------

What: SCTP_GET_PEER_ADDRS_NUM_OLD, SCTP_GET_PEER_ADDRS_OLD,
SCTP_GET_LOCAL_ADDRS_NUM_OLD, SCTP_GET_LOCAL_ADDRS_OLD
When: June 2009
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-ns9xxx/clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
#include <linux/clk.h>
#include <linux/string.h>
#include <linux/platform_device.h>
#include <linux/semaphore.h>

#include <asm/semaphore.h>
#include "clock.h"

static LIST_HEAD(clocks);
Expand Down
1 change: 1 addition & 0 deletions drivers/input/keyboard/hil_kbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/semaphore.h>
#include <linux/slab.h>
#include <linux/pci_ids.h>

Expand Down
1 change: 1 addition & 0 deletions drivers/input/misc/hp_sdc_rtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
#include <linux/proc_fs.h>
#include <linux/poll.h>
#include <linux/rtc.h>
#include <linux/semaphore.h>

MODULE_AUTHOR("Brian S. Julin <[email protected]>");
MODULE_DESCRIPTION("HP i8042 SDC + MSM-58321 RTC Driver");
Expand Down
1 change: 1 addition & 0 deletions drivers/input/serio/hp_sdc.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
#include <linux/module.h>
#include <linux/ioport.h>
#include <linux/time.h>
#include <linux/semaphore.h>
#include <linux/slab.h>
#include <linux/hil.h>
#include <linux/semaphore.h>
Expand Down
1 change: 0 additions & 1 deletion include/asm-alpha/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-arm/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-avr32/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-blackfin/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-cris/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-frv/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-h8300/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-ia64/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-m32r/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-m68k/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-m68knommu/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-mips/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-mn10300/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-parisc/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-powerpc/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-s390/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-sh/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-sparc/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-sparc64/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-um/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-x86/semaphore.h

This file was deleted.

1 change: 0 additions & 1 deletion include/asm-xtensa/semaphore.h

This file was deleted.

6 changes: 2 additions & 4 deletions include/linux/semaphore.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,8 @@ struct semaphore {
.wait_list = LIST_HEAD_INIT((name).wait_list), \
}

#define __DECLARE_SEMAPHORE_GENERIC(name, count) \
struct semaphore name = __SEMAPHORE_INITIALIZER(name, count)

#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name, 1)
#define DECLARE_MUTEX(name) \
struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1)

static inline void sema_init(struct semaphore *sem, int val)
{
Expand Down

0 comments on commit 7540081

Please sign in to comment.