.. | .. |
---|
673 | 673 | ret = false; |
---|
674 | 674 | rcu_read_unlock(); |
---|
675 | 675 | preempt_enable(); |
---|
| 676 | + trace_android_vh_rwsem_can_spin_on_owner(sem, &ret, nonspinnable == RWSEM_WR_NONSPINNABLE); |
---|
676 | 677 | |
---|
677 | 678 | lockevent_cond_inc(rwsem_opt_fail, !ret); |
---|
678 | 679 | return ret; |
---|
.. | .. |
---|
715 | 716 | struct task_struct *new, *owner; |
---|
716 | 717 | unsigned long flags, new_flags; |
---|
717 | 718 | enum owner_state state; |
---|
| 719 | + int cnt = 0; |
---|
| 720 | + bool time_out = false; |
---|
718 | 721 | |
---|
719 | 722 | owner = rwsem_owner_flags(sem, &flags); |
---|
720 | 723 | state = rwsem_owner_state(owner, flags, nonspinnable); |
---|
.. | .. |
---|
723 | 726 | |
---|
724 | 727 | rcu_read_lock(); |
---|
725 | 728 | for (;;) { |
---|
| 729 | + trace_android_vh_rwsem_opt_spin_start(sem, &time_out, &cnt, true); |
---|
| 730 | + if (time_out) |
---|
| 731 | + break; |
---|
726 | 732 | /* |
---|
727 | 733 | * When a waiting writer set the handoff flag, it may spin |
---|
728 | 734 | * on the owner as well. Once that writer acquires the lock, |
---|
.. | .. |
---|
786 | 792 | int prev_owner_state = OWNER_NULL; |
---|
787 | 793 | int loop = 0; |
---|
788 | 794 | u64 rspin_threshold = 0; |
---|
| 795 | + int cnt = 0; |
---|
| 796 | + bool time_out = false; |
---|
789 | 797 | unsigned long nonspinnable = wlock ? RWSEM_WR_NONSPINNABLE |
---|
790 | 798 | : RWSEM_RD_NONSPINNABLE; |
---|
791 | 799 | |
---|
.. | .. |
---|
803 | 811 | */ |
---|
804 | 812 | for (;;) { |
---|
805 | 813 | 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; |
---|
806 | 818 | |
---|
807 | 819 | owner_state = rwsem_spin_on_owner(sem, nonspinnable); |
---|
808 | 820 | if (!(owner_state & OWNER_SPINNABLE)) |
---|
.. | .. |
---|
898 | 910 | cpu_relax(); |
---|
899 | 911 | } |
---|
900 | 912 | osq_unlock(&sem->osq); |
---|
| 913 | + trace_android_vh_rwsem_opt_spin_finish(sem, taken, wlock); |
---|
901 | 914 | done: |
---|
902 | 915 | preempt_enable(); |
---|
903 | 916 | lockevent_cond_inc(rwsem_opt_fail, !taken); |
---|
.. | .. |
---|
1053 | 1066 | raw_spin_unlock_irq(&sem->wait_lock); |
---|
1054 | 1067 | rwsem_set_reader_owned(sem); |
---|
1055 | 1068 | lockevent_inc(rwsem_rlock_fast); |
---|
| 1069 | + trace_android_vh_record_rwsem_lock_starttime( |
---|
| 1070 | + current, jiffies); |
---|
1056 | 1071 | return sem; |
---|
1057 | 1072 | } |
---|
1058 | 1073 | adjustment += RWSEM_FLAG_WAITERS; |
---|