该函数通过加载队列和端口来初始化一个DPDK网络设备线程。下面是代码的逐步解释:
定义函数
pmd_load_queues_and_ports
,参数为指向dp_netdev_pmd_thread
类型的指针pmd
和指向polled_queue
类型指针的指针ppoll_list
。定义结构体指针
poll_list
并将其初始化为*ppoll_list
(即该函数的输入参数)。定义结构体指针
poll
和整型变量i
。上锁
pmd->port_mutex
,以确保在操作端口时不会发生冲突。调用
xrealloc
函数对poll_list
进行重新分配内存的操作,使其大小等于pmd->poll_list
中元素数量的大小乘以sizeof *poll_list
。返回值为重新分配后的poll_list
。初始化变量
i
为0。使用宏
HMAP_FOR_EACH
遍历pmd->poll_list
中的每个元素(poll
),使用node
作为迭代器。对于每个
poll
,将其相关信息赋值给poll_list
数组的第i
个元素:poll_list[i].rxq
为poll->rxq
,poll_list[i].port_no
为poll->rxq->port->port_no
,poll_list[i].emc_enabled
为poll->rxq->port->emc_enabled
,poll_list[i].rxq_enabled
为netdev_rxq_enabled(poll->rxq->rx)
,poll_list[i].change_seq
为netdev_get_change_seq(poll->rxq->port->netdev)
。调用函数
pmd_load_cached_ports(pmd)
,该函数将缓存的端口添加到pmd->port_list
中。解锁
pmd->port_mutex
。将
poll_list
赋值给*ppoll_list
,即将更新后的队列列表返回给调用者。返回队列数目
i
。