函数逻辑报告 |
Source Code:kernel\locking\qspinlock.c |
Create Date:2022-07-27 10:51:58 |
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
| 首页 | 函数Tree |
| 注解内核,赢得工具 | 下载SCCT | English |
函数名称:queued_spin_lock_slowpath - acquire the queued spinlock*@lock: Pointer to queued spinlock structure*@val: Current value of the queued spinlock 32-bit word* (queue tail, pending bit, lock value)* fast : slow : unlock* : :* uncontended (0,0,0) -:--> (0,0,1)
函数原型:void queued_spin_lock_slowpath(struct qspinlock *lock, unsigned int val)
返回类型:void
参数:
| 类型 | 参数 | 名称 |
|---|---|---|
| struct qspinlock * | lock | |
| unsigned int | val |
| 320 | BUILD_BUG_ON - break compile if a condition is true(FIXME: This should be fixed in the arch's Kconfig >= (1U << _Q_TAIL_CPU_BITS)) |
| 322 | 如果pv_enabled()则转到:pv_queue |
| 325 | 如果virt_spin_lock(lock)则返回 |
| 334 | 如果val恒等于_Q_PENDING_VAL则 |
| 335 | cnt等于_Q_PENDING_LOOPS |
| 336 | val等于atomic_cond_read_relaxed( & val, (VAL != _Q_PENDING_VAL) || !cnt--) |
| 343 | 如果val按位与_Q_LOCKED_MASK的反则转到:queue |
| 360 | 如果此条件成立可能性小(为编译器优化)(val & ~_Q_LOCKED_MASK)则 |
| 363 | 如果非val按位与_Q_PENDING_MASK的值则lear_pending - clear the pending bit.*@lock: Pointer to queued spinlock structure* *,1,* -> *,0,* |
| 366 | 转到:queue |
| 380 | 如果val按位与_Q_LOCKED_MASK则atomic_cond_read_acquire( & val, !(VAL & _Q_LOCKED_MASK)) |
| 390 | 返回 |
| 396 | queue : |
| 398 | pv_queue : |
| 399 | node等于this_cpu_ptr( & mcs) |
| 400 | idx等于 nesting count, see qspinlock.c 自加 |
| 401 | tail等于We must be able to distinguish between no-tail and the tail at 0:0,* therefore increment the cpu number by one. |
| 412 | 如果此条件成立可能性小(为编译器优化)(idx >= MAX_NODES)则 |
| 414 | 当非queued_spin_trylock - try to acquire the queued spinlock*@lock : Pointer to queued spinlock structure* Return: 1 if lock acquired, 0 if failed循环 |
| 415 | cpu_relax() |
| 416 | 转到:release |
| 419 | node等于grab_mcs_node(node, idx) |
| 433 | 1 if lock acquired 等于0 |
| 434 | next = NULL |
| 435 | pv_init_node(node) |
| 442 | 如果queued_spin_trylock - try to acquire the queued spinlock*@lock : Pointer to queued spinlock structure* Return: 1 if lock acquired, 0 if failed则转到:release |
| 450 | smp_wmb() |
| 460 | next = NULL |
| 466 | 如果old按位与_Q_TAIL_MASK则 |
| 467 | prev等于decode_tail(old) |
| 470 | WRITE_ONCE(next, node) |
| 472 | pv_wait_node(node, prev) |
| 507 | 如果val等于pv_wait_head_or_lock(lock, node)则转到:locked |
| 510 | val等于atomic_cond_read_acquire( & val, !(VAL & _Q_LOCKED_PENDING_MASK)) |
| 512 | locked : |
| 534 | 如果val按位与_Q_TAIL_MASK的值恒等于tail则 |
| 535 | 如果atomic_try_cmpxchg_relaxed( & val, & val, _Q_LOCKED_VAL)则转到:release |
| 552 | smp_store_release() provides a memory barrier to ensure all* operations in the critical section has been completed before* unlocking.( & 1 if lock acquired ) |
| 553 | pv_kick_node(lock, next) |
| 555 | release : |
| 559 | __this_cpu_dec(count) |
| 名称 | 描述 |
|---|---|
| queued_spin_lock | queued_spin_lock - acquire a queued spinlock*@lock: Pointer to queued spinlock structure |
| 源代码转换工具 开放的插件接口 | X |
|---|---|
| 支持:c/c++/esqlc/java Oracle/Informix/Mysql 插件可实现:逻辑报告 代码生成和批量转换代码 |