/* SPDX-License-Identifier: GPL-2.0 */ /* * 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 private data structure and API definitions.
*/
/* * This is a helper for the struct rt_mutex_waiter below. A waiter goes in two * separate trees and they need their own copy of the sort keys because of * different locking requirements. * * @entry: rbtree node to enqueue into the waiters tree * @prio: Priority of the waiter * @deadline: Deadline of the waiter if applicable * * See rt_waiter_node_less() and waiter_*_prio().
*/ struct rt_waiter_node { struct rb_node entry; int prio;
u64 deadline;
};
/* * This is the control structure for tasks blocked on a rt_mutex, * which is allocated on the kernel stack on of the blocked task. * * @tree: node to enqueue into the mutex waiters tree * @pi_tree: node to enqueue into the mutex owner waiters tree * @task: task reference to the blocked task * @lock: Pointer to the rt_mutex on which the waiter blocks * @wake_state: Wakeup state to use (TASK_NORMAL or TASK_RTLOCK_WAIT) * @ww_ctx: WW context pointer * * @tree is ordered by @lock->wait_lock * @pi_tree is ordered by rt_mutex_owner(@lock)->pi_lock
*/ struct rt_mutex_waiter { struct rt_waiter_node tree; struct rt_waiter_node pi_tree; struct task_struct *task; struct rt_mutex_base *lock; unsignedint wake_state; struct ww_acquire_ctx *ww_ctx;
};
/** * struct rt_wake_q_head - Wrapper around regular wake_q_head to support * "sleeping" spinlocks on RT * @head: The regular wake_q_head for sleeping lock variants * @rtlock_task: Task pointer for RT lock (spin/rwlock) wakeups
*/ struct rt_wake_q_head { struct wake_q_head head; struct task_struct *rtlock_task;
};
/* * Must be guarded because this header is included from rcu/tree_plugin.h * unconditionally.
*/ #ifdef CONFIG_RT_MUTEXES staticinlineint rt_mutex_has_waiters(struct rt_mutex_base *lock)
{ return !RB_EMPTY_ROOT(&lock->waiters.rb_root);
}
/* * Lockless speculative check whether @waiter is still the top waiter on * @lock. This is solely comparing pointers and not derefencing the * leftmost entry which might be about to vanish.
*/ staticinlinebool rt_mutex_waiter_is_top_waiter(struct rt_mutex_base *lock, struct rt_mutex_waiter *waiter)
{ struct rb_node *leftmost = rb_first_cached(&lock->waiters);
/* * Constants for rt mutex functions which have a selectable deadlock * detection. * * RT_MUTEX_MIN_CHAINWALK: Stops the lock chain walk when there are * no further PI adjustments to be made. * * RT_MUTEX_FULL_CHAINWALK: Invoke deadlock detection with a full * walk of the lock chain.
*/ enum rtmutex_chainwalk {
RT_MUTEX_MIN_CHAINWALK,
RT_MUTEX_FULL_CHAINWALK,
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.