转自:http://blog.csdn.net/xy010902100449/article/details/47283147

DPDK通过在线程中使用epoll模型,监听UIO设备的事件,来模拟操作系统的中断处理。

一、中断初始化

在rte_eal_intr_init()函数中初始化中断。具体如下:

1、首先初始化intr_sources链表。所有UIO设备的中断都挂在这个链表上,中断处理线程通过遍历这个链表,来执行设备的中断。

2、创建intr_pipe管道,用于epoll模型的消息通知。

3、创建线程intr_thread,线程的执行体是eal_intr_thread_main()函数,创建epoll模型,遍历intr_sources链表,监听已注册的所有UIO设备的中断事件,并调用对应UIO设备的中断处理函数。

 1 int
 2 rte_eal_intr_init(void)
 3 {
 4     int ret = 0;
 5
 6     /* init the global interrupt source head */
 7     TAILQ_INIT(&intr_sources);
 8
 9     /**
10      * create a pipe which will be waited by epoll and notified to
11      * rebuild the wait list of epoll.
12      */
13     if (pipe(intr_pipe.pipefd) < 0)
14         return -1;
15
16     /* create the host thread to wait/handle the interrupt */
17     ret = pthread_create(&intr_thread, NULL,
18             eal_intr_thread_main, NULL);
19     if (ret != 0)
20         RTE_LOG(ERR, EAL,
21             "Failed to create thread for interrupt handling\n");
22
23     return -ret;
24 }

中断线程执行主体eal_intr_thread_main()函数具体如下:

1、epoll_create()创建epoll模型。

2、将intr_pipe管道加入到epoll中。

3、遍历intr_sources链表,将所有UIO设备加入到epoll中。

4、在eal_intr_handle_interrupts()函数中,在一个for(;;)死循环中,调用epoll_wait()阻塞模式监听事件。如果有事件发生,则调用eal_intr_process_interrupts()函数,最终会调用到相应UIO设备注册的中断处理函数。

 1 static __attribute__((noreturn)) void *
 2 eal_intr_thread_main(__rte_unused void *arg)
 3 {
 4     struct epoll_event ev;
 5
 6     /* host thread, never break out */
 7     for (;;) {
 8         /* build up the epoll fd with all descriptors we are to
 9          * wait on then pass it to the handle_interrupts function
10          */
11         static struct epoll_event pipe_event = {
12             .events = EPOLLIN | EPOLLPRI,
13         };
14         struct rte_intr_source *src;
15         unsigned numfds = 0;
16
17         /* create epoll fd */
18         int pfd = epoll_create(1);
19         if (pfd < 0)
20             rte_panic("Cannot create epoll instance\n");
21
22         pipe_event.data.fd = intr_pipe.readfd;
23         /**
24          * add pipe fd into wait list, this pipe is used to
25          * rebuild the wait list.
26          */
27         if (epoll_ctl(pfd, EPOLL_CTL_ADD, intr_pipe.readfd,
28                         &pipe_event) < 0) {
29             rte_panic("Error adding fd to %d epoll_ctl, %s\n",
30                     intr_pipe.readfd, strerror(errno));
31         }
32         numfds++;
33
34         rte_spinlock_lock(&intr_lock);
35
36         TAILQ_FOREACH(src, &intr_sources, next) {
37             if (src->callbacks.tqh_first == NULL)
38                 continue; /* skip those with no callbacks */
39             ev.events = EPOLLIN | EPOLLPRI;
40             ev.data.fd = src->intr_handle.fd;
41
42             /**
43              * add all the uio device file descriptor
44              * into wait list.
45              */
46             if (epoll_ctl(pfd, EPOLL_CTL_ADD,
47                     src->intr_handle.fd, &ev) < 0){
48                 rte_panic("Error adding fd %d epoll_ctl, %s\n",
49                     src->intr_handle.fd, strerror(errno));
50             }
51             else
52                 numfds++;
53         }
54         rte_spinlock_unlock(&intr_lock);
55         /* serve the interrupt */
56         eal_intr_handle_interrupts(pfd, numfds);
57
58         /**
59          * when we return, we need to rebuild the
60          * list of fds to monitor.
61          */
62         close(pfd);
63     }
64 }

 二、中断注册

以e1000网卡为例说明。在网卡初始化的时候,会调用rte_eth_dev_init()--->eth_igb_dev_init()--->rte_intr_callback_register()注册中断处理函数。

1 rte_intr_callback_register(&(pci_dev->intr_handle),
2     eth_igb_interrupt_handler, (void *)eth_dev);

rte_intr_callback_register()函数,主要工作如下:

1、首先申请一个struct rte_intr_source变量。

1 struct rte_intr_source {
2     TAILQ_ENTRY(rte_intr_source) next;
3     struct rte_intr_handle intr_handle; /**< interrupt handle */
4     struct rte_intr_cb_list callbacks;  /**< user callbacks */
5     uint32_t active;
6 };

2、将中断处理函数eth_igb_interrupt_handler,添加到rte_intr_source->callbacks链表中。

3、再将该rte_intr_source挂到全局intr_sources链表中,方便中断处理线程遍历调用。

DPDK 中断机制 eal_intr_handle_interrupts相关推荐

  1. DPDK 中断机制(二十六)

    dpdk自己实现了一个中断机制,例如定时器中断,uio中断.这个中断是应用层中断, 而不是像linux内核实现的硬件中断: 且dpdk实现的中断机制属于控制中断,用来实现一些控制操作,例如uio中断用 ...

  2. DPDK中断机制简析

    DPDK通过在线程中使用epoll模型,监听UIO设备的事件,来模拟操作系统的中断处理. 一.中断初始化 在rte_eal_intr_init()函数中初始化中断.具体如下: 1.首先初始化intr_ ...

  3. java文本域不可编辑_javascript:让表单 文本框 只读,不可编辑的方法

    有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使 的内容,"中国"两个字不可以修改.实现的方式归纳一下,有如下几种. 方法1: οnfοcus=this.bl ...

  4. DPDK — 安装部署(CentOS 7)

    目录 文章目录 目录 官方手册 环境参数 环境准备 RT Kernel 基础软件依赖 设置大页内存 安装 DPDK 获取 DPDK 代码 设置环境变量 编译安装 目标环境目录 加载内核模块 绑定网卡到 ...

  5. DPDK — 架构解析

    目录 文章目录 目录 前文列表 DPDK 架构 内核态模块 IGB_UIO KNI PMD DPDK Lib(核心部件库) 组件代码 平台相关模块 Classify 库 QoS 库 前文列表 < ...

  6. 《深入浅出DPDK》读书笔记(十三):DPDK虚拟化技术篇(加速包处理的vhost优化方案)

    Table of Contents 加速包处理的vhost优化方案 142.vhost的演进和原理 143.Qemu与virtio-net 144.Linux内核态vhost-net 145.用户态v ...

  7. 《深入浅出DPDK》读书笔记(十二):DPDK虚拟化技术篇(半虚拟化Virtio)

    Table of Contents 半虚拟化Virtio 132.Virtio使用场景 133.Virtio规范和原理 11.2.1 设备的配置 1. 设备的初始化 2. 设备的发现 3. 传统模式v ...

  8. Linux网络报文捕获/抓包技术对比:napi、libpcap、afpacket、PF_RING、PACKET_MMAP、DPDK、XDP(eXpress Data Path)

    Table of Contents 1.传统linux网络协议栈流程和性能分析 协议栈的主要问题 针对单个数据包级别的资源分配和释放 流量的串行访问 从驱动到用户态的数据拷贝 内核到用户空间的上下文切 ...

  9. 《深入浅出DPDK》读书笔记(八):网卡性能优化(异步中断模式、轮询模式、混和中断轮询模式)

    本文内容为读书笔记,摘自<深入浅出DPDK> 82.DPDK的轮询模式 <DPDK PMD( Poll Mode Driver)轮询模式驱动程序> DPDK采用了轮询或者轮询混 ...

最新文章

  1. 计算机电缆djyvp工艺,计算机电缆dJyvP相关办法.pdf
  2. oracle dg备份恢复,DG丢失归档,使用增量备份恢复一例
  3. [转]thinkphp 模板显示display和assign的用法
  4. Dynamips和Vmware完成CCVP试验(8)
  5. python自带的Mock模块使用
  6. 原神:创新和成功有目共睹,游戏可玩性历久弥新,戒骄戒躁保初心
  7. C++11 学习笔记 lambda表达式
  8. 专题导读:大数据创新实践
  9. java去哪导包_在Java语言中,哪一个包中的类是自动导入的?( )java.applet
  10. 筛选索引--filter indexs
  11. 已知相关系数求解联合分布律
  12. OpenGrok简单使用
  13. CurrentThread
  14. java jisuan da xie zi mu ge shu_java获取中文拼音
  15. 笔记本/台式机作为扩展屏
  16. Android使用VideoView播放网络视频
  17. python兔子生兔子_Python兔子生兔子算法,编程练习题实例十一
  18. Cascader 级联选择器如何根据给定的叶节点值设置默认值(数据回显)
  19. hmc830相位噪声_低相位噪声电压控制振荡器(VCO)和稳定基准电压构成的频率合成器...
  20. 边缘计算2.0时代,“云边缘”与“边缘云”你分清了吗?

热门文章

  1. 华为畅玩5 (CUN-AL00) 刷入第三方twrp Recovery 及 root
  2. 基于Redis实现延时队列的优化方案
  3. 信息安全工程师----五天修炼(第五章 5.2恶意代码)
  4. 艾宾浩斯记忆曲线背单词(转)
  5. [nltk_data] Error loading omw: <urlopen error [Errno 11004]
  6. string 中的maketrans和translate
  7. 腾讯CSIG暑期后端实习面经(已offer)
  8. 美国光伏市场或将关闭 “201”保护有何玄机?
  9. linux命令(3):pwd命令
  10. R数据分析:PLS结构方程模型介绍,论文报告方法和实际操作