| .. | .. |
|---|
| 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; |
|---|