Function report |
Source Code:kernel\locking\rwsem.c |
Create Date:2022-07-28 09:48:15 |
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
| home page | Tree |
| Annotation kernel can get tool activity | Download SCCT | Chinese |
Name:Wait for the read lock to be granted
Proto:static struct rw_semaphore __sched *rwsem_down_read_slowpath(struct rw_semaphore *sem, int state)
Type:struct rw_semaphore
Parameter:
| Type | Parameter | Name |
|---|---|---|
| struct rw_semaphore * | sem | |
| int | state |
| 997 | adjustment = -RWSEM_READER_BIAS |
| 1000 | bool wake = false |
| 1010 | If Not rwsem_can_spin_on_owner(sem, RWSEM_RD_NONSPINNABLE) Then Go to queue |
| 1016 | atomic_long_add( - RWSEM_READER_BIAS, & count) |
| 1017 | adjustment = 0 |
| 1018 | If rwsem_optimistic_spin(sem, false) Then |
| 1024 | If atomic_long_read( & count) & RWSEM_FLAG_WAITERS Then |
| 1025 | raw_spin_lock_irq( & wait_lock) |
| 1029 | raw_spin_unlock_irq( & wait_lock) |
| 1032 | Return sem |
| 1033 | Else if rwsem_reader_phase_trylock(sem, last_rowner) Then |
| 1035 | Return sem |
| 1038 | queue : |
| 1039 | task = current process |
| 1040 | type = RWSEM_WAITING_FOR_READ |
| 1043 | raw_spin_lock_irq( & wait_lock) |
| 1051 | If adjustment && Not (atomic_long_read( & count) & (RWSEM_WRITER_MASK | RWSEM_FLAG_HANDOFF)) Then |
| 1060 | adjustment += RWSEM_FLAG_WAITERS |
| 1065 | If adjustment Then count = atomic_long_add_return(adjustment, & count) |
| 1067 | Else count = atomic_long_read( & count) |
| 1076 | If Not (count & RWSEM_LOCK_MASK) Then |
| 1077 | clear_wr_nonspinnable(sem) |
| 1078 | wake = true |
| 1084 | raw_spin_unlock_irq( & wait_lock) |
| 1088 | cycle |
| 1089 | set_current_state(state) |
| 1090 | If Not smp_load_acquire( & task) Then |
| 1092 | Break |
| 1094 | If signal_pending_state(state, current process) Then |
| 1095 | raw_spin_lock_irq( & wait_lock) |
| 1096 | If task Then Go to out_nolock |
| 1098 | raw_spin_unlock_irq( & wait_lock) |
| 1100 | Break |
| 1102 | schedule() |
| 1108 | Return sem |
| 1110 | out_nolock : |
| 1116 | raw_spin_unlock_irq( & wait_lock) |
| Name | Describe |
|---|---|
| __down_read | lock for reading |
| __down_read_killable |
| Source code conversion tool public plug-in interface | X |
|---|---|
| Support c/c++/esqlc/java Oracle/Informix/Mysql Plug-in can realize: logical Report Code generation and batch code conversion |