brintos

brintos / linux-shallow public Read only

0
0
Text · 2.1 KiB · fdf7f51 Raw
72 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __LINUX_MUTEX_TYPES_H3#define __LINUX_MUTEX_TYPES_H4 5#include <linux/atomic.h>6#include <linux/lockdep_types.h>7#include <linux/osq_lock.h>8#include <linux/spinlock_types.h>9#include <linux/types.h>10 11#ifndef CONFIG_PREEMPT_RT12 13/*14 * Simple, straightforward mutexes with strict semantics:15 *16 * - only one task can hold the mutex at a time17 * - only the owner can unlock the mutex18 * - multiple unlocks are not permitted19 * - recursive locking is not permitted20 * - a mutex object must be initialized via the API21 * - a mutex object must not be initialized via memset or copying22 * - task may not exit with mutex held23 * - memory areas where held locks reside must not be freed24 * - held mutexes must not be reinitialized25 * - mutexes may not be used in hardware or software interrupt26 *   contexts such as tasklets and timers27 *28 * These semantics are fully enforced when DEBUG_MUTEXES is29 * enabled. Furthermore, besides enforcing the above rules, the mutex30 * debugging code also implements a number of additional features31 * that make lock debugging easier and faster:32 *33 * - uses symbolic names of mutexes, whenever they are printed in debug output34 * - point-of-acquire tracking, symbolic lookup of function names35 * - list of all locks held in the system, printout of them36 * - owner tracking37 * - detects self-recursing locks and prints out all relevant info38 * - detects multi-task circular deadlocks and prints out all affected39 *   locks and tasks (and only those tasks)40 */41struct mutex {42	atomic_long_t		owner;43	raw_spinlock_t		wait_lock;44#ifdef CONFIG_MUTEX_SPIN_ON_OWNER45	struct optimistic_spin_queue osq; /* Spinner MCS lock */46#endif47	struct list_head	wait_list;48#ifdef CONFIG_DEBUG_MUTEXES49	void			*magic;50#endif51#ifdef CONFIG_DEBUG_LOCK_ALLOC52	struct lockdep_map	dep_map;53#endif54};55 56#else /* !CONFIG_PREEMPT_RT */57/*58 * Preempt-RT variant based on rtmutexes.59 */60#include <linux/rtmutex.h>61 62struct mutex {63	struct rt_mutex_base	rtmutex;64#ifdef CONFIG_DEBUG_LOCK_ALLOC65	struct lockdep_map	dep_map;66#endif67};68 69#endif /* CONFIG_PREEMPT_RT */70 71#endif /* __LINUX_MUTEX_TYPES_H */72