From 102a0743326a03cd1a1202ceda21e175b7d3575c Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Tue, 20 Feb 2024 01:20:52 +0000 Subject: [PATCH] add new system file --- kernel/kernel/locking/rwsem.c | 23 +++++++++++++++++------ 1 files changed, 17 insertions(+), 6 deletions(-) diff --git a/kernel/kernel/locking/rwsem.c b/kernel/kernel/locking/rwsem.c index b55d945..acd1fc7 100644 --- a/kernel/kernel/locking/rwsem.c +++ b/kernel/kernel/locking/rwsem.c @@ -28,7 +28,6 @@ #include <linux/rwsem.h> #include <linux/atomic.h> -#ifndef CONFIG_PREEMPT_RT #include "lock_events.h" #include <trace/hooks/rwsem.h> #include <trace/hooks/dtask.h> @@ -674,6 +673,7 @@ ret = false; rcu_read_unlock(); preempt_enable(); + trace_android_vh_rwsem_can_spin_on_owner(sem, &ret, nonspinnable == RWSEM_WR_NONSPINNABLE); lockevent_cond_inc(rwsem_opt_fail, !ret); return ret; @@ -716,6 +716,8 @@ struct task_struct *new, *owner; unsigned long flags, new_flags; enum owner_state state; + int cnt = 0; + bool time_out = false; owner = rwsem_owner_flags(sem, &flags); state = rwsem_owner_state(owner, flags, nonspinnable); @@ -724,6 +726,9 @@ rcu_read_lock(); for (;;) { + trace_android_vh_rwsem_opt_spin_start(sem, &time_out, &cnt, true); + if (time_out) + break; /* * When a waiting writer set the handoff flag, it may spin * on the owner as well. Once that writer acquires the lock, @@ -787,6 +792,8 @@ int prev_owner_state = OWNER_NULL; int loop = 0; u64 rspin_threshold = 0; + int cnt = 0; + bool time_out = false; unsigned long nonspinnable = wlock ? RWSEM_WR_NONSPINNABLE : RWSEM_RD_NONSPINNABLE; @@ -804,6 +811,10 @@ */ for (;;) { enum owner_state owner_state; + + trace_android_vh_rwsem_opt_spin_start(sem, &time_out, &cnt, false); + if (time_out) + break; owner_state = rwsem_spin_on_owner(sem, nonspinnable); if (!(owner_state & OWNER_SPINNABLE)) @@ -899,6 +910,7 @@ cpu_relax(); } osq_unlock(&sem->osq); + trace_android_vh_rwsem_opt_spin_finish(sem, taken, wlock); done: preempt_enable(); lockevent_cond_inc(rwsem_opt_fail, !taken); @@ -1054,6 +1066,8 @@ raw_spin_unlock_irq(&sem->wait_lock); rwsem_set_reader_owned(sem); lockevent_inc(rwsem_rlock_fast); + trace_android_vh_record_rwsem_lock_starttime( + current, jiffies); return sem; } adjustment += RWSEM_FLAG_WAITERS; @@ -1525,7 +1539,6 @@ if (tmp & RWSEM_FLAG_WAITERS) rwsem_downgrade_wake(sem); } -#endif /* * lock for reading @@ -1639,6 +1652,7 @@ void up_write(struct rw_semaphore *sem) { rwsem_release(&sem->dep_map, _RET_IP_); + trace_android_vh_rwsem_write_finished(sem); __up_write(sem); } EXPORT_SYMBOL(up_write); @@ -1649,6 +1663,7 @@ void downgrade_write(struct rw_semaphore *sem) { lock_downgrade(&sem->dep_map, _RET_IP_); + trace_android_vh_rwsem_write_finished(sem); __downgrade_write(sem); } EXPORT_SYMBOL(downgrade_write); @@ -1689,9 +1704,7 @@ { might_sleep(); __down_read(sem); -#ifndef CONFIG_PREEMPT_RT __rwsem_set_reader_owned(sem, NULL); -#endif } EXPORT_SYMBOL(down_read_non_owner); @@ -1720,9 +1733,7 @@ void up_read_non_owner(struct rw_semaphore *sem) { -#ifndef CONFIG_PREEMPT_RT DEBUG_RWSEMS_WARN_ON(!is_rwsem_reader_owned(sem), sem); -#endif __up_read(sem); } EXPORT_SYMBOL(up_read_non_owner); -- Gitblit v1.6.2