64 lines
1.4 KiB
C
Executable File
64 lines
1.4 KiB
C
Executable File
#ifdef CONFIG_FAST_TRACK
|
|
#include <linux/version.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/list.h>
|
|
#include <linux/mutex.h>
|
|
#include <cpu/ftt/ftt.h>
|
|
|
|
static void mutex_list_add_ftt(struct list_head *entry, struct list_head *head)
|
|
{
|
|
struct list_head *pos = NULL;
|
|
struct mutex_waiter *waiter = NULL;
|
|
|
|
list_for_each(pos, head) {
|
|
waiter = list_entry(pos, struct mutex_waiter, list);
|
|
if (!is_ftt(&waiter->task->se)) {
|
|
list_add(entry, waiter->list.prev);
|
|
return;
|
|
}
|
|
}
|
|
if (pos == head) {
|
|
list_add_tail(entry, head);
|
|
}
|
|
}
|
|
|
|
void mutex_list_add(struct task_struct *task, struct list_head *entry, struct list_head *head, struct mutex *lock)
|
|
{
|
|
if (unlikely(task == NULL))
|
|
return;
|
|
|
|
if (is_ftt(&task->se)) {
|
|
mutex_list_add_ftt(entry, head);
|
|
} else {
|
|
list_add_tail(entry, head);
|
|
}
|
|
}
|
|
|
|
void mutex_dynamic_ftt_enqueue(struct mutex *lock, struct task_struct *task)
|
|
{
|
|
struct task_struct *owner = NULL;
|
|
|
|
if (unlikely(task == NULL))
|
|
return;
|
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,14,0)
|
|
owner = __mutex_owner(lock);
|
|
#else
|
|
owner = lock->owner;
|
|
#endif
|
|
if (is_ftt(&task->se) && !lock->ftt_dep_task && owner && !is_ftt(&owner->se)) {
|
|
dynamic_ftt_enqueue(owner, DYNAMIC_FTT_MUTEX);
|
|
lock->ftt_dep_task = owner;
|
|
}
|
|
}
|
|
|
|
void mutex_dynamic_ftt_dequeue(struct mutex *lock, struct task_struct *task)
|
|
{
|
|
if (lock->ftt_dep_task == task) {
|
|
dynamic_ftt_dequeue(task, DYNAMIC_FTT_MUTEX);
|
|
lock->ftt_dep_task = NULL;
|
|
}
|
|
}
|
|
|
|
#endif
|