DPDK : eal thread和lcore的解析

      在DPDK中,一个EAL process包含有若干个lcore,其中包含有一个master lcore以及若干slave lcore。

      在Linux系统下,EAL层初始化时,主线程会读取系统目录/sys/devices/system/cpu下里面每一个cpuX目录,若能够检测到/sys/devices/system/cpu/cpuX/topology/core_id这一个文件,则表示允许此lcore运行。并且对于每一个lcore,分配一个lcore_config。

      lcore_config的结构体如下 :

struct lcore_config {
	unsigned detected;         /**< true if lcore was detected */
	
	//此lcore对应的pthread
	pthread_t thread_id;       /**< pthread identifier */
	
	//pipe用于master lcore通知slave lcore执行函数f
	int pipe_master2slave[2];  /**< communication pipe with master */
	int pipe_slave2master[2];  /**< communication pipe with master */
	
	//f, arg, ret表示slave lcore要执行的函数, 对应的参数,以及返回值
	lcore_function_t * volatile f;         /**< function to call */
	void * volatile arg;       /**< argument of function */
	volatile int ret;          /**< return value of function */
	
	//state表明当前slave lcore是处于WAIT, RUNNING还是FINISHED
	volatile enum rte_lcore_state_t state; /**< lcore state */
	unsigned socket_id;        /**< physical socket id for this lcore */
	unsigned core_id;          /**< core number on socket for this lcore */
	int core_index;            /**< relative index, starting from 0 */

	//表示此lcore的亲和cpu集合,在初始化时,对应于检测此lcore的cpuX
	rte_cpuset_t cpuset;       /**< cpu set which the lcore affinity to */
	
	//role表示lcore是作为service lcore, non-service lcore还是off
	uint8_t core_role;         /**< role of core eg: OFF, RTE, SERVICE */
};

      对于每一个Lcore, 都会创建一个pthread, 并且运行的例程为eal_thread_loop().

      eal_thread_loop有两个作用 :

            第一, 初始化lcore的相关信息, 包括per_lcore__lcore_id, per_lcore__socket_id, 设置亲和的cpu。per_lcore__lcore_id唯一标识了lcore, 以及对应的lcore config, lcore state等. per_lcore__socket_id标识了lcore所属的socket(见NUMA概念).

            第二, 初始化完成后, slave lcore会通过pipe接收来自master lcore的命令(master lcore通过rte_eal_mp_remote_launch发出命令),然后回复一个ACK后,开始执行lcore config中指定的f, arg(f, arg在master lcore发送命令之前,由master lcore设置), 并将结果存放在ret,然后继续进入阻塞状态,等待来自master lcore的下一个命令.(master lcore可以通过检查slave lcore的state来判断f是否执行完毕, 例如调用rte_eal_wait_lcore() 等待某一个slave lcore完成, 或者 rte_eal_mp_wait_lcore等待所有slave lcore完成)。DPDK : eal thread和lcore的解析_第1张图片
      总结 :
            如上图所示:一个process中包含若干个lcore, 每一个lcore对应一个pthread。其中master lcore负责控制slave lcore的运行。其中一些lcore可作为service lcore, 循环运行某些service例程(这一块内容将在后面的博客上解析).
            由于个人水平所限,若所写的博文中存在错误,希望大家能帮忙指出。

      函数调用图(帮助大家了解函数的功能,函数之间的调用,所阅读的代码是来自DPDK官方最新的代码https://github.com/DPDK/dpdk, 如果官方代码更新,文章也会尽快地更新):
            http://naotu.baidu.com/file/daa84459cd41d7530c574f2dab434558?token=9852861c0df2f52d

      参考资料 :
            https://github.com/DPDK/dpdk
            http://doc.dpdk.org/guides/prog_guide/

你可能感兴趣的:(DPDK源代码的解析)