.. | .. |
---|
28 | 28 | #include <linux/rwsem.h> |
---|
29 | 29 | #include <linux/atomic.h> |
---|
30 | 30 | |
---|
31 | | -#ifndef CONFIG_PREEMPT_RT |
---|
32 | 31 | #include "lock_events.h" |
---|
33 | 32 | #include <trace/hooks/rwsem.h> |
---|
34 | 33 | #include <trace/hooks/dtask.h> |
---|
.. | .. |
---|
674 | 673 | ret = false; |
---|
675 | 674 | rcu_read_unlock(); |
---|
676 | 675 | preempt_enable(); |
---|
| 676 | + trace_android_vh_rwsem_can_spin_on_owner(sem, &ret, nonspinnable == RWSEM_WR_NONSPINNABLE); |
---|
677 | 677 | |
---|
678 | 678 | lockevent_cond_inc(rwsem_opt_fail, !ret); |
---|
679 | 679 | return ret; |
---|
.. | .. |
---|
716 | 716 | struct task_struct *new, *owner; |
---|
717 | 717 | unsigned long flags, new_flags; |
---|
718 | 718 | enum owner_state state; |
---|
| 719 | + int cnt = 0; |
---|
| 720 | + bool time_out = false; |
---|
719 | 721 | |
---|
720 | 722 | owner = rwsem_owner_flags(sem, &flags); |
---|
721 | 723 | state = rwsem_owner_state(owner, flags, nonspinnable); |
---|
.. | .. |
---|
724 | 726 | |
---|
725 | 727 | rcu_read_lock(); |
---|
726 | 728 | for (;;) { |
---|
| 729 | + trace_android_vh_rwsem_opt_spin_start(sem, &time_out, &cnt, true); |
---|
| 730 | + if (time_out) |
---|
| 731 | + break; |
---|
727 | 732 | /* |
---|
728 | 733 | * When a waiting writer set the handoff flag, it may spin |
---|
729 | 734 | * on the owner as well. Once that writer acquires the lock, |
---|
.. | .. |
---|
787 | 792 | int prev_owner_state = OWNER_NULL; |
---|
788 | 793 | int loop = 0; |
---|
789 | 794 | u64 rspin_threshold = 0; |
---|
| 795 | + int cnt = 0; |
---|
| 796 | + bool time_out = false; |
---|
790 | 797 | unsigned long nonspinnable = wlock ? RWSEM_WR_NONSPINNABLE |
---|
791 | 798 | : RWSEM_RD_NONSPINNABLE; |
---|
792 | 799 | |
---|
.. | .. |
---|
804 | 811 | */ |
---|
805 | 812 | for (;;) { |
---|
806 | 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; |
---|
807 | 818 | |
---|
808 | 819 | owner_state = rwsem_spin_on_owner(sem, nonspinnable); |
---|
809 | 820 | if (!(owner_state & OWNER_SPINNABLE)) |
---|
.. | .. |
---|
899 | 910 | cpu_relax(); |
---|
900 | 911 | } |
---|
901 | 912 | osq_unlock(&sem->osq); |
---|
| 913 | + trace_android_vh_rwsem_opt_spin_finish(sem, taken, wlock); |
---|
902 | 914 | done: |
---|
903 | 915 | preempt_enable(); |
---|
904 | 916 | lockevent_cond_inc(rwsem_opt_fail, !taken); |
---|
.. | .. |
---|
1054 | 1066 | raw_spin_unlock_irq(&sem->wait_lock); |
---|
1055 | 1067 | rwsem_set_reader_owned(sem); |
---|
1056 | 1068 | lockevent_inc(rwsem_rlock_fast); |
---|
| 1069 | + trace_android_vh_record_rwsem_lock_starttime( |
---|
| 1070 | + current, jiffies); |
---|
1057 | 1071 | return sem; |
---|
1058 | 1072 | } |
---|
1059 | 1073 | adjustment += RWSEM_FLAG_WAITERS; |
---|
.. | .. |
---|
1525 | 1539 | if (tmp & RWSEM_FLAG_WAITERS) |
---|
1526 | 1540 | rwsem_downgrade_wake(sem); |
---|
1527 | 1541 | } |
---|
1528 | | -#endif |
---|
1529 | 1542 | |
---|
1530 | 1543 | /* |
---|
1531 | 1544 | * lock for reading |
---|
.. | .. |
---|
1639 | 1652 | void up_write(struct rw_semaphore *sem) |
---|
1640 | 1653 | { |
---|
1641 | 1654 | rwsem_release(&sem->dep_map, _RET_IP_); |
---|
| 1655 | + trace_android_vh_rwsem_write_finished(sem); |
---|
1642 | 1656 | __up_write(sem); |
---|
1643 | 1657 | } |
---|
1644 | 1658 | EXPORT_SYMBOL(up_write); |
---|
.. | .. |
---|
1649 | 1663 | void downgrade_write(struct rw_semaphore *sem) |
---|
1650 | 1664 | { |
---|
1651 | 1665 | lock_downgrade(&sem->dep_map, _RET_IP_); |
---|
| 1666 | + trace_android_vh_rwsem_write_finished(sem); |
---|
1652 | 1667 | __downgrade_write(sem); |
---|
1653 | 1668 | } |
---|
1654 | 1669 | EXPORT_SYMBOL(downgrade_write); |
---|
.. | .. |
---|
1689 | 1704 | { |
---|
1690 | 1705 | might_sleep(); |
---|
1691 | 1706 | __down_read(sem); |
---|
1692 | | -#ifndef CONFIG_PREEMPT_RT |
---|
1693 | 1707 | __rwsem_set_reader_owned(sem, NULL); |
---|
1694 | | -#endif |
---|
1695 | 1708 | } |
---|
1696 | 1709 | EXPORT_SYMBOL(down_read_non_owner); |
---|
1697 | 1710 | |
---|
.. | .. |
---|
1720 | 1733 | |
---|
1721 | 1734 | void up_read_non_owner(struct rw_semaphore *sem) |
---|
1722 | 1735 | { |
---|
1723 | | -#ifndef CONFIG_PREEMPT_RT |
---|
1724 | 1736 | DEBUG_RWSEMS_WARN_ON(!is_rwsem_reader_owned(sem), sem); |
---|
1725 | | -#endif |
---|
1726 | 1737 | __up_read(sem); |
---|
1727 | 1738 | } |
---|
1728 | 1739 | EXPORT_SYMBOL(up_read_non_owner); |
---|