We already applied the 'vendor hook' for Dtask Debugging Information in below issue. (https://issuetracker.google.com/issues/162776704) There are vendor hook call in mutex and rw_semaphore, but not for rt_mutex Please refer to description in details as below, 1. Description This feature writes rt mutex lock waiting information on the task_struct structure. We can check mutex information and mutex owner through the kernel log and custom analysis tools. Like the previous feature in mutex and rw semaphore, added data can be checked by ramdump analysis. 2. Vendor Hook Position 1) VENDOR_DATA - struct task_struct in sched.h VENDOR_DATA_ARRAY(2) [0] : type // RTmutex (Mutex, Rwsem, ...) [1] : pointer // address of lock 2) VENDOR_HOOKs - __rt_mutex_slowlock() in kernel/locking/rtmutex.c 3. Example - SysRq-w in kernel log ... [ 54.164463] [3: kworker/u16:3: 253] kworker/3:2 D12736 418 2 0x00000228 [ 54.164497] [3: kworker/u16:3: 253] RTmutex: 0xffffffc051fa3ae8: owner[sh :9003] [ 54.167812] [3: kworker/u16:3: 253] sh D12848 9003 6900 0x04000200 [ 54.167824] [3: kworker/u16:3: 253] RTmutex: 0xffffffc051fa3b08: owner[kworker/3:2 :418] ... Bug: 186567468 Signed-off-by: JINHO LIM <jordan.lim@samsung.com> Change-Id: I93f9753be0b2c1fa1a6eaea09379d54c31d1ebcf
126 lines
6.2 KiB
C
126 lines
6.2 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/* vendor_hook.c
|
|
*
|
|
* Android Vendor Hook Support
|
|
*
|
|
* Copyright 2020 Google LLC
|
|
*/
|
|
|
|
#define CREATE_TRACE_POINTS
|
|
#include <trace/hooks/vendor_hooks.h>
|
|
#include <trace/hooks/sched.h>
|
|
#include <trace/hooks/fpsimd.h>
|
|
#include <trace/hooks/binder.h>
|
|
#include <trace/hooks/rwsem.h>
|
|
#include <trace/hooks/futex.h>
|
|
#include <trace/hooks/dtask.h>
|
|
#include <trace/hooks/cpuidle.h>
|
|
#include <trace/hooks/topology.h>
|
|
#include <trace/hooks/mpam.h>
|
|
#include <trace/hooks/gic.h>
|
|
#include <trace/hooks/wqlockup.h>
|
|
#include <trace/hooks/debug.h>
|
|
#include <trace/hooks/sysrqcrash.h>
|
|
#include <trace/hooks/printk.h>
|
|
#include <trace/hooks/gic_v3.h>
|
|
#include <trace/hooks/epoch.h>
|
|
#include <trace/hooks/cpufreq.h>
|
|
#include <trace/hooks/mm.h>
|
|
#include <trace/hooks/preemptirq.h>
|
|
#include <trace/hooks/ftrace_dump.h>
|
|
#include <trace/hooks/ufshcd.h>
|
|
#include <trace/hooks/cgroup.h>
|
|
#include <trace/hooks/sys.h>
|
|
|
|
/*
|
|
* Export tracepoints that act as a bare tracehook (ie: have no trace event
|
|
* associated with them) to allow external modules to probe them.
|
|
*/
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_select_task_rq_fair);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_select_task_rq_rt);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_select_fallback_rq);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_scheduler_tick);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_enqueue_task);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_dequeue_task);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_can_migrate_task);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_lowest_rq);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_rtmutex_prepare_setprio);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_prepare_prio_fork);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_finish_prio_fork);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_user_nice);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_setscheduler);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_arch_set_freq_scale);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_is_fpsimd_save);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_transaction_init);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_set_priority);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_restore_priority);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_wakeup_poll_threads_ilocked);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_wakeup_thread_ilocked);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_init);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_wake);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_write_finished);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alter_rwsem_list_add);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alter_futex_plist_add);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mutex_wait_start);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mutex_wait_finish);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rtmutex_wait_start);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rtmutex_wait_finish);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_read_wait_start);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_read_wait_finish);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_write_wait_start);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_write_wait_finish);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sched_show_task);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpu_idle_enter);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpu_idle_exit);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mpam_set);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_busiest_group);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gic_resume);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_wq_lockup_pool);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ipi_stop);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sysrq_crash);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_dump_throttled_rt_tasks);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_printk_hotplug);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_jiffies_update);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gic_v3_set_affinity);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gic_v3_affinity_init);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_show_suspend_epoch_val);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_show_resume_epoch_val);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_show_max_freq);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_freq_table_limits);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sched_newidle_balance);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sched_nohz_balancer_kick);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_busiest_queue);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_migrate_queued_task);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_energy_efficient_cpu);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_sugov_sched_attr);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_iowait);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_sugov_update);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sched_setaffinity);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_cpus_allowed);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_skip_swapcache_flags);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_gfp_zone_flags);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_readahead_gfp_mask);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_preempt_disable);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_preempt_enable);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_irqs_disable);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_irqs_enable);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpu_cgroup_attach);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpu_cgroup_can_attach);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_map_util_freq);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_em_cpu_energy);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_oops_enter);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_oops_exit);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_size_check);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_format_check);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_dump_buffer);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_fill_prdt);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_prepare_command);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_update_sysfs);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_command);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_compl_command);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cgroup_set_task);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_syscall_prctl_finished);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_uic_command);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_tm_command);
|
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_check_int_errors);
|