Function report |
Source Code:kernel\locking\osq_lock.c |
Create Date:2022-07-28 09:51:18 |
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
| home page | Tree |
| Annotation kernel can get tool activity | Download SCCT | Chinese |
Name:osq_lock
Proto:bool osq_lock(struct optimistic_spin_queue *lock)
Type:bool
Parameter:
| Type | Parameter | Name |
|---|---|---|
| struct optimistic_spin_queue * | lock |
| 92 | node = this_cpu_ptr( & An MCS like lock especially tailored for optimistic spinning for sleeping* lock implementations (mutex, rwsem, etc)) |
| 94 | curr = We use the value 0 to represent "no CPU", thus the encoded value* will be the CPU number incremented by 1. |
| 97 | 1 if lock acquired = 0 |
| 98 | next = NULL |
| 107 | old = atomic_xchg( & * Stores an encoded value of the CPU # of the tail node in the queue. * If the queue is empty, then it's set to OSQ_UNLOCKED_VAL., curr) |
| 108 | If old == OSQ_UNLOCKED_VAL Then Return true |
| 111 | prev = decode_cpu(old) |
| 124 | smp_wmb() |
| 126 | WRITE_ONCE(next, node) |
| 137 | When Not READ_ONCE(1 if lock acquired ) cycle |
| 143 | If need_resched() || In order to reduce various lock holder preemption latencies provide an* interface to see if a vCPU is currently running or not Then Go to unqueue |
| 146 | cpu_relax() |
| 148 | Return true |
| 150 | unqueue : |
| 159 | cycle |
| 169 | If smp_load_acquire( & 1 if lock acquired ) Then Return true |
| 172 | cpu_relax() |
| 188 | next = Get a stable @node->next pointer, either for unlock() or unqueue() purposes.* Can return NULL in case we were the last queued and we updated @lock instead. |
| 189 | If Not next Then Return false |
| 200 | WRITE_ONCE(prev, prev) |
| 201 | WRITE_ONCE(next, next) |
| 203 | Return false |
| 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 |