日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VPP接口队列设置

發(fā)布時間:2023/12/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VPP接口队列设置 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

可通過VPP啟動配置文件/etc/vpp/startup.conf的dpdk段來配置接口的隊列參數(shù)。

dpdk {dev default {num-rx-desc 512num-tx-desc 512num-tx-queues 2}dev 0000:02:00.1 {num-rx-queues 2name eth0} }

dpdk段配置的解析函數(shù)dpdk_device_config如下,將設(shè)備的隊列配置讀進devconf結(jié)構(gòu)的相應(yīng)成員變量中。

static clib_error_t * dpdk_device_config (dpdk_config_main_t *conf, void *addr,dpdk_device_addr_type_t addr_type, unformat_input_t *input, u8 is_default) {unformat_skip_white_space (input);while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT){if (unformat (input, "num-rx-queues %u", &devconf->num_rx_queues));else if (unformat (input, "num-tx-queues %u", &devconf->num_tx_queues));else if (unformat (input, "num-rx-desc %u", &devconf->num_rx_desc));else if (unformat (input, "num-tx-desc %u", &devconf->num_tx_desc));else if (unformat (input, "name %s", &devconf->name));else if (unformat (input, "workers %U", unformat_bitmap_list,&devconf->workers));else if (unformat (input, "rss-queues %U",unformat_bitmap_list, &devconf->rss_queues));

通過workers可以指定對接口進行處理的線程,在指定workers的情況下,如果接收隊列的數(shù)量為零,那么將接收隊列的數(shù)量設(shè)置為workers的數(shù)量。反之,如果workers的數(shù)量和配置的接收隊列的數(shù)量不相等,返回錯誤,需要保障每個workers有一個接收隊列。

if (devconf->workers && devconf->num_rx_queues == 0)devconf->num_rx_queues = clib_bitmap_count_set_bits (devconf->workers);else if (devconf->workers &&clib_bitmap_count_set_bits (devconf->workers) !=devconf->num_rx_queues)error = clib_error_return (0,"%U: number of worker threads must be ""equal to number of rx queues",format_vlib_pci_addr, addr); int rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info) {int diag;diag = (*dev->dev_ops->dev_infos_get)(dev, dev_info);if (diag != 0) {/* Cleanup already filled in device information */memset(dev_info, 0, sizeof(struct rte_eth_dev_info));return eth_err(port_id, diag);}/* Maximum number of queues should be <= RTE_MAX_QUEUES_PER_PORT */dev_info->max_rx_queues = RTE_MIN(dev_info->max_rx_queues,RTE_MAX_QUEUES_PER_PORT);dev_info->max_tx_queues = RTE_MIN(dev_info->max_tx_queues,RTE_MAX_QUEUES_PER_PORT);dev_info->driver_name = dev->device->driver->name;dev_info->nb_rx_queues = dev->data->nb_rx_queues;dev_info->nb_tx_queues = dev->data->nb_tx_queues;

在DPDK的設(shè)備初始化過程中,設(shè)備的發(fā)送隊列在支持的最大隊列和運行的線程數(shù)量之間取較小的值。另外,如果配置的發(fā)送隊列數(shù)量小于以上計算的值,使用配置的發(fā)送隊列數(shù)量,但是此數(shù)量需要大于零。

static clib_error_t * dpdk_lib_init (dpdk_main_t * dm) {dpdk_device_t *xd;/* *INDENT-OFF* */RTE_ETH_FOREACH_DEV(i){xd->tx_q_used = clib_min (dev_info.max_tx_queues, tm->n_vlib_mains);if (devconf->num_tx_queues > 0&& devconf->num_tx_queues < xd->tx_q_used)xd->tx_q_used = clib_min (xd->tx_q_used, devconf->num_tx_queues);

接收隊列的最小值為1。如果配置的接收隊列數(shù)量小于接口的最大接收隊列長度,表明可使用配置值,接收隊列大于1,開啟RSS,如果沒有指定RSS哈希算法,默認使用IP頭部的源/目的地址,和UDP/TCP頭部的源/目的端口計算哈希。

否則,使用指定的RSS算法,如果其中指定的某些字段不支持,進行警告。

if (devconf->num_rx_queues > 1&& dev_info.max_rx_queues >= devconf->num_rx_queues){xd->rx_q_used = devconf->num_rx_queues;xd->port_conf.rxmode.mq_mode = ETH_MQ_RX_RSS;if (devconf->rss_fn == 0)xd->port_conf.rx_adv_conf.rss_conf.rss_hf =ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP;else{u64 unsupported_bits;xd->port_conf.rx_adv_conf.rss_conf.rss_hf = devconf->rss_fn;unsupported_bits = xd->port_conf.rx_adv_conf.rss_conf.rss_hf;unsupported_bits &= ~dev_info.flow_type_rss_offloads;if (unsupported_bits)dpdk_log_warn ("Unsupported RSS hash functions: %U",format_dpdk_rss_hf_name, unsupported_bits);}xd->port_conf.rx_adv_conf.rss_conf.rss_hf &=dev_info.flow_type_rss_offloads;}elsexd->rx_q_used = 1;

如果設(shè)備的pmd驅(qū)動名稱沒有進行設(shè)置,例如,對于i40e驅(qū)動,VNET_DPDK_PMD_I40E。初始化好PMD相關(guān)參數(shù),發(fā)送和接收的描述符默認都是1024。

if (!xd->pmd){#define _(s,f) else if (dev_info.driver_name && \!strcmp(dev_info.driver_name, s)) \xd->pmd = VNET_DPDK_PMD_##f;if (0);foreach_dpdk_pmd #undef _elsexd->pmd = VNET_DPDK_PMD_UNKNOWN;xd->port_type = VNET_DPDK_PORT_TYPE_UNKNOWN;xd->nb_rx_desc = DPDK_NB_RX_DESC_DEFAULT;xd->nb_tx_desc = DPDK_NB_TX_DESC_DEFAULT;

如果配置了接收描述符的數(shù)量,使用配置值。否則,對于2M大小的巨頁,如果處理器沒有L3級緩存cache,接收描述符設(shè)置為512。

if (devconf->num_rx_desc)xd->nb_rx_desc = devconf->num_rx_desc;else {/* If num_rx_desc is not specified by VPP user, the current CPU is workingwith 2M page and has no L3 cache, default num_rx_desc is changed to 512from original 1024 to help reduce TLB misses.*/if ((clib_mem_get_default_hugepage_size () == 2 << 20)&& check_l3cache() == 0)xd->nb_rx_desc = 512;}

如果配置了發(fā)送描述符的數(shù)量,使用配置值。否則,對于2M大小的巨頁,如果處理器沒有L3級緩存cache,發(fā)送描述符設(shè)置為512,以降低TLB缺失。

if (devconf->num_tx_desc)xd->nb_tx_desc = devconf->num_tx_desc;else {/* If num_tx_desc is not specified by VPP user, the current CPU is workingwith 2M page and has no L3 cache, default num_tx_desc is changed to 512from original 1024 to help reduce TLB misses.*/if ((clib_mem_get_default_hugepage_size () == 2 << 20)&& check_l3cache() == 0)xd->nb_tx_desc = 512;}}

如果配置了處理接口的workers集合,將接收隊列注冊給相應(yīng)的worker。否則,所有接收隊列依次注冊給系統(tǒng)中的worker線程。

if (devconf->workers){int i;q = 0;clib_bitmap_foreach (i, devconf->workers) {dpdk_rx_queue_t *rxq = vec_elt_at_index (xd->rx_queues, q);rxq->queue_index = vnet_hw_if_register_rx_queue (dm->vnet_main, xd->hw_if_index, q++,vdm->first_worker_thread_index + i);}}elsefor (q = 0; q < xd->rx_q_used; q++){dpdk_rx_queue_t *rxq = vec_elt_at_index (xd->rx_queues, q);rxq->queue_index = vnet_hw_if_register_rx_queue (dm->vnet_main, xd->hw_if_index, q, VNET_HW_IF_RXQ_THREAD_ANY);}

總結(jié)

以上是生活随笔為你收集整理的VPP接口队列设置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。