diff --git a/kernel/sched/walt/Makefile b/kernel/sched/walt/Makefile index 63f3f1b50e95..6595bb7ae0a1 100644 --- a/kernel/sched/walt/Makefile +++ b/kernel/sched/walt/Makefile @@ -4,7 +4,7 @@ KCOV_INSTRUMENT := n KCSAN_SANITIZE := n obj-$(CONFIG_SCHED_WALT) += sched-walt.o -sched-walt-$(CONFIG_SCHED_WALT) := walt.o boost.o sched_avg.o walt_halt.o core_ctl.o trace.o input-boost.o sysctl.o cpufreq_walt.o fixup.o walt_lb.o walt_rt.o walt_cfs.o walt_tp.o +sched-walt-$(CONFIG_SCHED_WALT) := walt.o boost.o sched_avg.o walt_halt.o core_ctl.o trace.o input-boost.o sysctl.o cpufreq_walt.o fixup.o walt_lb.o walt_rt.o walt_cfs.o walt_tp.o mvp_locking.o obj-$(CONFIG_SCHED_WALT_DEBUG) += sched-walt-debug.o sched-walt-debug-$(CONFIG_SCHED_WALT_DEBUG) := walt_debug.o preemptirq_long.o diff --git a/kernel/sched/walt/mvp_locking.c b/kernel/sched/walt/mvp_locking.c new file mode 100644 index 000000000000..b3c43fed838b --- /dev/null +++ b/kernel/sched/walt/mvp_locking.c @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. + */ + +#include +#include "../../locking/mutex.h" +#include "walt.h" + +static void android_vh_alter_mutex_list_add(void *unused, struct mutex *lock, + struct mutex_waiter *waiter, struct list_head *list, + bool *already_on_list) +{ + struct walt_task_struct *wts_waiter = + (struct walt_task_struct *)current->android_vendor_data1; + struct mutex_waiter *pos = NULL; + struct mutex_waiter *n = NULL; + struct list_head *head = list; + struct walt_task_struct *wts; + + if (unlikely(walt_disabled)) + return; + + if (!lock || !waiter || !list) + return; + + if (!is_mvp(wts_waiter)) + return; + + list_for_each_entry_safe(pos, n, head, list) { + wts = (struct walt_task_struct *) + ((struct task_struct *)(pos->task)->android_vendor_data1); + if (!is_mvp(wts)) { + list_add(&waiter->list, pos->list.prev); + *already_on_list = true; + break; + } + } +} + +void walt_mvp_lock_ordering_init(void) +{ + register_trace_android_vh_alter_mutex_list_add(android_vh_alter_mutex_list_add, NULL); +} diff --git a/kernel/sched/walt/walt.c b/kernel/sched/walt/walt.c index 5cb113100e23..eed186caec3f 100644 --- a/kernel/sched/walt/walt.c +++ b/kernel/sched/walt/walt.c @@ -5450,6 +5450,7 @@ static void walt_init(struct work_struct *work) walt_rt_init(); walt_cfs_init(); walt_halt_init(); + walt_mvp_lock_ordering_init(); wait_for_completion_interruptible(&tick_sched_clock_completion); diff --git a/kernel/sched/walt/walt.h b/kernel/sched/walt/walt.h index 4c7d17b2351c..0131bd8772df 100644 --- a/kernel/sched/walt/walt.h +++ b/kernel/sched/walt/walt.h @@ -879,6 +879,7 @@ extern void sched_update_hyst_times(void); extern void walt_rt_init(void); extern void walt_cfs_init(void); extern void walt_halt_init(void); +extern void walt_mvp_lock_ordering_init(void); extern void walt_fixup_init(void); extern int walt_find_energy_efficient_cpu(struct task_struct *p, int prev_cpu, int sync, int sibling_count_hint);