mutex.c 12.5 KB
Newer Older
I
Ingo Molnar 已提交
1 2 3 4 5 6 7 8 9 10 11 12
/*
 * kernel/mutex.c
 *
 * Mutexes: blocking mutual exclusion locks
 *
 * Started by Ingo Molnar:
 *
 *  Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
 *
 * Many thanks to Arjan van de Ven, Thomas Gleixner, Steven Rostedt and
 * David Howells for suggestions and improvements.
 *
13 14 15 16 17
 *  - Adaptive spinning for mutexes by Peter Zijlstra. (Ported to mainline
 *    from the -rt tree, where it was originally implemented for rtmutexes
 *    by Steven Rostedt, based on work by Gregory Haskins, Peter Morreale
 *    and Sven Dietrich.
 *
I
Ingo Molnar 已提交
18 19 20 21 22 23 24
 * Also see Documentation/mutex-design.txt.
 */
#include <linux/mutex.h>
#include <linux/sched.h>
#include <linux/module.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
25
#include <linux/debug_locks.h>
I
Ingo Molnar 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

/*
 * In the DEBUG case we are using the "NULL fastpath" for mutexes,
 * which forces all calls into the slowpath:
 */
#ifdef CONFIG_DEBUG_MUTEXES
# include "mutex-debug.h"
# include <asm-generic/mutex-null.h>
#else
# include "mutex.h"
# include <asm/mutex.h>
#endif

/***
 * mutex_init - initialize the mutex
 * @lock: the mutex to be initialized
42
 * @key: the lock_class_key for the class; used by mutex lock debugging
I
Ingo Molnar 已提交
43 44 45 46 47
 *
 * Initialize the mutex to unlocked state.
 *
 * It is not allowed to initialize an already locked mutex.
 */
48 49
void
__mutex_init(struct mutex *lock, const char *name, struct lock_class_key *key)
I
Ingo Molnar 已提交
50 51 52 53
{
	atomic_set(&lock->count, 1);
	spin_lock_init(&lock->wait_lock);
	INIT_LIST_HEAD(&lock->wait_list);
54
	mutex_clear_owner(lock);
I
Ingo Molnar 已提交
55

56
	debug_mutex_init(lock, name, key);
I
Ingo Molnar 已提交
57 58 59 60
}

EXPORT_SYMBOL(__mutex_init);

P
Peter Zijlstra 已提交
61
#ifndef CONFIG_DEBUG_LOCK_ALLOC
I
Ingo Molnar 已提交
62 63 64 65 66 67
/*
 * We split the mutex lock/unlock logic into separate fastpath and
 * slowpath functions, to reduce the register pressure on the fastpath.
 * We also put the fastpath first in the kernel image, to make sure the
 * branch is predicted by the CPU as default-untaken.
 */
68
static __used noinline void __sched
69
__mutex_lock_slowpath(atomic_t *lock_count);
I
Ingo Molnar 已提交
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91

/***
 * mutex_lock - acquire the mutex
 * @lock: the mutex to be acquired
 *
 * Lock the mutex exclusively for this task. If the mutex is not
 * available right now, it will sleep until it can get it.
 *
 * The mutex must later on be released by the same task that
 * acquired it. Recursive locking is not allowed. The task
 * may not exit without first unlocking the mutex. Also, kernel
 * memory where the mutex resides mutex must not be freed with
 * the mutex still locked. The mutex must first be initialized
 * (or statically defined) before it can be locked. memset()-ing
 * the mutex to 0 is not allowed.
 *
 * ( The CONFIG_DEBUG_MUTEXES .config option turns on debugging
 *   checks that will enforce the restrictions and will also do
 *   deadlock debugging. )
 *
 * This function is similar to (but not equivalent to) down().
 */
92
void inline __sched mutex_lock(struct mutex *lock)
I
Ingo Molnar 已提交
93
{
94
	might_sleep();
I
Ingo Molnar 已提交
95 96 97 98 99
	/*
	 * The locking fastpath is the 1->0 transition from
	 * 'unlocked' into 'locked' state.
	 */
	__mutex_fastpath_lock(&lock->count, __mutex_lock_slowpath);
100
	mutex_set_owner(lock);
I
Ingo Molnar 已提交
101 102 103
}

EXPORT_SYMBOL(mutex_lock);
P
Peter Zijlstra 已提交
104
#endif
I
Ingo Molnar 已提交
105

106
static __used noinline void __sched __mutex_unlock_slowpath(atomic_t *lock_count);
I
Ingo Molnar 已提交
107 108 109 110 111 112 113 114 115 116 117 118

/***
 * mutex_unlock - release the mutex
 * @lock: the mutex to be released
 *
 * Unlock a mutex that has been locked by this task previously.
 *
 * This function must not be used in interrupt context. Unlocking
 * of a not locked mutex is not allowed.
 *
 * This function is similar to (but not equivalent to) up().
 */
119
void __sched mutex_unlock(struct mutex *lock)
I
Ingo Molnar 已提交
120 121 122 123 124
{
	/*
	 * The unlocking fastpath is the 0->1 transition from 'locked'
	 * into 'unlocked' state:
	 */
125 126 127 128 129 130 131 132
#ifndef CONFIG_DEBUG_MUTEXES
	/*
	 * When debugging is enabled we must not clear the owner before time,
	 * the slow path will always be taken, and that clears the owner field
	 * after verifying that it was indeed current.
	 */
	mutex_clear_owner(lock);
#endif
I
Ingo Molnar 已提交
133 134 135 136 137 138 139 140 141
	__mutex_fastpath_unlock(&lock->count, __mutex_unlock_slowpath);
}

EXPORT_SYMBOL(mutex_unlock);

/*
 * Lock a mutex (possibly interruptible), slowpath:
 */
static inline int __sched
P
Peter Zijlstra 已提交
142 143
__mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
	       	unsigned long ip)
I
Ingo Molnar 已提交
144 145 146
{
	struct task_struct *task = current;
	struct mutex_waiter waiter;
147
	unsigned long flags;
I
Ingo Molnar 已提交
148

P
Peter Zijlstra 已提交
149
	preempt_disable();
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
	mutex_acquire(&lock->dep_map, subclass, 0, ip);
#if defined(CONFIG_SMP) && !defined(CONFIG_DEBUG_MUTEXES)
	/*
	 * Optimistic spinning.
	 *
	 * We try to spin for acquisition when we find that there are no
	 * pending waiters and the lock owner is currently running on a
	 * (different) CPU.
	 *
	 * The rationale is that if the lock owner is running, it is likely to
	 * release the lock soon.
	 *
	 * Since this needs the lock owner, and this mutex implementation
	 * doesn't track the owner atomically in the lock field, we need to
	 * track it non-atomically.
	 *
	 * We can't do this for DEBUG_MUTEXES because that relies on wait_lock
	 * to serialize everything.
	 */

	for (;;) {
		struct thread_info *owner;

		/*
		 * If there's an owner, wait for it to either
		 * release the lock or go to sleep.
		 */
		owner = ACCESS_ONCE(lock->owner);
		if (owner && !mutex_spin_on_owner(lock, owner))
			break;

181 182 183 184 185 186 187
		if (atomic_cmpxchg(&lock->count, 1, 0) == 1) {
			lock_acquired(&lock->dep_map, ip);
			mutex_set_owner(lock);
			preempt_enable();
			return 0;
		}

188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
		/*
		 * When there's no owner, we might have preempted between the
		 * owner acquiring the lock and setting the owner field. If
		 * we're an RT task that will live-lock because we won't let
		 * the owner complete.
		 */
		if (!owner && (need_resched() || rt_task(task)))
			break;

		/*
		 * The cpu_relax() call is a compiler barrier which forces
		 * everything in this loop to be re-loaded. We don't need
		 * memory barriers as we'll eventually observe the right
		 * values at the cost of a few extra spins.
		 */
		cpu_relax();
	}
#endif
206
	spin_lock_mutex(&lock->wait_lock, flags);
I
Ingo Molnar 已提交
207

208
	debug_mutex_lock_common(lock, &waiter);
R
Roman Zippel 已提交
209
	debug_mutex_add_waiter(lock, &waiter, task_thread_info(task));
I
Ingo Molnar 已提交
210 211 212 213 214

	/* add waiting tasks to the end of the waitqueue (FIFO): */
	list_add_tail(&waiter.list, &lock->wait_list);
	waiter.task = task;

P
Peter Zijlstra 已提交
215
	if (atomic_xchg(&lock->count, -1) == 1)
216 217
		goto done;

P
Peter Zijlstra 已提交
218
	lock_contended(&lock->dep_map, ip);
219

I
Ingo Molnar 已提交
220 221 222 223 224 225 226 227 228 229
	for (;;) {
		/*
		 * Lets try to take the lock again - this is needed even if
		 * we get here for the first time (shortly after failing to
		 * acquire the lock), to make sure that we get a wakeup once
		 * it's unlocked. Later on, if we sleep, this is the
		 * operation that gives us the lock. We xchg it to -1, so
		 * that when we release the lock, we properly wake up the
		 * other waiters:
		 */
P
Peter Zijlstra 已提交
230
		if (atomic_xchg(&lock->count, -1) == 1)
I
Ingo Molnar 已提交
231 232 233 234 235 236
			break;

		/*
		 * got a signal? (This code gets eliminated in the
		 * TASK_UNINTERRUPTIBLE case.)
		 */
237
		if (unlikely(signal_pending_state(state, task))) {
L
Liam R. Howlett 已提交
238 239
			mutex_remove_waiter(lock, &waiter,
					    task_thread_info(task));
P
Peter Zijlstra 已提交
240
			mutex_release(&lock->dep_map, 1, ip);
241
			spin_unlock_mutex(&lock->wait_lock, flags);
I
Ingo Molnar 已提交
242 243

			debug_mutex_free_waiter(&waiter);
P
Peter Zijlstra 已提交
244
			preempt_enable();
I
Ingo Molnar 已提交
245 246 247 248 249
			return -EINTR;
		}
		__set_task_state(task, state);

		/* didnt get the lock, go to sleep: */
250
		spin_unlock_mutex(&lock->wait_lock, flags);
P
Peter Zijlstra 已提交
251
		__schedule();
252
		spin_lock_mutex(&lock->wait_lock, flags);
I
Ingo Molnar 已提交
253 254
	}

255
done:
P
Peter Zijlstra 已提交
256
	lock_acquired(&lock->dep_map, ip);
I
Ingo Molnar 已提交
257
	/* got the lock - rejoice! */
258 259
	mutex_remove_waiter(lock, &waiter, current_thread_info());
	mutex_set_owner(lock);
I
Ingo Molnar 已提交
260 261 262 263 264

	/* set it to 0 if there are no waiters left: */
	if (likely(list_empty(&lock->wait_list)))
		atomic_set(&lock->count, 0);

265
	spin_unlock_mutex(&lock->wait_lock, flags);
I
Ingo Molnar 已提交
266 267

	debug_mutex_free_waiter(&waiter);
P
Peter Zijlstra 已提交
268
	preempt_enable();
I
Ingo Molnar 已提交
269 270 271 272

	return 0;
}

273 274 275 276 277
#ifdef CONFIG_DEBUG_LOCK_ALLOC
void __sched
mutex_lock_nested(struct mutex *lock, unsigned int subclass)
{
	might_sleep();
P
Peter Zijlstra 已提交
278
	__mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, subclass, _RET_IP_);
279 280 281
}

EXPORT_SYMBOL_GPL(mutex_lock_nested);
282

L
Liam R. Howlett 已提交
283 284 285 286 287 288 289 290
int __sched
mutex_lock_killable_nested(struct mutex *lock, unsigned int subclass)
{
	might_sleep();
	return __mutex_lock_common(lock, TASK_KILLABLE, subclass, _RET_IP_);
}
EXPORT_SYMBOL_GPL(mutex_lock_killable_nested);

291 292 293 294
int __sched
mutex_lock_interruptible_nested(struct mutex *lock, unsigned int subclass)
{
	might_sleep();
295 296
	return __mutex_lock_common(lock, TASK_INTERRUPTIBLE,
				   subclass, _RET_IP_);
297 298 299
}

EXPORT_SYMBOL_GPL(mutex_lock_interruptible_nested);
300 301
#endif

I
Ingo Molnar 已提交
302 303 304
/*
 * Release the lock, slowpath:
 */
305
static inline void
306
__mutex_unlock_common_slowpath(atomic_t *lock_count, int nested)
I
Ingo Molnar 已提交
307
{
308
	struct mutex *lock = container_of(lock_count, struct mutex, count);
309
	unsigned long flags;
I
Ingo Molnar 已提交
310

311
	spin_lock_mutex(&lock->wait_lock, flags);
312
	mutex_release(&lock->dep_map, nested, _RET_IP_);
313
	debug_mutex_unlock(lock);
I
Ingo Molnar 已提交
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333

	/*
	 * some architectures leave the lock unlocked in the fastpath failure
	 * case, others need to leave it locked. In the later case we have to
	 * unlock it here
	 */
	if (__mutex_slowpath_needs_to_unlock())
		atomic_set(&lock->count, 1);

	if (!list_empty(&lock->wait_list)) {
		/* get the first entry from the wait-list: */
		struct mutex_waiter *waiter =
				list_entry(lock->wait_list.next,
					   struct mutex_waiter, list);

		debug_mutex_wake_waiter(lock, waiter);

		wake_up_process(waiter->task);
	}

334
	spin_unlock_mutex(&lock->wait_lock, flags);
I
Ingo Molnar 已提交
335 336
}

337 338 339
/*
 * Release the lock, slowpath:
 */
340
static __used noinline void
341 342
__mutex_unlock_slowpath(atomic_t *lock_count)
{
343
	__mutex_unlock_common_slowpath(lock_count, 1);
344 345
}

P
Peter Zijlstra 已提交
346
#ifndef CONFIG_DEBUG_LOCK_ALLOC
I
Ingo Molnar 已提交
347 348 349 350
/*
 * Here come the less common (and hence less performance-critical) APIs:
 * mutex_lock_interruptible() and mutex_trylock().
 */
351
static noinline int __sched
L
Liam R. Howlett 已提交
352 353
__mutex_lock_killable_slowpath(atomic_t *lock_count);

354
static noinline int __sched
355
__mutex_lock_interruptible_slowpath(atomic_t *lock_count);
I
Ingo Molnar 已提交
356 357 358 359 360 361 362 363 364 365 366 367

/***
 * mutex_lock_interruptible - acquire the mutex, interruptable
 * @lock: the mutex to be acquired
 *
 * Lock the mutex like mutex_lock(), and return 0 if the mutex has
 * been acquired or sleep until the mutex becomes available. If a
 * signal arrives while waiting for the lock then this function
 * returns -EINTR.
 *
 * This function is similar to (but not equivalent to) down_interruptible().
 */
368
int __sched mutex_lock_interruptible(struct mutex *lock)
I
Ingo Molnar 已提交
369
{
370 371
	int ret;

372
	might_sleep();
373
	ret =  __mutex_fastpath_lock_retval
I
Ingo Molnar 已提交
374
			(&lock->count, __mutex_lock_interruptible_slowpath);
375 376 377 378
	if (!ret)
		mutex_set_owner(lock);

	return ret;
I
Ingo Molnar 已提交
379 380 381 382
}

EXPORT_SYMBOL(mutex_lock_interruptible);

383
int __sched mutex_lock_killable(struct mutex *lock)
L
Liam R. Howlett 已提交
384
{
385 386
	int ret;

L
Liam R. Howlett 已提交
387
	might_sleep();
388
	ret = __mutex_fastpath_lock_retval
L
Liam R. Howlett 已提交
389
			(&lock->count, __mutex_lock_killable_slowpath);
390 391 392 393
	if (!ret)
		mutex_set_owner(lock);

	return ret;
L
Liam R. Howlett 已提交
394 395 396
}
EXPORT_SYMBOL(mutex_lock_killable);

397
static __used noinline void __sched
P
Peter Zijlstra 已提交
398 399 400 401 402 403 404
__mutex_lock_slowpath(atomic_t *lock_count)
{
	struct mutex *lock = container_of(lock_count, struct mutex, count);

	__mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, 0, _RET_IP_);
}

405
static noinline int __sched
L
Liam R. Howlett 已提交
406 407 408 409 410 411 412
__mutex_lock_killable_slowpath(atomic_t *lock_count)
{
	struct mutex *lock = container_of(lock_count, struct mutex, count);

	return __mutex_lock_common(lock, TASK_KILLABLE, 0, _RET_IP_);
}

413
static noinline int __sched
414
__mutex_lock_interruptible_slowpath(atomic_t *lock_count)
I
Ingo Molnar 已提交
415 416 417
{
	struct mutex *lock = container_of(lock_count, struct mutex, count);

P
Peter Zijlstra 已提交
418
	return __mutex_lock_common(lock, TASK_INTERRUPTIBLE, 0, _RET_IP_);
I
Ingo Molnar 已提交
419
}
P
Peter Zijlstra 已提交
420
#endif
I
Ingo Molnar 已提交
421 422 423 424 425 426 427 428

/*
 * Spinlock based trylock, we take the spinlock and check whether we
 * can get the lock:
 */
static inline int __mutex_trylock_slowpath(atomic_t *lock_count)
{
	struct mutex *lock = container_of(lock_count, struct mutex, count);
429
	unsigned long flags;
I
Ingo Molnar 已提交
430 431
	int prev;

432
	spin_lock_mutex(&lock->wait_lock, flags);
I
Ingo Molnar 已提交
433 434

	prev = atomic_xchg(&lock->count, -1);
435
	if (likely(prev == 1)) {
436
		mutex_set_owner(lock);
437 438
		mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_);
	}
439

I
Ingo Molnar 已提交
440 441 442 443
	/* Set it back to 0 if there are no waiters: */
	if (likely(list_empty(&lock->wait_list)))
		atomic_set(&lock->count, 0);

444
	spin_unlock_mutex(&lock->wait_lock, flags);
I
Ingo Molnar 已提交
445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462

	return prev == 1;
}

/***
 * mutex_trylock - try acquire the mutex, without waiting
 * @lock: the mutex to be acquired
 *
 * Try to acquire the mutex atomically. Returns 1 if the mutex
 * has been acquired successfully, and 0 on contention.
 *
 * NOTE: this function follows the spin_trylock() convention, so
 * it is negated to the down_trylock() return values! Be careful
 * about this when converting semaphore users to mutexes.
 *
 * This function must not be used in interrupt context. The
 * mutex must be released by the same task that acquired it.
 */
463
int __sched mutex_trylock(struct mutex *lock)
I
Ingo Molnar 已提交
464
{
465 466 467 468 469 470 471
	int ret;

	ret = __mutex_fastpath_trylock(&lock->count, __mutex_trylock_slowpath);
	if (ret)
		mutex_set_owner(lock);

	return ret;
I
Ingo Molnar 已提交
472 473 474
}

EXPORT_SYMBOL(mutex_trylock);