From: Cheng Jiang <Cheng1.jiang@intel.com> To: maxime.coquelin@redhat.com, chenbo.xia@intel.com, zhihong.wang@intel.com Cc: dev@dpdk.org, patrick.fu@intel.com, Cheng Jiang <Cheng1.jiang@intel.com> Subject: [dpdk-dev] [PATCH v4 1/4] example/vhost: add async vhost args parsing function Date: Mon, 12 Oct 2020 04:54:53 +0000 Message-ID: <20201012045456.5196-2-Cheng1.jiang@intel.com> (raw) In-Reply-To: <20201012045456.5196-1-Cheng1.jiang@intel.com> This patch is to add async vhost driver arguments parsing function for CBDMA channel, DMA initiation function and args description. The meson build file is changed to fix dependency problem. With these arguments vhost device can be set to use CBDMA or CPU for enqueue operation and bind vhost device with specific CBDMA channel to accelerate data copy. Signed-off-by: Cheng Jiang <Cheng1.jiang@intel.com> --- examples/vhost/ioat.c | 117 +++++++++++++++++++++++++++++++++++++ examples/vhost/main.c | 37 +++++++++++- examples/vhost/main.h | 2 + examples/vhost/meson.build | 4 +- 4 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 examples/vhost/ioat.c diff --git a/examples/vhost/ioat.c b/examples/vhost/ioat.c new file mode 100644 index 000000000..c3158d3c3 --- /dev/null +++ b/examples/vhost/ioat.c @@ -0,0 +1,117 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2017 Intel Corporation + */ + +#include <rte_vhost.h> +#include <rte_rawdev.h> +#include <rte_ioat_rawdev.h> +#include <rte_pci.h> + +#include "main.h" + +#define MAX_VHOST_DEVICE 1024 +#define IOAT_RING_SIZE 4096 + +struct dma_info { + struct rte_pci_addr addr; + uint16_t dev_id; + bool is_valid; +}; + +struct dma_for_vhost { + struct dma_info dmas[RTE_MAX_QUEUES_PER_PORT * 2]; + uint16_t nr; +}; + +struct dma_for_vhost dma_bind[MAX_VHOST_DEVICE]; + +int +open_ioat(const char *value) +{ + struct dma_for_vhost *dma_info = dma_bind; + char *input = strndup(value, strlen(value) + 1); + char *addrs = input; + char *ptrs[2]; + char *start, *end, *substr; + int64_t vid, vring_id; + struct rte_ioat_rawdev_config config; + struct rte_rawdev_info info = { .dev_private = &config }; + char name[32]; + int dev_id; + int ret = 0; + uint16_t i = 0; + char *dma_arg[MAX_VHOST_DEVICE]; + uint8_t args_nr; + + while (isblank(*addrs)) + addrs++; + if (*addrs == '\0') { + ret = -1; + goto out; + } + + /* process DMA devices within bracket. */ + addrs++; + substr = strtok(addrs, ";]"); + if (!substr) { + ret = -1; + goto out; + } + args_nr = rte_strsplit(substr, strlen(substr), + dma_arg, MAX_VHOST_DEVICE, ','); + do { + char *arg_temp = dma_arg[i]; + rte_strsplit(arg_temp, strlen(arg_temp), ptrs, 2, '@'); + + start = strstr(ptrs[0], "txd"); + if (start == NULL) { + ret = -1; + goto out; + } + + start += 3; + vid = strtol(start, &end, 0); + if (end == start) { + ret = -1; + goto out; + } + + vring_id = 0 + VIRTIO_RXQ; + if (rte_pci_addr_parse(ptrs[1], + &(dma_info + vid)->dmas[vring_id].addr) < 0) { + ret = -1; + goto out; + } + + rte_pci_device_name(&(dma_info + vid)->dmas[vring_id].addr, + name, sizeof(name)); + dev_id = rte_rawdev_get_dev_id(name); + if (dev_id == (uint16_t)(-ENODEV) || + dev_id == (uint16_t)(-EINVAL)) { + ret = -1; + goto out; + } + + if (rte_rawdev_info_get(dev_id, &info, sizeof(config)) < 0 || + strstr(info.driver_name, "ioat") == NULL) { + ret = -1; + goto out; + } + + (dma_info + vid)->dmas[vring_id].dev_id = dev_id; + (dma_info + vid)->dmas[vring_id].is_valid = true; + config.ring_size = IOAT_RING_SIZE; + config.hdls_disable = true; + if (rte_rawdev_configure(dev_id, &info, sizeof(config)) < 0) { + ret = -1; + goto out; + } + rte_rawdev_start(dev_id); + + dma_info->nr++; + i++; + } while (i < args_nr); +out: + free(input); + return ret; +} diff --git a/examples/vhost/main.c b/examples/vhost/main.c index 959c0c283..4806419d6 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -95,6 +95,10 @@ static int client_mode; static int builtin_net_driver; +static int async_vhost_driver; + +static char dma_type[MAX_LONG_OPT_SZ]; + /* Specify timeout (in useconds) between retries on RX. */ static uint32_t burst_rx_delay_time = BURST_RX_WAIT_US; /* Specify the number of retries on RX. */ @@ -181,6 +185,15 @@ struct mbuf_table lcore_tx_queue[RTE_MAX_LCORE]; / US_PER_S * BURST_TX_DRAIN_US) #define VLAN_HLEN 4 +static inline int +open_dma(const char *value) +{ + if (strncmp(dma_type, "IOAT", 4) == 0) + return open_ioat(value); + else + return -1; +} + /* * Builds up the correct configuration for VMDQ VLAN pool map * according to the pool & queue limits. @@ -446,7 +459,9 @@ us_vhost_usage(const char *prgname) " --socket-file: The path of the socket file.\n" " --tx-csum [0|1] disable/enable TX checksum offload.\n" " --tso [0|1] disable/enable TCP segment offload.\n" - " --client register a vhost-user socket as client mode.\n", + " --client register a vhost-user socket as client mode.\n" + " --dma-type register dma type for your vhost async driver.\n" + " --dmas register dma channel for specific vhost device.\n", prgname); } @@ -472,6 +487,8 @@ us_vhost_parse_args(int argc, char **argv) {"tso", required_argument, NULL, 0}, {"client", no_argument, &client_mode, 1}, {"builtin-net-driver", no_argument, &builtin_net_driver, 1}, + {"dma-type", required_argument, NULL, 0}, + {"dmas", required_argument, NULL, 0}, {NULL, 0, 0, 0}, }; @@ -614,6 +631,24 @@ us_vhost_parse_args(int argc, char **argv) } } + if (!strncmp(long_option[option_index].name, + "dma-type", MAX_LONG_OPT_SZ)) { + strcpy(dma_type, optarg); + } + + if (!strncmp(long_option[option_index].name, + "dmas", MAX_LONG_OPT_SZ)) { + if (open_dma(optarg) == -1) { + if (*optarg == -1) { + RTE_LOG(INFO, VHOST_CONFIG, + "Wrong DMA args\n"); + us_vhost_usage(prgname); + } + return -1; + } + async_vhost_driver = 1; + } + break; /* Invalid option - print options. */ diff --git a/examples/vhost/main.h b/examples/vhost/main.h index 7cba0edbf..eac18824b 100644 --- a/examples/vhost/main.h +++ b/examples/vhost/main.h @@ -90,3 +90,5 @@ uint16_t vs_dequeue_pkts(struct vhost_dev *dev, uint16_t queue_id, struct rte_mempool *mbuf_pool, struct rte_mbuf **pkts, uint16_t count); #endif /* _MAIN_H_ */ + +int open_ioat(const char *value); diff --git a/examples/vhost/meson.build b/examples/vhost/meson.build index 872d51153..cb11edd78 100644 --- a/examples/vhost/meson.build +++ b/examples/vhost/meson.build @@ -9,8 +9,8 @@ if not is_linux build = false endif -deps += 'vhost' +deps += ['vhost', 'rawdev_ioat'] allow_experimental_apis = true sources = files( - 'main.c', 'virtio_net.c' + 'main.c', 'virtio_net.c', 'ioat.c' ) -- 2.27.0
next prev parent reply other threads:[~2020-10-12 5:07 UTC|newest] Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-09-10 6:43 [dpdk-dev] [PATCH v1 0/4] add async data path in vhost sample Cheng Jiang 2020-09-10 6:43 ` [dpdk-dev] [PATCH v1 1/4] example/vhost: add async vhost driver args parsing function Cheng Jiang 2020-09-23 8:25 ` Maxime Coquelin 2020-09-28 6:09 ` Jiang, Cheng1 2020-09-10 6:43 ` [dpdk-dev] [PATCH v1 2/4] example/vhost: add support for vhost async data path Cheng Jiang 2020-09-10 6:43 ` [dpdk-dev] [PATCH v1 3/4] doc: update vhost sample doc " Cheng Jiang 2020-09-10 6:43 ` [dpdk-dev] [PATCH v1 4/4] doc: update release notes for vhost sample Cheng Jiang 2020-09-29 6:42 ` [dpdk-dev] [PATCH v2 0/4] add async data path in " Cheng Jiang 2020-09-29 6:42 ` [dpdk-dev] [PATCH v2 1/4] example/vhost: add async vhost args parsing function Cheng Jiang 2020-09-29 6:42 ` [dpdk-dev] [PATCH v2 2/4] example/vhost: add support for vhost async data path Cheng Jiang 2020-09-29 6:42 ` [dpdk-dev] [PATCH v2 3/4] doc: update vhost sample doc " Cheng Jiang 2020-09-29 6:42 ` [dpdk-dev] [PATCH v2 4/4] doc: update release notes for vhost sample Cheng Jiang 2020-09-30 3:08 ` [dpdk-dev] [PATCH v3 0/4] add async data path in " Cheng Jiang 2020-09-30 3:08 ` [dpdk-dev] [PATCH v3 1/4] example/vhost: add async vhost args parsing function Cheng Jiang 2020-09-30 3:08 ` [dpdk-dev] [PATCH v3 2/4] example/vhost: add support for vhost async data path Cheng Jiang 2020-09-30 3:08 ` [dpdk-dev] [PATCH v3 3/4] doc: update vhost sample doc " Cheng Jiang 2020-09-30 3:08 ` [dpdk-dev] [PATCH v3 4/4] doc: update release notes for vhost sample Cheng Jiang 2020-10-12 4:54 ` [dpdk-dev] [PATCH v4 0/4] add async data path in " Cheng Jiang 2020-10-12 4:54 ` Cheng Jiang [this message] 2020-10-14 9:23 ` [dpdk-dev] [PATCH v4 1/4] example/vhost: add async vhost args parsing function Maxime Coquelin 2020-10-15 5:11 ` Jiang, Cheng1 2020-10-12 4:54 ` [dpdk-dev] [PATCH v4 2/4] example/vhost: add support for vhost async data path Cheng Jiang 2020-10-12 4:54 ` [dpdk-dev] [PATCH v4 3/4] doc: update vhost sample doc " Cheng Jiang 2020-10-12 4:54 ` [dpdk-dev] [PATCH v4 4/4] doc: update release notes for vhost sample Cheng Jiang 2020-10-15 4:54 ` [dpdk-dev] [PATCH v5 0/4] add async data path in " Cheng Jiang 2020-10-15 4:54 ` [dpdk-dev] [PATCH v5 1/4] example/vhost: add async vhost args parsing function Cheng Jiang 2020-10-15 15:13 ` Maxime Coquelin 2020-10-15 4:54 ` [dpdk-dev] [PATCH v5 2/4] example/vhost: add support for vhost async data path Cheng Jiang 2020-10-15 4:54 ` [dpdk-dev] [PATCH v5 3/4] doc: update vhost sample doc " Cheng Jiang 2020-10-15 4:54 ` [dpdk-dev] [PATCH v5 4/4] doc: update release notes for vhost sample Cheng Jiang 2020-10-16 4:29 ` [dpdk-dev] [PATCH v6 0/4] add async data path in " Cheng Jiang 2020-10-16 4:29 ` [dpdk-dev] [PATCH v6 1/4] example/vhost: add async vhost args parsing function Cheng Jiang 2020-10-16 4:29 ` [dpdk-dev] [PATCH v6 2/4] example/vhost: add support for vhost async data path Cheng Jiang 2020-10-16 4:29 ` [dpdk-dev] [PATCH v6 3/4] doc: update vhost sample doc " Cheng Jiang 2020-10-16 4:29 ` [dpdk-dev] [PATCH v6 4/4] doc: update release notes for vhost sample Cheng Jiang 2020-10-19 5:49 ` Jiang, Cheng1 2020-10-20 11:20 ` [dpdk-dev] [PATCH v7 0/4] add async data path in " Cheng Jiang 2020-10-20 11:20 ` [dpdk-dev] [PATCH v7 1/4] example/vhost: add async vhost args parsing function Cheng Jiang 2020-10-20 11:20 ` [dpdk-dev] [PATCH v7 2/4] example/vhost: add support for vhost async data path Cheng Jiang 2020-10-20 11:20 ` [dpdk-dev] [PATCH v7 3/4] doc: update vhost sample doc " Cheng Jiang 2020-10-20 11:20 ` [dpdk-dev] [PATCH v7 4/4] doc: update release notes for vhost sample Cheng Jiang 2020-10-21 6:50 ` [dpdk-dev] [PATCH v8 0/4] add async data path in " Cheng Jiang 2020-10-21 6:50 ` [dpdk-dev] [PATCH v8 1/4] example/vhost: add async vhost args parsing function Cheng Jiang 2020-10-21 6:50 ` [dpdk-dev] [PATCH v8 2/4] example/vhost: add support for vhost async data path Cheng Jiang 2020-10-21 6:50 ` [dpdk-dev] [PATCH v8 3/4] doc: update vhost sample doc " Cheng Jiang 2020-10-21 6:50 ` [dpdk-dev] [PATCH v8 4/4] doc: update release notes for vhost sample Cheng Jiang 2020-10-22 6:46 ` [dpdk-dev] [PATCH v9 0/4] add async data path in " Cheng Jiang 2020-10-22 6:46 ` [dpdk-dev] [PATCH v9 1/4] example/vhost: add async vhost args parsing function Cheng Jiang 2020-10-22 6:46 ` [dpdk-dev] [PATCH v9 2/4] example/vhost: add support for vhost async data path Cheng Jiang 2020-10-22 6:46 ` [dpdk-dev] [PATCH v9 3/4] doc: update vhost sample doc " Cheng Jiang 2020-10-22 6:46 ` [dpdk-dev] [PATCH v9 4/4] doc: update release notes for vhost sample Cheng Jiang 2020-10-22 9:10 ` [dpdk-dev] [PATCH v9 0/4] add async data path in " Maxime Coquelin 2020-10-22 9:14 ` Jiang, Cheng1 2020-10-22 8:59 ` [dpdk-dev] [PATCH v10 " Cheng Jiang 2020-10-22 8:59 ` [dpdk-dev] [PATCH v10 1/4] example/vhost: add async vhost args parsing function Cheng Jiang 2020-10-23 11:08 ` Maxime Coquelin 2020-10-22 8:59 ` [dpdk-dev] [PATCH v10 2/4] example/vhost: add support for vhost async data path Cheng Jiang 2020-10-23 11:12 ` Maxime Coquelin 2020-10-22 8:59 ` [dpdk-dev] [PATCH v10 3/4] doc: update vhost sample doc " Cheng Jiang 2020-10-23 11:15 ` Maxime Coquelin 2020-10-22 8:59 ` [dpdk-dev] [PATCH v10 4/4] doc: update release notes for vhost sample Cheng Jiang 2020-10-23 11:15 ` Maxime Coquelin 2020-10-23 11:23 ` [dpdk-dev] [PATCH v10 0/4] add async data path in " Maxime Coquelin 2020-10-23 13:20 ` Ferruh Yigit 2020-11-09 12:40 ` David Marchand 2020-11-10 3:02 ` Jiang, Cheng1 2020-11-10 8:17 ` David Marchand 2020-11-10 11:19 ` Bruce Richardson 2020-11-10 13:37 ` Thomas Monjalon 2020-11-10 14:34 ` Bruce Richardson 2020-11-10 14:40 ` Thomas Monjalon
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20201012045456.5196-2-Cheng1.jiang@intel.com \ --to=cheng1.jiang@intel.com \ --cc=chenbo.xia@intel.com \ --cc=dev@dpdk.org \ --cc=maxime.coquelin@redhat.com \ --cc=patrick.fu@intel.com \ --cc=zhihong.wang@intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
DPDK patches and discussions This inbox may be cloned and mirrored by anyone: git clone --mirror https://inbox.dpdk.org/dev/0 dev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 dev dev/ https://inbox.dpdk.org/dev \ dev@dpdk.org public-inbox-index dev Example config snippet for mirrors. Newsgroup available over NNTP: nntp://inbox.dpdk.org/inbox.dpdk.dev AGPL code for this site: git clone https://public-inbox.org/public-inbox.git