一、中斷初始化
在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中斷執行緒執行主體eal_intr_thread_main()函式具體如下:int2 rte_eal_intr_init(void)3
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;
14struct 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");
2122 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*/
27if
(epoll_ctl(pfd, epoll_ctl_add, intr_pipe.readfd,
28 &pipe_event) < 0
) 32 numfds++;
3334 rte_spinlock_lock(&intr_lock);
3536 tailq_foreach(src, &intr_sources, next)
51else
52 numfds++;53}
54 rte_spinlock_unlock(&intr_lock);
55/*
serve the interrupt
*/56
eal_intr_handle_interrupts(pfd, numfds);
5758/**
59* when we return, we need to rebuild the
60* list of fds to monitor.
61*/
62close(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),rte_intr_callback_register()函式,主要工作如下:2 eth_igb_interrupt_handler, (void *)eth_dev);
1、首先申請乙個struct rte_intr_source變數。
12、將中斷處理函式eth_igb_interrupt_handler,新增到rte_intr_source->callbacks鍊錶中。struct
rte_intr_source ;
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中斷機制總結
一 中斷初始化 在rte eal intr init 函式中初始化中斷。具體如下 1 首先初始化intr sources鍊錶。所有uio裝置的中斷都掛在這個鍊錶上,中斷處理執行緒通過遍歷這個鍊錶,來執行裝置的中斷。2 建立intr pipe管道,用於epoll模型的訊息通知。3 建立執行緒intr ...
Linux中斷機制
中斷 interrupt 被定義為乙個事件,該事件改變處理器執行的指令順序,這樣的事件與cpu晶元內外部硬體電路產生的電訊號相對應。中斷通常分為同步 synchronous 中斷和非同步 asynchronous 中斷。同步中斷指的是當指令執行時由cpu控制單元產生的,之所以稱為同步,是因為只有在一...