ANDROID: rwsem: Add vendor hook to the rw-semaphore
- Add the hook to apply vendor's performance tune for owner of rwsem. - Add the hook for the waiter list of rwsem to allow vendor perform waiting queue enhancement - ANDROID_VENDOR_DATA added to rw_semaphore Bug: 161400830 Signed-off-by: JianMin Liu <jian-min.liu@mediatek.com> Change-Id: I007a5e26f3db2adaeaf4e5ccea414ce7abfa83b8
This commit is contained in:
@@ -29,6 +29,7 @@
|
||||
#include <linux/atomic.h>
|
||||
|
||||
#include "lock_events.h"
|
||||
#include <trace/hooks/rwsem.h>
|
||||
|
||||
/*
|
||||
* The least significant 3 bits of the owner value has the following
|
||||
@@ -340,6 +341,7 @@ void __init_rwsem(struct rw_semaphore *sem, const char *name,
|
||||
#ifdef CONFIG_RWSEM_SPIN_ON_OWNER
|
||||
osq_lock_init(&sem->osq);
|
||||
#endif
|
||||
trace_android_vh_rwsem_init(sem);
|
||||
}
|
||||
EXPORT_SYMBOL(__init_rwsem);
|
||||
|
||||
@@ -995,6 +997,7 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, int state)
|
||||
struct rwsem_waiter waiter;
|
||||
DEFINE_WAKE_Q(wake_q);
|
||||
bool wake = false;
|
||||
bool already_on_list = false;
|
||||
|
||||
/*
|
||||
* Save the current read-owner of rwsem, if available, and the
|
||||
@@ -1056,7 +1059,11 @@ queue:
|
||||
}
|
||||
adjustment += RWSEM_FLAG_WAITERS;
|
||||
}
|
||||
list_add_tail(&waiter.list, &sem->wait_list);
|
||||
trace_android_vh_alter_rwsem_list_add(
|
||||
&waiter,
|
||||
sem, &already_on_list);
|
||||
if (!already_on_list)
|
||||
list_add_tail(&waiter.list, &sem->wait_list);
|
||||
|
||||
/* we're now waiting on the lock, but no longer actively locking */
|
||||
if (adjustment)
|
||||
@@ -1078,6 +1085,7 @@ queue:
|
||||
(adjustment & RWSEM_FLAG_WAITERS)))
|
||||
rwsem_mark_wake(sem, RWSEM_WAKE_ANY, &wake_q);
|
||||
|
||||
trace_android_vh_rwsem_wake(sem);
|
||||
raw_spin_unlock_irq(&sem->wait_lock);
|
||||
wake_up_q(&wake_q);
|
||||
|
||||
@@ -1141,6 +1149,7 @@ rwsem_down_write_slowpath(struct rw_semaphore *sem, int state)
|
||||
struct rwsem_waiter waiter;
|
||||
struct rw_semaphore *ret = sem;
|
||||
DEFINE_WAKE_Q(wake_q);
|
||||
bool already_on_list = false;
|
||||
|
||||
/* do optimistic spinning and steal lock if possible */
|
||||
if (rwsem_can_spin_on_owner(sem, RWSEM_WR_NONSPINNABLE) &&
|
||||
@@ -1169,7 +1178,11 @@ rwsem_down_write_slowpath(struct rw_semaphore *sem, int state)
|
||||
/* account for this before adding a new element to the list */
|
||||
wstate = list_empty(&sem->wait_list) ? WRITER_FIRST : WRITER_NOT_FIRST;
|
||||
|
||||
list_add_tail(&waiter.list, &sem->wait_list);
|
||||
trace_android_vh_alter_rwsem_list_add(
|
||||
&waiter,
|
||||
sem, &already_on_list);
|
||||
if (!already_on_list)
|
||||
list_add_tail(&waiter.list, &sem->wait_list);
|
||||
|
||||
/* we're now waiting on the lock */
|
||||
if (wstate == WRITER_NOT_FIRST) {
|
||||
@@ -1205,6 +1218,7 @@ rwsem_down_write_slowpath(struct rw_semaphore *sem, int state)
|
||||
}
|
||||
|
||||
wait:
|
||||
trace_android_vh_rwsem_wake(sem);
|
||||
/* wait until we successfully acquire the lock */
|
||||
set_current_state(state);
|
||||
for (;;) {
|
||||
@@ -1581,6 +1595,7 @@ EXPORT_SYMBOL(up_read);
|
||||
void up_write(struct rw_semaphore *sem)
|
||||
{
|
||||
rwsem_release(&sem->dep_map, _RET_IP_);
|
||||
trace_android_vh_rwsem_write_finished(sem);
|
||||
__up_write(sem);
|
||||
}
|
||||
EXPORT_SYMBOL(up_write);
|
||||
@@ -1591,6 +1606,7 @@ EXPORT_SYMBOL(up_write);
|
||||
void downgrade_write(struct rw_semaphore *sem)
|
||||
{
|
||||
lock_downgrade(&sem->dep_map, _RET_IP_);
|
||||
trace_android_vh_rwsem_write_finished(sem);
|
||||
__downgrade_write(sem);
|
||||
}
|
||||
EXPORT_SYMBOL(downgrade_write);
|
||||
|
Reference in New Issue
Block a user