DPDK 中斷機制 eal intr handle

2021-07-04 08:13:14 字數 2405 閱讀 4093

一、中斷初始化

在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

int2 rte_eal_intr_init(void)3

中斷執行緒執行主體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;

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),

2 eth_igb_interrupt_handler, (void *)eth_dev);

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

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

1

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中斷機制總結

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

Linux中斷機制

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