加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 交互 > 正文

深入理解RCU实现

发布时间:2016-10-29 16:06:37 所属栏目:交互 来源:站长网
导读:副标题#e# 深入理解RCU实现 ——基于 内核2.6.21 RCU实现(lvyilong316) RCU(Read-Copy Update),顾名思义就是读-拷贝修改,它是基于其原理命名的。对于被RCU保护的共享数据结构, 读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然

4)下次再进入rcu软中断__rcu_process_callbacks,发现rdp->batch已经比rcp->completed小了(因为上一步骤中,后者增大了),则将rdp->curlist上的回调移动到rdp->donelist里,接着还会再次进入rcu_check_quiescent_state,但是由于当前CPU的rdp->qs_pending已经为1了,所以不再往下清除cpu掩码。__rcu_process_callbacks

代码变成了:

void __rcu_process_callbacks(struct rcu_ctrlblk *rcp,  

                    struct rcu_data *rdp)  

{  

    if (rdp->curlist && !rcu_batch_before(rcp->completed, rdp->batch)) {  

        *rdp->donetail = rdp->curlist;  

        rdp->donetail = rdp->curtail;  

        rdp->curlist = NULL;  

        rdp->curtail = &rdp->curlist;  

    }  

  

    if (rdp->nxtlist && !rdp->curlist) {  

        move_local_cpu_nxtlist_to_curlist();  

  

        rdp->batch = rcp->cur + 1;  

  

        if (!rcp->next_pending) {  

            rcp->next_pending = 1;  

            rcp->cur++;  

            cpus_andnot(rcp->cpumask, cpu_online_map, nohz_cpu_mask);  

        }  

    }  

    if (rdp->donelist)  

        rcu_do_batch(rdp);  

}  

5) 经过千山万水终于来到rcu_do_batch(如果rdp->donelist有的话)在此函数里,执行RCU写者挂载的回调,即wakeme_after_rcu。

rcu_do_batch

static void rcu_do_batch(struct rcu_data *rdp) 

    struct rcu_head *next, *list; 
    int count = 0; 

    list = rdp->donelist; 
    while (list) { 
        next = list->next; 
        prefetch(next); 
        list->func(list); 
        list = next; 
        if (++count >= rdp->blimit) 
            break; 
    } 
    rdp->donelist = list; 

    local_irq_disable(); 
    rdp->qlen -= count; 
    local_irq_enable(); 
    if (rdp->blimit == INT_MAX && rdp->qlen)

        blimit = blimit; 
    if (!rdp->donelist) 
        rdp->donetail = &rdp->donelist; 
    else 
        raise_rcu_softirq(); 

    它遍历处理挂在链表上的回调函数.在这里,注意每次调用的回调函数有最大值限制.这样做主要是防止一次调用过多的回调函数而产生不必要系统负载.如果donelist中还有没处理完的数据,打开RCU软中断,在下次软中断到来的时候接着处理. 

注意:

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读