hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/kernel/locking/rwsem.c
....@@ -28,7 +28,6 @@
2828 #include <linux/rwsem.h>
2929 #include <linux/atomic.h>
3030
31
-#ifndef CONFIG_PREEMPT_RT
3231 #include "lock_events.h"
3332 #include <trace/hooks/rwsem.h>
3433 #include <trace/hooks/dtask.h>
....@@ -674,6 +673,7 @@
674673 ret = false;
675674 rcu_read_unlock();
676675 preempt_enable();
676
+ trace_android_vh_rwsem_can_spin_on_owner(sem, &ret, nonspinnable == RWSEM_WR_NONSPINNABLE);
677677
678678 lockevent_cond_inc(rwsem_opt_fail, !ret);
679679 return ret;
....@@ -716,6 +716,8 @@
716716 struct task_struct *new, *owner;
717717 unsigned long flags, new_flags;
718718 enum owner_state state;
719
+ int cnt = 0;
720
+ bool time_out = false;
719721
720722 owner = rwsem_owner_flags(sem, &flags);
721723 state = rwsem_owner_state(owner, flags, nonspinnable);
....@@ -724,6 +726,9 @@
724726
725727 rcu_read_lock();
726728 for (;;) {
729
+ trace_android_vh_rwsem_opt_spin_start(sem, &time_out, &cnt, true);
730
+ if (time_out)
731
+ break;
727732 /*
728733 * When a waiting writer set the handoff flag, it may spin
729734 * on the owner as well. Once that writer acquires the lock,
....@@ -787,6 +792,8 @@
787792 int prev_owner_state = OWNER_NULL;
788793 int loop = 0;
789794 u64 rspin_threshold = 0;
795
+ int cnt = 0;
796
+ bool time_out = false;
790797 unsigned long nonspinnable = wlock ? RWSEM_WR_NONSPINNABLE
791798 : RWSEM_RD_NONSPINNABLE;
792799
....@@ -804,6 +811,10 @@
804811 */
805812 for (;;) {
806813 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;
807818
808819 owner_state = rwsem_spin_on_owner(sem, nonspinnable);
809820 if (!(owner_state & OWNER_SPINNABLE))
....@@ -899,6 +910,7 @@
899910 cpu_relax();
900911 }
901912 osq_unlock(&sem->osq);
913
+ trace_android_vh_rwsem_opt_spin_finish(sem, taken, wlock);
902914 done:
903915 preempt_enable();
904916 lockevent_cond_inc(rwsem_opt_fail, !taken);
....@@ -1054,6 +1066,8 @@
10541066 raw_spin_unlock_irq(&sem->wait_lock);
10551067 rwsem_set_reader_owned(sem);
10561068 lockevent_inc(rwsem_rlock_fast);
1069
+ trace_android_vh_record_rwsem_lock_starttime(
1070
+ current, jiffies);
10571071 return sem;
10581072 }
10591073 adjustment += RWSEM_FLAG_WAITERS;
....@@ -1525,7 +1539,6 @@
15251539 if (tmp & RWSEM_FLAG_WAITERS)
15261540 rwsem_downgrade_wake(sem);
15271541 }
1528
-#endif
15291542
15301543 /*
15311544 * lock for reading
....@@ -1639,6 +1652,7 @@
16391652 void up_write(struct rw_semaphore *sem)
16401653 {
16411654 rwsem_release(&sem->dep_map, _RET_IP_);
1655
+ trace_android_vh_rwsem_write_finished(sem);
16421656 __up_write(sem);
16431657 }
16441658 EXPORT_SYMBOL(up_write);
....@@ -1649,6 +1663,7 @@
16491663 void downgrade_write(struct rw_semaphore *sem)
16501664 {
16511665 lock_downgrade(&sem->dep_map, _RET_IP_);
1666
+ trace_android_vh_rwsem_write_finished(sem);
16521667 __downgrade_write(sem);
16531668 }
16541669 EXPORT_SYMBOL(downgrade_write);
....@@ -1689,9 +1704,7 @@
16891704 {
16901705 might_sleep();
16911706 __down_read(sem);
1692
-#ifndef CONFIG_PREEMPT_RT
16931707 __rwsem_set_reader_owned(sem, NULL);
1694
-#endif
16951708 }
16961709 EXPORT_SYMBOL(down_read_non_owner);
16971710
....@@ -1720,9 +1733,7 @@
17201733
17211734 void up_read_non_owner(struct rw_semaphore *sem)
17221735 {
1723
-#ifndef CONFIG_PREEMPT_RT
17241736 DEBUG_RWSEMS_WARN_ON(!is_rwsem_reader_owned(sem), sem);
1725
-#endif
17261737 __up_read(sem);
17271738 }
17281739 EXPORT_SYMBOL(up_read_non_owner);