函数源码

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source File:include\linux\percpu-rwsem.h Create Date:2022-07-27 06:44:01
首页 Copyright©Brick

35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
static inline void percpu_down_read(struct percpu_rw_semaphore *sem)
{
    might_sleep();
 
    rwsem_acquire_read(&sem->rw_sem.dep_map, 0, 0, _RET_IP_);
 
    preempt_disable();
    /*
     * We are in an RCU-sched read-side critical section, so the writer
     * cannot both change sem->state from readers_fast and start checking
     * counters while we are here. So if we see !sem->state, we know that
     * the writer won't be checking until we're past the preempt_enable()
     * and that once the synchronize_rcu() is done, the writer will see
     * anything we did within this RCU-sched read-size critical section.
     */
    __this_cpu_inc(*sem->read_count);
    if (unlikely(!rcu_sync_is_idle(&sem->rss)))
        __percpu_down_read(sem, false); /* Unconditional memory barrier */
    /*
     * The preempt_enable() prevents the compiler from
     * bleeding the critical section out.
     */
    preempt_enable();
}