备案 控制台
学习
实践
活动
专区
工具
TVP
写文章
专栏首页 DPDK VPP源码分析 创建自己的核绑定线程
2 0

海报分享

创建自己的核绑定线程

  • 线程启动流程 以worker线程为例,介绍线程启动流程:
  • 线程注册: VLIB_REGISTER_THREAD线程注册宏注册到全局 vlib_thread_main->next链表上。
typedef struct vlib_thread_registration_ {
  /* constructor generated list of thread registrations */
  struct vlib_thread_registration_ * next;
  /* config parameters */
  char * name;/*启动文件中启动几个"workers"线程  corelist-workers  3-11*/
  char * short_name; /*线程重命名使用*/
  vlib_thread_function_t * function;
  uword mheap_size;
  int fixed_count;
  u32 count;
  /*这个参数比较重要,如果线程不需要转发报文,可以置位1*/
  int no_data_structure_clone;
  u32 frame_queue_nelts;
  /* All threads of this type run on pthreads */
  int use_pthreads;/*设置变量标识绑定在父线程,就是可以理解为不绑核,共用父线程的资源*/
  u32 first_index;
  uword * coremask;
} vlib_thread_registration_t;

workers 线程注册

  • 线程启动接口: VLIB_MAIN_LOOP_ENTER_FUNCTION函数注册到vlib_main_t的main_loop_enter_function_registrations链表,在VPP启动时调用vlib_main->vlib_call_all_main_loop_enter_functions进行加载。 所有的线程都在这里启动。 1、线程启动过程 是vlib_main函数中下面代码启动的。

    /* Call all main loop enter functions. */
        clib_error_t *sub_error;
        sub_error = vlib_call_all_main_loop_enter_functions (vm);
        if (sub_error)
          clib_error_report (sub_error);
      }
    • 疑惑解读 1. works线程的数量是哪里决定的? 由配置文件中corelist-workers 2-3 决定worker线程的创建数量,下图中vlib_unix_mian函数第三步调用early配置函数中调用cpu-config进行赋值的。

    2.works线程私有的vlib_main_t结构是哪里创建的? src/vlib/threads.c文件中函数start_workers,根据workers线程和其他线程数量复制vlib_global_main到vlib_mains中,包括创建私有的线程栈。具体可以看代码。

    • 创建自己的shaping work线程: 1.注册自己的work线程 Shaping 线程需要绑核和转发报文,所以就workers线程设置一样就OK、 书写自己的函数只需要参照workers线程的就OK,vlib_worker_thread_fn 有一点比较重要就是在while循环中必须有main线程同步操作。

      2.启动文件配置自己线程绑核 只需要在配置文件中增加corelist就OK。

文章分享自微信公众号:
DPDK VPP源码分析

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者: dpdk vpp
原始发表时间: 2020-10-25
如有侵权,请联系 cloudcommunity@tencent.com 删除。