diff options
| -rw-r--r-- | service/src/phydev.c | 79 | ||||
| -rw-r--r-- | service/src/vdev.c | 13 |
2 files changed, 62 insertions, 30 deletions
diff --git a/service/src/phydev.c b/service/src/phydev.c index fb8e27e..8c83082 100644 --- a/service/src/phydev.c +++ b/service/src/phydev.c @@ -145,32 +145,43 @@ static int gen_phydev_qconf(struct phydev * dev, struct rte_eth_rxconf * rxconf, } /* 用户参数解析:网卡参数设置 */ -static int gen_phydev_ethconf(struct phydev * dev, struct rte_eth_conf * out_eth_conf) +static int gen_phydev_ethconf(struct phydev *dev, struct rte_eth_conf *out_eth_conf) { struct rte_eth_conf eth_conf = eth_conf_default; - // 配置RSS模式 - if (dev->info.rssmode == MR_DEV_RSSMODE_2TUPLE_SYM) + if (dev->info.type == __PHYDEV_INFO_TYPE_PCI) { - eth_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_IP; - eth_conf.rx_adv_conf.rss_conf.rss_key = default_sym_rss_key; - eth_conf.rx_adv_conf.rss_conf.rss_key_len = sizeof(default_sym_rss_key); - } - else if (dev->info.rssmode == MR_DEV_RSSMODE_4TUPLE_SYM) - { - eth_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV6_TCP - | ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP; - eth_conf.rx_adv_conf.rss_conf.rss_key = default_sym_rss_key; - eth_conf.rx_adv_conf.rss_conf.rss_key_len = sizeof(default_sym_rss_key); + /* only PCI devices can run at RSS mode. */ + eth_conf.rxmode.mq_mode = ETH_MQ_RX_RSS; + + /* setup how nics distributes packets */ + if (dev->info.rssmode == MR_DEV_RSSMODE_2TUPLE_SYM) + { + eth_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_IP; + eth_conf.rx_adv_conf.rss_conf.rss_key = default_sym_rss_key; + eth_conf.rx_adv_conf.rss_conf.rss_key_len = sizeof(default_sym_rss_key); + } + else if (dev->info.rssmode == MR_DEV_RSSMODE_4TUPLE_SYM) + { + eth_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV6_TCP | + ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP; + eth_conf.rx_adv_conf.rss_conf.rss_key = default_sym_rss_key; + eth_conf.rx_adv_conf.rss_conf.rss_key_len = sizeof(default_sym_rss_key); + } + else if (dev->info.rssmode == MR_DEV_RSSMODE_4TUPLE_ASYM) + { + eth_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV6_TCP | + ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP; + eth_conf.rx_adv_conf.rss_conf.rss_key = NULL; + } } - else if (dev->info.rssmode == MR_DEV_RSSMODE_4TUPLE_ASYM) + else if (dev->info.type == __PHYDEV_INFO_TYPE_VDEV) { - eth_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV6_TCP - | ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP; - eth_conf.rx_adv_conf.rss_conf.rss_key = NULL; + /* the vdevs is not support multi-queues loadbalance by hardware */ + eth_conf.rxmode.mq_mode = ETH_MQ_RX_NONE; } - if(dev->info.en_vlan_strip) + if (dev->info.en_vlan_strip) { eth_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT; } @@ -671,43 +682,53 @@ static int phydev_scan_raw_socket(struct sc_main * sc, struct phydev_main * phyd } #endif -#if 0 /* VIRTIO Devices */ -static int phydev_scan_virtio_user(struct sc_main * sc, struct phydev_main * phydev_main) +static int phydev_scan_virtio_user(struct sc_main *sc, struct phydev_main *phydev_main) { char virtio_syms[MR_SYMBOL_MAX][MR_PHYDEV_MAX] = {{0}}; unsigned int nr_virtio_syms = 0; phydev_query_device_list(sc, "virtio_user", virtio_syms, &nr_virtio_syms); - if(nr_virtio_syms < 0) + if (nr_virtio_syms < 0) { return RT_SUCCESS; } - for(int i = 0; i < nr_virtio_syms; i++) + for (int i = 0; i < nr_virtio_syms; i++) { uint16_t port_id; - char str_attach_args[MR_STRING_MAX]; - snprintf(str_attach_args, sizeof(str_attach_args), - "virtio_user%d,queues=%d,path=/run/usvhost/usvhost%d", i, sc->nr_serv_thread, i); + char vdev_name[MR_STRING_MAX]; + snprintf(vdev_name, sizeof(vdev_name) - 1, "virtio_user%d", i); - int ret = rte_eth_dev_attach(str_attach_args, &port_id); + char vdev_args[MR_STRING_MAX]; + snprintf(vdev_args, sizeof(vdev_args) - 1, "queues=%d,queue_size=1024,path=/dev/vhost-net", sc->nr_serv_thread); + + int ret = rte_eal_hotplug_add("vdev", vdev_name, vdev_args); if (ret < 0) { MR_ERROR("Attaching virtio-user device %s failed, Errno = %d", virtio_syms[i], ret); return RT_ERR; } - struct phydev * phydev = phydev_alloc(phydev_main, port_id); + ret = rte_eth_dev_get_port_by_name(vdev_name, &port_id); + if (ret < 0) + { + rte_eal_hotplug_remove("vdev", vdev_name); + MR_ERROR("Cannot find added vdev %s failed, Errno = %d", virtio_syms[i], ret); + return RT_ERR; + } + + struct phydev *phydev = phydev_alloc(phydev_main, port_id); snprintf(phydev->symbol, sizeof(phydev->symbol), "%s", virtio_syms[i]); snprintf(phydev->info.symbol, sizeof(phydev->info.symbol), "%s", virtio_syms[i]); + + phydev->info.type= __PHYDEV_INFO_TYPE_VDEV; phydev->port_id = port_id; } return RT_SUCCESS; } -#endif static struct rte_pci_device * __dev_info_to_pci_dev(struct rte_eth_dev_info * dev_info) { @@ -854,13 +875,13 @@ int phydev_init(struct sc_main * sc) MR_ERROR("Physical device in raw socket scan failed."); return RT_ERR; } +#endif if (phydev_scan_virtio_user(sc, sc->phydev_main) < 0) { MR_ERROR("Physical device in virtio-user scan failed."); return RT_ERR; } -#endif struct phydev * phydev_iter; TAILQ_FOREACH(phydev_iter, &sc->phydev_main->device_list, next) diff --git a/service/src/vdev.c b/service/src/vdev.c index 9030373..a838907 100644 --- a/service/src/vdev.c +++ b/service/src/vdev.c @@ -490,6 +490,17 @@ static int vdev_data_usercfg_setup(struct sc_main * sc) if (ret < 0) goto err; } + /* Virtio */ + memset(vdevsyms, 0, sizeof(vdevsyms)); + vdev_usercfg_query_vdev_list(sc, "virtio_user", vdevsyms, &nr_vdevsyms); + + for (int i = 0; i < nr_vdevsyms; i++) + { + const char * vdevsym = vdevsyms[i]; + int ret = __vdev_data_setup_one_device(sc, vdevsym, nr_rxstream, nr_txstream); + if (ret < 0) goto err; + } + return RT_SUCCESS; err: @@ -553,4 +564,4 @@ int vdev_dump(struct sc_main * sc) } return 0; -}
\ No newline at end of file +} |
