If you have a data structure which is only ever accessed from
user context, then you can use a simple semaphore
(linux/asm/semaphore.h) to protect it. This
is the most trivial case: you initialize the semaphore to the number
of resources available (usually 1), and call
down_interruptible()
to grab the semaphore, and
up()
to release it. There is also a
down()
, which should be avoided, because it
will not return if a signal is received.
Example: linux/net/core/netfilter.c allows
registration of new setsockopt()
and
getsockopt()
calls, with
nf_register_sockopt()
. Registration and
de-registration are only done on module load and unload (and boot
time, where there is no concurrency), and the list of registrations
is only consulted for an unknown setsockopt()
or getsockopt()
system call. The
nf_sockopt_mutex is perfect to protect this,
especially since the setsockopt and getsockopt calls may well
sleep.