DPDK中斷機制總結

2021-10-22 04:03:32 字數 2136 閱讀 2121

一、中斷初始化

在rte_eal_intr_init()函式中初始化中斷。具體如下:

1、首先初始化intr_sources鍊錶。所有uio裝置的中斷都掛在這個鍊錶上,中斷處理執行緒通過遍歷這個鍊錶,來執行裝置的中斷。

2、建立intr_pipe管道,用於epoll模型的訊息通知。

3、建立執行緒intr_thread,執行緒的執行體是eal_intr_thread_main()函式,建立epoll模型,遍歷intr_sources鍊錶,監聽已註冊的所有uio裝置的中斷事件,並呼叫對應uio裝置的中斷處理函式。

int

rte_eal_intr_init(void)

中斷執行緒執行主體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裝置註冊的中斷處理函式。

static __attribute__((noreturn)) void *

eal_intr_thread_main(__rte_unused void *arg)

; struct rte_intr_source *src;

unsigned numfds = 0;

/* create epoll fd */

int pfd = epoll_create(1);

if (pfd < 0)

rte_panic("cannot create epoll instance\n");

pipe_event.data.fd = intr_pipe.readfd;

/*** add pipe fd into wait list, this pipe is used to

* rebuild the wait list.

*/if (epoll_ctl(pfd, epoll_ctl_add, intr_pipe.readfd,

&pipe_event) < 0)

numfds++;

rte_spinlock_lock(&intr_lock);

tailq_foreach(src, &intr_sources, next)

else

numfds++;

}rte_spinlock_unlock(&intr_lock);

/* serve the interrupt */

eal_intr_handle_interrupts(pfd, numfds);

/*** when we return, we need to rebuild the

* list of fds to monitor.

*/close(pfd);

}}

二、中斷註冊

以e1000網絡卡為例說明。在網絡卡初始化的時候,會呼叫rte_eth_dev_init()—>eth_igb_dev_init()—>rte_intr_callback_register()註冊中斷處理函式。

rte_intr_callback_register(&(pci_dev->intr_handle),

eth_igb_interrupt_handler, (void *)eth_dev);

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

1、首先申請乙個struct rte_intr_source變數。

struct rte_intr_source ;
2、將中斷處理函式eth_igb_interrupt_handler,新增到rte_intr_source->callbacks鍊錶中。

3、再將該rte_intr_source掛到全域性intr_sources鍊錶中,方便中斷處理執行緒遍歷呼叫。

DPDK 中斷機制 eal intr handle

一 中斷初始化 在rte eal intr init 函式中初始化中斷。具體如下 1 首先初始化intr sources鍊錶。所有uio裝置的中斷都掛在這個鍊錶上,中斷處理執行緒通過遍歷這個鍊錶,來執行裝置的中斷。2 建立intr pipe管道,用於epoll模型的訊息通知。3 建立執行緒intr ...

DPDK 中斷機制 eal intr handle

一 中斷初始化 在rte eal intr init 函式中初始化中斷。具體如下 1 首先初始化intr sources鍊錶。所有uio裝置的中斷都掛在這個鍊錶上,中斷處理執行緒通過遍歷這個鍊錶,來執行裝置的中斷。2 建立intr pipe管道,用於epoll模型的訊息通知。3 建立執行緒intr ...

Linux中斷機制

中斷 interrupt 被定義為乙個事件,該事件改變處理器執行的指令順序,這樣的事件與cpu晶元內外部硬體電路產生的電訊號相對應。中斷通常分為同步 synchronous 中斷和非同步 asynchronous 中斷。同步中斷指的是當指令執行時由cpu控制單元產生的,之所以稱為同步,是因為只有在一...