Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23f78d4a authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds
Browse files

[PATCH] pi-futex: rt mutex core



Core functions for the rt-mutex subsystem.

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarArjan van de Ven <arjan@linux.intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b29739f9
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -124,6 +124,7 @@ extern struct group_info init_groups;
	.cpu_timers	= INIT_CPU_TIMERS(tsk.cpu_timers),		\
	.cpu_timers	= INIT_CPU_TIMERS(tsk.cpu_timers),		\
	.fs_excl	= ATOMIC_INIT(0),				\
	.fs_excl	= ATOMIC_INIT(0),				\
	.pi_lock	= SPIN_LOCK_UNLOCKED,				\
	.pi_lock	= SPIN_LOCK_UNLOCKED,				\
	INIT_RT_MUTEXES(tsk)						\
}
}




+104 −0
Original line number Original line Diff line number Diff line
/*
 * RT Mutexes: blocking mutual exclusion locks with PI support
 *
 * started by Ingo Molnar and Thomas Gleixner:
 *
 *  Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
 *  Copyright (C) 2006, Timesys Corp., Thomas Gleixner <tglx@timesys.com>
 *
 * This file contains the public data structure and API definitions.
 */

#ifndef __LINUX_RT_MUTEX_H
#define __LINUX_RT_MUTEX_H

#include <linux/linkage.h>
#include <linux/plist.h>
#include <linux/spinlock_types.h>

/*
 * The rt_mutex structure
 *
 * @wait_lock:	spinlock to protect the structure
 * @wait_list:	pilist head to enqueue waiters in priority order
 * @owner:	the mutex owner
 */
struct rt_mutex {
	spinlock_t		wait_lock;
	struct plist_head	wait_list;
	struct task_struct	*owner;
#ifdef CONFIG_DEBUG_RT_MUTEXES
	int			save_state;
	struct list_head	held_list_entry;
	unsigned long		acquire_ip;
	const char 		*name, *file;
	int			line;
	void			*magic;
#endif
};

struct rt_mutex_waiter;
struct hrtimer_sleeper;

#ifdef CONFIG_DEBUG_RT_MUTEXES
# define __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \
	, .name = #mutexname, .file = __FILE__, .line = __LINE__
# define rt_mutex_init(mutex)			__rt_mutex_init(mutex, __FUNCTION__)
 extern void rt_mutex_debug_task_free(struct task_struct *tsk);
#else
# define __DEBUG_RT_MUTEX_INITIALIZER(mutexname)
# define rt_mutex_init(mutex)			__rt_mutex_init(mutex, NULL)
# define rt_mutex_debug_task_free(t)		do { } while (0)
#endif

#define __RT_MUTEX_INITIALIZER(mutexname) \
	{ .wait_lock = SPIN_LOCK_UNLOCKED \
	, .wait_list = PLIST_HEAD_INIT(mutexname.wait_list, mutexname.wait_lock) \
	, .owner = NULL \
	__DEBUG_RT_MUTEX_INITIALIZER(mutexname)}

#define DEFINE_RT_MUTEX(mutexname) \
	struct rt_mutex mutexname = __RT_MUTEX_INITIALIZER(mutexname)

/***
 * rt_mutex_is_locked - is the mutex locked
 * @lock: the mutex to be queried
 *
 * Returns 1 if the mutex is locked, 0 if unlocked.
 */
static inline int rt_mutex_is_locked(struct rt_mutex *lock)
{
	return lock->owner != NULL;
}

extern void __rt_mutex_init(struct rt_mutex *lock, const char *name);
extern void rt_mutex_destroy(struct rt_mutex *lock);

extern void rt_mutex_lock(struct rt_mutex *lock);
extern int rt_mutex_lock_interruptible(struct rt_mutex *lock,
						int detect_deadlock);
extern int rt_mutex_timed_lock(struct rt_mutex *lock,
					struct hrtimer_sleeper *timeout,
					int detect_deadlock);

extern int rt_mutex_trylock(struct rt_mutex *lock);

extern void rt_mutex_unlock(struct rt_mutex *lock);

#ifdef CONFIG_DEBUG_RT_MUTEXES
# define INIT_RT_MUTEX_DEBUG(tsk)					\
	.held_list_head	= LIST_HEAD_INIT(tsk.held_list_head),		\
	.held_list_lock	= SPIN_LOCK_UNLOCKED
#else
# define INIT_RT_MUTEX_DEBUG(tsk)
#endif

#ifdef CONFIG_RT_MUTEXES
# define INIT_RT_MUTEXES(tsk)						\
	.pi_waiters	= PLIST_HEAD_INIT(tsk.pi_waiters, tsk.pi_lock),	\
	INIT_RT_MUTEX_DEBUG(tsk)
#else
# define INIT_RT_MUTEXES(tsk)
#endif

#endif
+12 −0
Original line number Original line Diff line number Diff line
@@ -73,6 +73,7 @@ struct sched_param {
#include <linux/seccomp.h>
#include <linux/seccomp.h>
#include <linux/rcupdate.h>
#include <linux/rcupdate.h>
#include <linux/futex.h>
#include <linux/futex.h>
#include <linux/rtmutex.h>


#include <linux/time.h>
#include <linux/time.h>
#include <linux/param.h>
#include <linux/param.h>
@@ -858,6 +859,17 @@ struct task_struct {
	/* Protection of the PI data structures: */
	/* Protection of the PI data structures: */
	spinlock_t pi_lock;
	spinlock_t pi_lock;


#ifdef CONFIG_RT_MUTEXES
	/* PI waiters blocked on a rt_mutex held by this task */
	struct plist_head pi_waiters;
	/* Deadlock detection and priority inheritance handling */
	struct rt_mutex_waiter *pi_blocked_on;
# ifdef CONFIG_DEBUG_RT_MUTEXES
	spinlock_t held_list_lock;
	struct list_head held_list_head;
# endif
#endif

#ifdef CONFIG_DEBUG_MUTEXES
#ifdef CONFIG_DEBUG_MUTEXES
	/* mutex deadlock detection */
	/* mutex deadlock detection */
	struct mutex_waiter *blocked_on;
	struct mutex_waiter *blocked_on;
+1 −0
Original line number Original line Diff line number Diff line
@@ -149,6 +149,7 @@ enum
	KERN_ACPI_VIDEO_FLAGS=71, /* int: flags for setting up video after ACPI sleep */
	KERN_ACPI_VIDEO_FLAGS=71, /* int: flags for setting up video after ACPI sleep */
	KERN_IA64_UNALIGNED=72, /* int: ia64 unaligned userland trap enable */
	KERN_IA64_UNALIGNED=72, /* int: ia64 unaligned userland trap enable */
	KERN_COMPAT_LOG=73,	/* int: print compat layer  messages */
	KERN_COMPAT_LOG=73,	/* int: print compat layer  messages */
	KERN_MAX_LOCK_DEPTH=74,
};
};




+5 −0
Original line number Original line Diff line number Diff line
@@ -339,9 +339,14 @@ config BASE_FULL
	  kernel data structures. This saves memory on small machines,
	  kernel data structures. This saves memory on small machines,
	  but may reduce performance.
	  but may reduce performance.


config RT_MUTEXES
	boolean
	select PLIST

config FUTEX
config FUTEX
	bool "Enable futex support" if EMBEDDED
	bool "Enable futex support" if EMBEDDED
	default y
	default y
	select RT_MUTEXES
	help
	help
	  Disabling this option will cause the kernel to be built without
	  Disabling this option will cause the kernel to be built without
	  support for "fast userspace mutexes".  The resulting kernel may not
	  support for "fast userspace mutexes".  The resulting kernel may not
Loading