DPDK中的中断机制

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

1、中断处理函数初始化

rte_eal_init() –> rte_eal_intr_init()

在rte_eal_intr_init()函数中对中断进行初始化:
(1)初始化全局中断源链表intr_sources

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

(3)创建中断处理线程intr_thread

中断处理函数为eal_intr_thread_main(),该函数的主体是一个for(;;)无限循环,在每一次循环内会创建epoll模型,遍历intr_sources链表,监听已注册的所有UIO设备的中断事件,如果监听到中断,则调用eal_intr_handle_interrupts((pfd, numfds)函数,调用对应UIO设备的中断处理函数。

2、注册中断函数

函数定义:

在网卡初始化的时候,会调用
rte_eth_dev_init() —> eth_igb_dev_init() —> rte_intr_callback_register()
注册中断处理函数:

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

(1)为回调函数分配内存并初始化

(2)将回调函数添加到对应的中断项中

先判断是否已经注册了该中断,如果已经注册了,则直接将回调函数插入到该中断的回调函数列表中。

如果还没有注册该中断,则分配一个struct rte_intr_source *src = calloc(1, sizeof(*src)),
并将其插入到intr_sources中。

(3)更新重建中断列表

如果是中断中插入的第一个回调函数,或者是第一次注册该中断,
则将wake_thread置为1,表示通知epoll_wait()重建等待列表

参考

www.cnblogs.com/MerlinJ/p/4104039.html

————————————————————

原创文章,转载请注明: 转载自孙希栋的博客

本文链接地址: 《DPDK中的中断机制》

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll Up