From patchwork Fri Jan 8 14:54:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xueming Li X-Patchwork-Id: 86212 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (xvm-189-124.dc0.ghst.net [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D599BA0524; Fri, 8 Jan 2021 15:55:15 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5BFB7140FE5; Fri, 8 Jan 2021 15:55:13 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id 71084140FAF for ; Fri, 8 Jan 2021 15:55:11 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from xuemingl@nvidia.com) with SMTP; 8 Jan 2021 16:55:05 +0200 Received: from nvidia.com ([172.27.8.145]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 108Et0Wv013726; Fri, 8 Jan 2021 16:55:03 +0200 From: Xueming Li To: Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko , Olivier Matz Cc: dev@dpdk.org, Viacheslav Ovsiienko , xuemingl@nvidia.com, Asaf Penso , gaetan.rivet@6wind.com, stable@dpdk.org Date: Fri, 8 Jan 2021 22:54:35 +0800 Message-Id: <20210108145441.23320-2-xuemingl@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> References: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 1/7] devargs: fix data buffer storage type X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The data field fo struct devargs is used as data scratch buffer, not a const, remove. Also fixes references to data field of struct devargs. Fixes: 338327d731e6 ("devargs: add function to parse device layers") Fixes: c99a2d4c6b7f ("eal: implement device iteration initialization") Cc: gaetan.rivet@6wind.com Cc: stable@dpdk.org Signed-off-by: Xueming Li --- examples/vdpa/main.c | 6 ++++-- lib/librte_eal/common/eal_common_dev.c | 3 +-- lib/librte_eal/include/rte_dev.h | 2 +- lib/librte_eal/include/rte_devargs.h | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/vdpa/main.c b/examples/vdpa/main.c index 97e967b9a2..88e9d8780a 100644 --- a/examples/vdpa/main.c +++ b/examples/vdpa/main.c @@ -294,9 +294,10 @@ static void cmd_list_vdpa_devices_parsed( struct rte_vdpa_device *vdev; struct rte_device *dev; struct rte_dev_iterator dev_iter; + char args[16]; cmdline_printf(cl, "device name\tqueue num\tsupported features\n"); - RTE_DEV_FOREACH(dev, "class=vdpa", &dev_iter) { + RTE_DEV_FOREACH(dev, strcpy(args, "class=vdpa"), &dev_iter) { vdev = rte_vdpa_find_device_by_name(dev->name); if (!vdev) continue; @@ -528,6 +529,7 @@ main(int argc, char *argv[]) struct rte_vdpa_device *vdev; struct rte_device *dev; struct rte_dev_iterator dev_iter; + char args[16]; ret = rte_eal_init(argc, argv); if (ret < 0) @@ -549,7 +551,7 @@ main(int argc, char *argv[]) cmdline_interact(cl); cmdline_stdin_exit(cl); } else { - RTE_DEV_FOREACH(dev, "class=vdpa", &dev_iter) { + RTE_DEV_FOREACH(dev, strcpy(args, "class=vdpa"), &dev_iter) { vdev = rte_vdpa_find_device_by_name(dev->name); if (vdev == NULL) { rte_panic("Failed to find vDPA dev for %s\n", diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index 8a3bd3100a..793fbdf24b 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -572,8 +572,7 @@ rte_dev_event_callback_process(const char *device_name, } int -rte_dev_iterator_init(struct rte_dev_iterator *it, - const char *dev_str) +rte_dev_iterator_init(struct rte_dev_iterator *it, char *dev_str) { struct rte_devargs devargs; struct rte_class *cls = NULL; diff --git a/lib/librte_eal/include/rte_dev.h b/lib/librte_eal/include/rte_dev.h index 6dd72c11a1..b320e98637 100644 --- a/lib/librte_eal/include/rte_dev.h +++ b/lib/librte_eal/include/rte_dev.h @@ -299,7 +299,7 @@ typedef void *(*rte_dev_iterate_t)(const void *start, */ __rte_experimental int -rte_dev_iterator_init(struct rte_dev_iterator *it, const char *str); +rte_dev_iterator_init(struct rte_dev_iterator *it, char *str); /** * Iterates on a device iterator. diff --git a/lib/librte_eal/include/rte_devargs.h b/lib/librte_eal/include/rte_devargs.h index 296f19324f..8a5ffa2af2 100644 --- a/lib/librte_eal/include/rte_devargs.h +++ b/lib/librte_eal/include/rte_devargs.h @@ -69,7 +69,7 @@ struct rte_devargs { struct rte_class *cls; /**< class handle. */ const char *bus_str; /**< bus-related part of device string. */ const char *cls_str; /**< class-related part of device string. */ - const char *data; /**< Device string storage. */ + char *data; /**< Device string storage. */ }; /** From patchwork Fri Jan 8 14:54:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xueming Li X-Patchwork-Id: 86213 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (xvm-189-124.dc0.ghst.net [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 30B96A0524; Fri, 8 Jan 2021 15:55:25 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BBA38140FFE; Fri, 8 Jan 2021 15:55:14 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id 85949140FE2 for ; Fri, 8 Jan 2021 15:55:11 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from xuemingl@nvidia.com) with SMTP; 8 Jan 2021 16:55:08 +0200 Received: from nvidia.com ([172.27.8.145]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 108Et0Ww013726; Fri, 8 Jan 2021 16:55:06 +0200 From: Xueming Li To: Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko , Olivier Matz Cc: dev@dpdk.org, Viacheslav Ovsiienko , xuemingl@nvidia.com, Asaf Penso , gaetan.rivet@6wind.com, stable@dpdk.org Date: Fri, 8 Jan 2021 22:54:36 +0800 Message-Id: <20210108145441.23320-3-xuemingl@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> References: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 2/7] devargs: fix memory leak on parsing error X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch fixes memory leak in parsing error handling. Fixes: 338327d731e6 ("devargs: add function to parse device layers") Cc: gaetan.rivet@6wind.com Cc: stable@dpdk.org Signed-off-by: Xueming Li --- lib/librte_eal/common/eal_common_devargs.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c index fcf3d9a3cc..f36f71fbce 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -163,6 +163,11 @@ rte_devargs_layers_parse(struct rte_devargs *devargs, if (layers[i].kvlist) rte_kvargs_free(layers[i].kvlist); } + if (ret && devargs->data && devargs->data != devstr) { + /* Free duplicated data. */ + free(devargs->data); + devargs->data = NULL; + } if (ret != 0) rte_errno = -ret; return ret; From patchwork Fri Jan 8 14:54:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xueming Li X-Patchwork-Id: 86214 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (xvm-189-124.dc0.ghst.net [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7A563A0524; Fri, 8 Jan 2021 15:55:45 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 94633141017; Fri, 8 Jan 2021 15:55:17 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id 7D63F14100D for ; Fri, 8 Jan 2021 15:55:16 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from xuemingl@nvidia.com) with SMTP; 8 Jan 2021 16:55:11 +0200 Received: from nvidia.com ([172.27.8.145]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 108Et0Wx013726; Fri, 8 Jan 2021 16:55:09 +0200 From: Xueming Li To: Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko , Olivier Matz Cc: dev@dpdk.org, Viacheslav Ovsiienko , xuemingl@nvidia.com, Asaf Penso , gaetan.rivet@6wind.com, stable@dpdk.org Date: Fri, 8 Jan 2021 22:54:37 +0800 Message-Id: <20210108145441.23320-4-xuemingl@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> References: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 3/7] devargs: fix memory leak in legacy parser X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Data field was designed as parser buffer, will be released once in releasing struct memory. The duplicated device arguments was not saved to data and this caused memory leak. This patch fixes this leak by saving to new allocated memory to data field. Fixes: 4969f5914c9e ("devargs: introduce new parsing helper") Cc: gaetan.rivet@6wind.com Cc: stable@dpdk.org Signed-off-by: Xueming Li --- lib/librte_eal/common/eal_common_devargs.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c index f36f71fbce..3c4774c88a 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -224,13 +224,14 @@ rte_devargs_parse(struct rte_devargs *da, const char *dev) da->bus = bus; /* Parse eventual device arguments */ if (devname[i] == ',') - da->args = strdup(&devname[i + 1]); + da->data = strdup(&devname[i + 1]); else - da->args = strdup(""); - if (da->args == NULL) { + da->data = strdup(""); + if (da->data == NULL) { RTE_LOG(ERR, EAL, "not enough memory to parse arguments\n"); return -ENOMEM; } + da->args = da->data; return 0; } From patchwork Fri Jan 8 14:54:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xueming Li X-Patchwork-Id: 86215 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (xvm-189-124.dc0.ghst.net [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 723F6A0524; Fri, 8 Jan 2021 15:55:53 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D5546141021; Fri, 8 Jan 2021 15:55:18 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id 826EF14100F for ; Fri, 8 Jan 2021 15:55:16 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from xuemingl@nvidia.com) with SMTP; 8 Jan 2021 16:55:14 +0200 Received: from nvidia.com ([172.27.8.145]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 108Et0X0013726; Fri, 8 Jan 2021 16:55:12 +0200 From: Xueming Li To: Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko , Olivier Matz Cc: dev@dpdk.org, Viacheslav Ovsiienko , xuemingl@nvidia.com, Asaf Penso , gaetan.rivet@6wind.com, stable@dpdk.org Date: Fri, 8 Jan 2021 22:54:38 +0800 Message-Id: <20210108145441.23320-5-xuemingl@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> References: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 4/7] devargs: fix buffer data memory leak X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Struct rte_devargs data buffer was changed from args to data field, not all references were changed accordingly, memory leak happened when releasing devargs. Free data field of devargs struct. Fixes: 338327d731e6 ("devargs: add function to parse device layers") Cc: gaetan.rivet@6wind.com Cc: stable@dpdk.org Signed-off-by: Xueming Li --- app/test-pmd/config.c | 4 ++-- app/test-pmd/testpmd.c | 4 ++-- drivers/bus/vdev/vdev.c | 5 +++-- drivers/net/failsafe/failsafe_args.c | 3 ++- drivers/net/failsafe/failsafe_eal.c | 2 +- examples/multi_process/hotplug_mp/commands.c | 8 ++++---- lib/librte_eal/common/eal_common_dev.c | 4 ++-- lib/librte_eal/common/eal_common_devargs.c | 7 ++++--- lib/librte_eal/common/hotplug_mp.c | 5 ++--- lib/librte_ethdev/rte_ethdev.c | 5 +++-- 10 files changed, 25 insertions(+), 22 deletions(-) diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index b51de59e1e..e7f456692b 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -593,8 +593,8 @@ device_infos_display(const char *identifier) if (rte_devargs_parsef(&da, "%s", identifier)) { printf("cannot parse identifier\n"); - if (da.args) - free(da.args); + if (da.data) + free(da.data); return; } diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 33fc0fddf5..66f3ff9320 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -3056,8 +3056,8 @@ detach_devargs(char *identifier) memset(&da, 0, sizeof(da)); if (rte_devargs_parsef(&da, "%s", identifier)) { printf("cannot parse identifier\n"); - if (da.args) - free(da.args); + if (da.data) + free(da.data); return; } diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c index acfd78828f..43375bb334 100644 --- a/drivers/bus/vdev/vdev.c +++ b/drivers/bus/vdev/vdev.c @@ -236,9 +236,10 @@ alloc_devargs(const char *name, const char *args) devargs->bus = &rte_vdev_bus; if (args) - devargs->args = strdup(args); + devargs->data = strdup(args); else - devargs->args = strdup(""); + devargs->data = strdup(""); + devargs->args = devargs->data; ret = strlcpy(devargs->name, name, sizeof(devargs->name)); if (ret < 0 || ret >= (int)sizeof(devargs->name)) { diff --git a/drivers/net/failsafe/failsafe_args.c b/drivers/net/failsafe/failsafe_args.c index 707490b94c..5e507bffbc 100644 --- a/drivers/net/failsafe/failsafe_args.c +++ b/drivers/net/failsafe/failsafe_args.c @@ -451,7 +451,8 @@ failsafe_args_free(struct rte_eth_dev *dev) sdev->cmdline = NULL; free(sdev->fd_str); sdev->fd_str = NULL; - free(sdev->devargs.args); + free(sdev->devargs.data); + sdev->devargs.data = NULL; sdev->devargs.args = NULL; } } diff --git a/drivers/net/failsafe/failsafe_eal.c b/drivers/net/failsafe/failsafe_eal.c index b9fc508673..f066c053f3 100644 --- a/drivers/net/failsafe/failsafe_eal.c +++ b/drivers/net/failsafe/failsafe_eal.c @@ -79,7 +79,7 @@ fs_bus_init(struct rte_eth_dev *dev) rte_eth_devices[pid].device->devargs; /* Take control of probed device. */ - free(da->args); + free(da->data); memset(da, 0, sizeof(*da)); if (probed_da != NULL) snprintf(devstr, sizeof(devstr), "%s,%s", diff --git a/examples/multi_process/hotplug_mp/commands.c b/examples/multi_process/hotplug_mp/commands.c index a8a39d07f7..e77585e5b4 100644 --- a/examples/multi_process/hotplug_mp/commands.c +++ b/examples/multi_process/hotplug_mp/commands.c @@ -121,8 +121,8 @@ static void cmd_dev_attach_parsed(void *parsed_result, if (rte_devargs_parsef(&da, "%s", res->devargs)) { cmdline_printf(cl, "cannot parse devargs\n"); - if (da.args) - free(da.args); + if (da.data) + free(da.data); return; } @@ -168,8 +168,8 @@ static void cmd_dev_detach_parsed(void *parsed_result, if (rte_devargs_parsef(&da, "%s", res->devargs)) { cmdline_printf(cl, "cannot parse devargs\n"); - if (da.args) - free(da.args); + if (da.data) + free(da.data); return; } diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index 793fbdf24b..f65a9594cc 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -186,7 +186,7 @@ local_dev_probe(const char *devargs, struct rte_device **new_dev) err_devarg: if (rte_devargs_remove(da) != 0) { - free(da->args); + free(da->data); free(da); } return ret; @@ -585,7 +585,7 @@ rte_dev_iterator_init(struct rte_dev_iterator *it, char *dev_str) it->bus_str = NULL; it->cls_str = NULL; - devargs.data = dev_str; + devargs.data = NULL; if (rte_devargs_layers_parse(&devargs, dev_str)) goto get_out; diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c index 3c4774c88a..e1a3cd7367 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -284,7 +284,8 @@ rte_devargs_insert(struct rte_devargs **da) /* device already in devargs list, must be updated */ listed_da->type = (*da)->type; listed_da->policy = (*da)->policy; - free(listed_da->args); + if (listed_da->data) + free(listed_da->data); listed_da->args = (*da)->args; listed_da->bus = (*da)->bus; listed_da->cls = (*da)->cls; @@ -332,7 +333,7 @@ rte_devargs_add(enum rte_devtype devtype, const char *devargs_str) fail: if (devargs) { - free(devargs->args); + free(devargs->data); free(devargs); } @@ -352,7 +353,7 @@ rte_devargs_remove(struct rte_devargs *devargs) if (strcmp(d->bus->name, devargs->bus->name) == 0 && strcmp(d->name, devargs->name) == 0) { TAILQ_REMOVE(&devargs_list, d, next); - free(d->args); + free(d->data); free(d); return 0; } diff --git a/lib/librte_eal/common/hotplug_mp.c b/lib/librte_eal/common/hotplug_mp.c index ee791903b3..f0f7c61048 100644 --- a/lib/librte_eal/common/hotplug_mp.c +++ b/lib/librte_eal/common/hotplug_mp.c @@ -118,8 +118,7 @@ __handle_secondary_request(void *param) ret = rte_devargs_parse(&da, req->devargs); if (ret != 0) goto finish; - free(da.args); /* we don't need those */ - da.args = NULL; + free(da.data); /* we don't need those */ ret = eal_dev_hotplug_request_to_secondary(&tmp_req); if (ret != 0) { @@ -283,7 +282,7 @@ static void __handle_primary_request(void *param) ret = local_dev_remove(dev); quit: - free(da->args); + free(da->data); free(da); break; default: diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index 17ddacc78d..4976961d13 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -244,7 +244,8 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str) goto error; } iter->cls_str = cls_str; - free(devargs.args); /* allocated by rte_devargs_parse() */ + free(devargs.data); /* allocated by rte_devargs_parse() */ + devargs.data = NULL; devargs.args = NULL; iter->bus = devargs.bus; @@ -284,7 +285,7 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str) if (ret == -ENOTSUP) RTE_ETHDEV_LOG(ERR, "Bus %s does not support iterating.\n", iter->bus->name); - free(devargs.args); + free(devargs.data); free(bus_str); free(cls_str); return ret; From patchwork Fri Jan 8 14:54:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xueming Li X-Patchwork-Id: 86216 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (xvm-189-124.dc0.ghst.net [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8A497A0524; Fri, 8 Jan 2021 15:56:03 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 425D2140FFB; Fri, 8 Jan 2021 15:55:23 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id 87DCD140FB5 for ; Fri, 8 Jan 2021 15:55:21 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from xuemingl@nvidia.com) with SMTP; 8 Jan 2021 16:55:17 +0200 Received: from nvidia.com ([172.27.8.145]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 108Et0X1013726; Fri, 8 Jan 2021 16:55:15 +0200 From: Xueming Li To: Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko , Olivier Matz Cc: dev@dpdk.org, Viacheslav Ovsiienko , xuemingl@nvidia.com, Asaf Penso Date: Fri, 8 Jan 2021 22:54:39 +0800 Message-Id: <20210108145441.23320-6-xuemingl@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> References: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 5/7] kvargs: add get by key function X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Adds a new function to get value of a specific key from kvargs list. Signed-off-by: Xueming Li --- lib/librte_kvargs/rte_kvargs.c | 20 ++++++++++++++++++++ lib/librte_kvargs/rte_kvargs.h | 14 ++++++++++++++ lib/librte_kvargs/version.map | 1 + 3 files changed, 35 insertions(+) diff --git a/lib/librte_kvargs/rte_kvargs.c b/lib/librte_kvargs/rte_kvargs.c index 285081c86c..bc734915f9 100644 --- a/lib/librte_kvargs/rte_kvargs.c +++ b/lib/librte_kvargs/rte_kvargs.c @@ -160,6 +160,26 @@ rte_kvargs_free(struct rte_kvargs *kvlist) free(kvlist); } +/* lookup the rte_kvargs structure by key */ +const char * +rte_kvargs_get(struct rte_kvargs *kvlist, const char *key) +{ + unsigned int i; + + if (!kvlist) + return NULL; + for (i = 0; i < kvlist->count; ++i) { + /* Allows key to be NULL. */ + if (!key && !kvlist->pairs[i].key) + return kvlist->pairs[i].value; + if (!key || !kvlist->pairs[i].key) + continue; + if (!strcmp(kvlist->pairs[i].key, key)) + return kvlist->pairs[i].value; + } + return NULL; +} + /* * Parse the arguments "key=value,key=value,..." string and return * an allocated structure that contains a key/value list. Also diff --git a/lib/librte_kvargs/rte_kvargs.h b/lib/librte_kvargs/rte_kvargs.h index eff598e08b..6d426241ea 100644 --- a/lib/librte_kvargs/rte_kvargs.h +++ b/lib/librte_kvargs/rte_kvargs.h @@ -114,6 +114,20 @@ struct rte_kvargs *rte_kvargs_parse_delim(const char *args, */ void rte_kvargs_free(struct rte_kvargs *kvlist); +/** + * Get the value matching the given key + * + * @param kvlist + * The rte_kvargs structure + * @param key + * The key that should match + + * @return + * The value that match, NULL if not found. + */ +__rte_experimental +const char *rte_kvargs_get(struct rte_kvargs *kvlist, const char *key); + /** * Call a handler function for each key/value matching the key * diff --git a/lib/librte_kvargs/version.map b/lib/librte_kvargs/version.map index ed375bf4a3..d6cde16f30 100644 --- a/lib/librte_kvargs/version.map +++ b/lib/librte_kvargs/version.map @@ -14,5 +14,6 @@ EXPERIMENTAL { rte_kvargs_parse_delim; rte_kvargs_strcmp; + rte_kvargs_get; }; From patchwork Fri Jan 8 14:54:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xueming Li X-Patchwork-Id: 86217 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (xvm-189-124.dc0.ghst.net [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id C7851A0524; Fri, 8 Jan 2021 15:56:11 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 79DD4141031; Fri, 8 Jan 2021 15:55:24 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id A7EBE140FE2 for ; Fri, 8 Jan 2021 15:55:21 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from xuemingl@nvidia.com) with SMTP; 8 Jan 2021 16:55:19 +0200 Received: from nvidia.com ([172.27.8.145]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 108Et0X2013726; Fri, 8 Jan 2021 16:55:17 +0200 From: Xueming Li To: Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko , Olivier Matz Cc: dev@dpdk.org, Viacheslav Ovsiienko , xuemingl@nvidia.com, Asaf Penso Date: Fri, 8 Jan 2021 22:54:40 +0800 Message-Id: <20210108145441.23320-7-xuemingl@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> References: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 6/7] devargs: support new global device syntax X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" When parsing a device syntax, try to parse new global syntax firstly, then try to parse as legacy syntax if failed. Example of new global syntax: -a bus=pci,addr=82:00.0/class=eth/driver=mlx5,dv_flow_en=1 Signed-off-by: Xueming Li --- lib/librte_eal/common/eal_common_devargs.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c index e1a3cd7367..a79eea12d3 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -57,6 +57,7 @@ rte_devargs_layers_parse(struct rte_devargs *devargs, struct rte_class *cls = NULL; struct rte_bus *bus = NULL; const char *s = devstr; + const char *id; size_t nblayer; size_t i = 0; int ret = 0; @@ -116,6 +117,8 @@ rte_devargs_layers_parse(struct rte_devargs *devargs, if (layers[i].kvlist == NULL) continue; kv = &layers[i].kvlist->pairs[0]; + if (!kv->key) + continue; if (strcmp(kv->key, "bus") == 0) { bus = rte_bus_find_by_name(kv->value); if (bus == NULL) { @@ -124,6 +127,14 @@ rte_devargs_layers_parse(struct rte_devargs *devargs, ret = -EFAULT; goto get_out; } + id = rte_kvargs_get(layers[i].kvlist, "id"); + if (!id) { + RTE_LOG(ERR, EAL, "Could not find bus id \"%s\"\n", + devstr); + ret = -EFAULT; + goto get_out; + } + strncpy(devargs->name, id, sizeof(devargs->name) - 1); } else if (strcmp(kv->key, "class") == 0) { cls = rte_class_find_by_name(kv->value); if (cls == NULL) { @@ -190,6 +201,12 @@ rte_devargs_parse(struct rte_devargs *da, const char *dev) if (da == NULL) return -EINVAL; + /* First parse according new global syntax */ + if (rte_devargs_layers_parse(da, dev) == 0 && da->bus && da->cls) + return 0; + + /* Legacy syntax check: */ + /* Retrieve eventual bus info */ do { devname = dev; From patchwork Fri Jan 8 14:54:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xueming Li X-Patchwork-Id: 86218 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (xvm-189-124.dc0.ghst.net [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id B85C6A0524; Fri, 8 Jan 2021 15:56:20 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AF6B9141038; Fri, 8 Jan 2021 15:55:28 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id B04C9141037 for ; Fri, 8 Jan 2021 15:55:26 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from xuemingl@nvidia.com) with SMTP; 8 Jan 2021 16:55:22 +0200 Received: from nvidia.com ([172.27.8.145]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 108Et0X3013726; Fri, 8 Jan 2021 16:55:20 +0200 From: Xueming Li To: Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko , Olivier Matz Cc: dev@dpdk.org, Viacheslav Ovsiienko , xuemingl@nvidia.com, Asaf Penso Date: Fri, 8 Jan 2021 22:54:41 +0800 Message-Id: <20210108145441.23320-8-xuemingl@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> References: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 7/7] bus/pci: add new global device syntax support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" With new global device syntax, this patch tries to get PCI BDF firstly from bus "addr" argument, fallback to name if not found. Example: -w bus=pci,addr=82:00.0/class=eth/driver=mlx5,dv_flow_en=1 Signed-off-by: Xueming Li --- drivers/bus/pci/pci_common.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 9b8d769287..f6fc80abe8 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include "private.h" @@ -48,9 +49,20 @@ pci_devargs_lookup(const struct rte_pci_addr *pci_addr) { struct rte_devargs *devargs; struct rte_pci_addr addr; + struct rte_kvargs *kvlist = NULL; + const char *name; RTE_EAL_DEVARGS_FOREACH("pci", devargs) { - devargs->bus->parse(devargs->name, &addr); + name = NULL; + if (devargs->bus_str) { + kvlist = rte_kvargs_parse(devargs->bus_str, NULL); + name = rte_kvargs_get(kvlist, "id"); + } + if (!name) + name = devargs->name; + devargs->bus->parse(name, &addr); + if (kvlist) + rte_kvargs_free(kvlist); if (!rte_pci_addr_cmp(pci_addr, &addr)) return devargs; } @@ -71,11 +83,11 @@ pci_name_set(struct rte_pci_device *dev) /* When using a blocklist, only blocked devices will have * an rte_devargs. Allowed devices won't have one. */ - if (devargs != NULL) + if (devargs != NULL && strlen(devargs->name)) /* If an rte_devargs exists, the generic rte_device uses the * given name as its name. */ - dev->device.name = dev->device.devargs->name; + dev->device.name = devargs->name; else /* Otherwise, it uses the internal, canonical form. */ dev->device.name = dev->name;