• dpdk中QSBR具体实现


    目录

    概述

    dpdk19.01提供了qsbr模式的rcu库,其具体实现在lib/librte_rcu目录中。
    librte_rcu是无锁线程安全的,这个库提供了读者报告静默状态的能力,让写者知道读者是否进入过静默状态。

    dpdk中QSBR具体实现是通过一个struct rte_rcu_qsbr_cnt变量qs,将多个线程共享的内存管理起来。总体思路是通过比较线程的静默期版本号与qs全局版本号的大小,判断是否所有线程进入过本次静默期。

    使用librte_rcu进行内存释放的线程的基本步骤如下:

    • 解除内存的引用
    • 调用rte_rcu_qsbr_start()函数将全局版本号加1,触发所有读线程报告静默状态
    • 调用rte_rcu_qsbr_check()遍历检查所有读者线程,确保都进入过本次静默期
    • 释放内存

    初始化

    初始化时,会用到一些通过的工具宏,定义在在dpdk-master/lib/librte_eal/common/include/rte_common.h中。如下:

    1. #define RTE_CACHE_LINE_SIZE 64
    2. #define RTE_ALIGN_MUL_CEIL(v, mul) \
    3. ((v + 64 - 1)/64) * 64 // (64地板除 + 1)*64
    4. #define RTE_ALIGN_FLOOR(val, 64) \
    5. val & (~(64 - 1)) // 64的地板除
    6. #define RTE_ALIGN_CEIL(val, 64) \
    7. RTE_ALIGN_FLOOR(val + 64 - 1, 64) // 64的地板除 + 1
    8. #define RTE_ALIGN(val, align) RTE_ALIGN_CEIL(val, align) // 64的地板除 + 1

    dpdk-master\lib\librte_rcu\rte_rcu_qsbr.h中,定义了初始化时用到的一些函数与宏。

    1. /* 工作线程计数器 */
    2. struct rte_rcu_qsbr_cnt {
    3. uint64_t cnt; // 静默态计数器,0表示下线。使用64bits,防止计数溢出
    4. uint32_t lock_cnt; // counter锁, 用于CONFIG_RTE_LIBRTE_RCU_DEBUG
    5. } __rte_cache_aligned;
    6. #define __RTE_QSBR_THRID_ARRAY_ELM_SIZE (sizeof(uint64_t) * 8) // 数组元素大小为64 B
    7. #define __RTE_QSBR_THRID_ARRAY_SIZE(max_threads)\
    8. RTE_ALIGN(RTE_ALIGN_MUL_CEIL(max_threads, 64) >> 3, RTE_CACHE_LINE_SIZE) // 计算得到线程数组的大小
    9. /*
    10. * (struct rte_rcu_qsbr_cnt *)(v + 1): 获得 v中 rte_rcu_qsbr_cnt 的地址偏移,此时指针p变为 struct rte_rcu_qsbr_cnt *类型
    11. * + v->max_threads: 得到 v中thread id_array的偏移,
    12. * + i
    13. */
    14. #define __RTE_QSBR_THRID_ARRAY_ELM(v, i) // 获得线程数组的第 i 个
    15. ((uint6
  • 相关阅读:
    实验(一):开发环境的安装及基本操作
    Maven系列:第1篇:什么是maven?为什么需要它?
    OpenGL ES学习(8)——剪裁测试认识
    python宿舍管理系統毕业设计源码231642
    Spring 5高级编程,投入Spring的怀抱
    写作技巧网站或工具
    Nginx学习(12)—— 配置指令整理
    Spring -IOC理念
    从 PyTorch DDP 到 Accelerate 到 Trainer,轻松掌握分布式训练
    epoll使用与原理
  • 原文地址:https://blog.csdn.net/lingshengxiyou/article/details/127869362