The
lockdestroy ();
function is used to destroy a lock, and while it is called in a number of
places in the kernel, it currently does nothing.
The
lockcount ();
function returns a count of the number of exclusive locks and shared locks
held against the lock
Fa lkp .
The
lockmgr ();
function handles general locking functionality within the kernel, including
support for shared and exclusive locks, and recursion.
lockmgr ();
is also able to upgrade and downgrade locks.
Its arguments are:
Fa lkp
A pointer to the lock to manipulate.
Fa flags
Flags indicating what action is to be taken.
LK_SHARED
Acquire a shared lock.
If an exclusive lock is currently held, it will be downgraded.
LK_EXCLUSIVE
Acquire an exclusive lock.
If an exclusive lock is already held, and
LK_CANRECURSE
is not set, the system will
panic(9).
LK_DOWNGRADE
Downgrade exclusive lock to a shared lock.
Downgrading a shared lock is not permitted.
If an exclusive lock has been recursed, all references will be downgraded.
LK_EXCLUPGRADE
Upgrade a shared lock to an exclusive lock.
Fails with
Er EBUSY
if there is someone ahead of you in line waiting for an upgrade.
If this call fails, the shared lock is lost.
Attempts to upgrade an exclusive lock will cause a
panic(9).
LK_UPGRADE
Upgrade a shared lock to an exclusive lock.
If this call fails, the shared lock is lost.
During the upgrade, the shared lock could
be temporarily dropped.
Attempts to upgrade an exclusive lock will cause a
panic(9).
LK_RELEASE
Release the lock.
Releasing a lock that is not held can cause a
panic(9).
LK_DRAIN
Wait for all activity on the lock to end, then mark it decommissioned.
This is used before freeing a lock that is part of a piece of memory that is
about to be freed.
(As documented in
In sys/lockmgr.h . )
LK_SLEEPFAIL
Fail if operation has slept.
LK_NOWAIT
Do not allow the call to sleep.
This can be used to test the lock.
LK_CANRECURSE
Allow recursion on an exclusive lock.
For every lock there must be a release.
LK_INTERLOCK
Unlock the interlock (which should be locked already).
Fa interlkp
An interlock mutex for controlling group access to the lock.
If
LK_INTERLOCK
is specified,
lockmgr ();
assumes
Fa interlkp
is currently owned and not recursed, and will return it unlocked.
See
mtx_assert9.
Fa td
A thread responsible for this call.
NULL
becomes
LK_KERNPROC
The
lockstatus ();
function returns the status of the lock in relation to the
Vt thread
passed to it.
Note that if
Fa td
is
NULL
and an exclusive lock is held,
LK_EXCLUSIVE
will be returned.
The
lockmgr_printinfo ();
function prints debugging information about the lock.
It is used primarily by
VOP_PRINT9
functions.
RETURN VALUES
The
lockcount ();
function returns an integer greater than or equal to zero.
The
lockmgr ();
function returns 0 on success and non-zero on failure.
The
lockstatus ();
function returns:
LK_EXCLUSIVE
An exclusive lock is held by the thread
Fa td .
LK_EXCLOTHER
An exclusive lock is held by someone other than the thread
Fa td .
LK_SHARED
A shared lock is held.
0
The lock is not held by anyone.
ERRORS
lockmgr ();
fails if:
Bq Er EBUSY
LK_FORCEUPGRADE
was requested and another thread had already requested a lock upgrade.
Bq Er EBUSY
LK_NOWAIT
was set, and a sleep would have been required.
Bq Er ENOLCK
LK_SLEEPFAIL
was set and
lockmgr ();
did sleep.
Bq Er EINTR
PCATCH
was set in the lock priority, and a signal was delivered during a sleep.
Note the
Er ERESTART
error below.
Bq Er ERESTART
PCATCH
was set in the lock priority, a signal was delivered during a sleep,
and the system call is to be restarted.
Bq Er EWOULDBLOCK
a non-zero timeout was given, and the timeout expired.
LOCKS
If
LK_INTERLOCK
is passed in the
Fa flags
argument to
lockmgr (,);
the
Fa interlkp
must be held prior to calling
lockmgr (,);
and will be returned unlocked.
Upgrade attempts that fail result in the loss of the lock that
is currently held.
Also, it is invalid to upgrade an
exclusive lock, and a
panic(9)
will be the result of trying.