hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/kernel/locking/rwsem.c
....@@ -673,6 +673,7 @@
673673 ret = false;
674674 rcu_read_unlock();
675675 preempt_enable();
676
+ trace_android_vh_rwsem_can_spin_on_owner(sem, &ret, nonspinnable == RWSEM_WR_NONSPINNABLE);
676677
677678 lockevent_cond_inc(rwsem_opt_fail, !ret);
678679 return ret;
....@@ -715,6 +716,8 @@
715716 struct task_struct *new, *owner;
716717 unsigned long flags, new_flags;
717718 enum owner_state state;
719
+ int cnt = 0;
720
+ bool time_out = false;
718721
719722 owner = rwsem_owner_flags(sem, &flags);
720723 state = rwsem_owner_state(owner, flags, nonspinnable);
....@@ -723,6 +726,9 @@
723726
724727 rcu_read_lock();
725728 for (;;) {
729
+ trace_android_vh_rwsem_opt_spin_start(sem, &time_out, &cnt, true);
730
+ if (time_out)
731
+ break;
726732 /*
727733 * When a waiting writer set the handoff flag, it may spin
728734 * on the owner as well. Once that writer acquires the lock,
....@@ -786,6 +792,8 @@
786792 int prev_owner_state = OWNER_NULL;
787793 int loop = 0;
788794 u64 rspin_threshold = 0;
795
+ int cnt = 0;
796
+ bool time_out = false;
789797 unsigned long nonspinnable = wlock ? RWSEM_WR_NONSPINNABLE
790798 : RWSEM_RD_NONSPINNABLE;
791799
....@@ -803,6 +811,10 @@
803811 */
804812 for (;;) {
805813 enum owner_state owner_state;
814
+
815
+ trace_android_vh_rwsem_opt_spin_start(sem, &time_out, &cnt, false);
816
+ if (time_out)
817
+ break;
806818
807819 owner_state = rwsem_spin_on_owner(sem, nonspinnable);
808820 if (!(owner_state & OWNER_SPINNABLE))
....@@ -898,6 +910,7 @@
898910 cpu_relax();
899911 }
900912 osq_unlock(&sem->osq);
913
+ trace_android_vh_rwsem_opt_spin_finish(sem, taken, wlock);
901914 done:
902915 preempt_enable();
903916 lockevent_cond_inc(rwsem_opt_fail, !taken);
....@@ -1053,6 +1066,8 @@
10531066 raw_spin_unlock_irq(&sem->wait_lock);
10541067 rwsem_set_reader_owned(sem);
10551068 lockevent_inc(rwsem_rlock_fast);
1069
+ trace_android_vh_record_rwsem_lock_starttime(
1070
+ current, jiffies);
10561071 return sem;
10571072 }
10581073 adjustment += RWSEM_FLAG_WAITERS;