get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/139490/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 139490,
    "url": "http://patches.dpdk.org/api/patches/139490/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240418103314.40705-4-konstantin.v.ananyev@yandex.ru/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20240418103314.40705-4-konstantin.v.ananyev@yandex.ru>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240418103314.40705-4-konstantin.v.ananyev@yandex.ru",
    "date": "2024-04-18T10:33:11",
    "name": "[RFC,3/6] ethdev: remove VLA warnings",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "7b29dd06ee2f1d41bb371acc703dedb58330fa82",
    "submitter": {
        "id": 2660,
        "url": "http://patches.dpdk.org/api/people/2660/?format=api",
        "name": "Konstantin Ananyev",
        "email": "konstantin.v.ananyev@yandex.ru"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20240418103314.40705-4-konstantin.v.ananyev@yandex.ru/mbox/",
    "series": [
        {
            "id": 31781,
            "url": "http://patches.dpdk.org/api/series/31781/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=31781",
            "date": "2024-04-18T10:33:08",
            "name": "core libs: remove VLA warnings",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/31781/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/139490/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/139490/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id E129443E9F;\n\tThu, 18 Apr 2024 12:33:48 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 4479340A6D;\n\tThu, 18 Apr 2024 12:33:43 +0200 (CEST)",
            "from forward500a.mail.yandex.net (forward500a.mail.yandex.net\n [178.154.239.80])\n by mails.dpdk.org (Postfix) with ESMTP id 0B3B140042\n for <dev@dpdk.org>; Thu, 18 Apr 2024 12:33:42 +0200 (CEST)",
            "from mail-nwsmtp-smtp-production-main-22.iva.yp-c.yandex.net\n (mail-nwsmtp-smtp-production-main-22.iva.yp-c.yandex.net\n [IPv6:2a02:6b8:c0c:7907:0:640:8f19:0])\n by forward500a.mail.yandex.net (Yandex) with ESMTPS id B80D761639;\n Thu, 18 Apr 2024 13:33:41 +0300 (MSK)",
            "by mail-nwsmtp-smtp-production-main-22.iva.yp-c.yandex.net\n (smtp/Yandex) with ESMTPSA id GXCBSvCo7Ko0-17oaUINq;\n Thu, 18 Apr 2024 13:33:41 +0300"
        ],
        "X-Yandex-Fwd": "1",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail;\n t=1713436421; bh=5vW7v6PmNSl0/uI72Cmm7pDcjpOml65LkXf86iesmMc=;\n h=Cc:Message-Id:References:Date:In-Reply-To:Subject:To:From;\n b=YfhF/PXRpSNkBQZubC038z7zr4XjyFJgehkK+tpVBIvPrgxYLn2P5Tj9BSWaVFWsj\n amuAG0wfCKgPbGcl7YemxhwUl2Vj4kFtBAkwr1KsB2oDenAfuU6RKhDg0q8RJaaFyV\n MPdxBdB8sRs5ZSX9lPN9E5GRQt6VEFPeumA+nHls=",
        "Authentication-Results": "\n mail-nwsmtp-smtp-production-main-22.iva.yp-c.yandex.net;\n dkim=pass header.i=@yandex.ru",
        "From": "Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>",
        "To": "dev@dpdk.org",
        "Cc": "thomas@monjalon.net, ferruh.yigit@amd.com, andrew.rybchenko@oktetlabs.ru,\n yipeng1.wang@intel.com, sameh.gobriel@intel.com,\n bruce.richardson@intel.com, vladimir.medvedkin@intel.com,\n honnappa.nagarahalli@arm.com, roretzla@linux.microsoft.com,\n Konstantin Ananyev <konstantin.ananyev@huawei.com>",
        "Subject": "[RFC 3/6] ethdev: remove VLA warnings",
        "Date": "Thu, 18 Apr 2024 11:33:11 +0100",
        "Message-Id": "<20240418103314.40705-4-konstantin.v.ananyev@yandex.ru>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20240418103314.40705-1-konstantin.v.ananyev@yandex.ru>",
        "References": "<20240418103314.40705-1-konstantin.v.ananyev@yandex.ru>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "From: Konstantin Ananyev <konstantin.ananyev@huawei.com>\n\n1) ./lib/ethdev/rte_ethdev.c:3244:16: warning: ISO C90 forbids variable length array ‘xstats_names’ [-Wvla]\n2) ./lib/ethdev/rte_ethdev.c:3345:17: warning: ISO C90 forbids variable length array ‘ids_copy’ [-Wvla]\n3) ./lib/ethdev/rte_ethdev.c:3538:16: warning: ISO C90 forbids variable length array ‘xstats’ [-Wvla]\n4) ./lib/ethdev/rte_ethdev.c:3554:17: warning: ISO C90 forbids variable length array ‘ids_copy’ [-Wvla]\n\nFor 1) and 3) - just replaced VLA with arrays allocated from heap.\nAs I understand xstats extraction belongs to control-path, so extra\ncalloc/free is jopefully acceptable.\nAlso ethdev xstats already doing that within\nrte_eth_xstats_get_id_by_name().\nFor 2) and 4) changed the code to use fixed size array and call\nappropriate devops function several times, if needed.\n\nSigned-off-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>\n---\n lib/ethdev/rte_ethdev.c | 183 +++++++++++++++++++++++++---------------\n 1 file changed, 113 insertions(+), 70 deletions(-)",
    "diff": "diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c\nindex f1c658f49e..e462f3de6f 100644\n--- a/lib/ethdev/rte_ethdev.c\n+++ b/lib/ethdev/rte_ethdev.c\n@@ -36,6 +36,8 @@\n #include \"ethdev_trace.h\"\n #include \"sff_telemetry.h\"\n \n+#define ETH_XSTATS_ITER_NUM\t0x100\n+\n struct rte_eth_dev rte_eth_devices[RTE_MAX_ETHPORTS];\n \n /* public fast-path API */\n@@ -3215,7 +3217,8 @@ int\n rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name,\n \t\tuint64_t *id)\n {\n-\tint cnt_xstats, idx_xstat;\n+\tint cnt_xstats, idx_xstat, rc;\n+\tstruct rte_eth_xstat_name *xstats_names;\n \n \tRTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);\n \n@@ -3241,26 +3244,33 @@ rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name,\n \t}\n \n \t/* Get id-name lookup table */\n-\tstruct rte_eth_xstat_name xstats_names[cnt_xstats];\n+\txstats_names = calloc(cnt_xstats, sizeof(xstats_names[0]));\n+\tif (xstats_names == NULL) {\n+\t\tRTE_ETHDEV_LOG_LINE(ERR, \"Can't allocate memory\");\n+\t\treturn -ENOMEM;\n+\t}\n \n \tif (cnt_xstats != rte_eth_xstats_get_names_by_id(\n \t\t\tport_id, xstats_names, cnt_xstats, NULL)) {\n \t\tRTE_ETHDEV_LOG_LINE(ERR, \"Cannot get xstats lookup\");\n+\t\tfree(xstats_names);\n \t\treturn -1;\n \t}\n \n+\trc = -EINVAL;\n \tfor (idx_xstat = 0; idx_xstat < cnt_xstats; idx_xstat++) {\n \t\tif (!strcmp(xstats_names[idx_xstat].name, xstat_name)) {\n \t\t\t*id = idx_xstat;\n \n \t\t\trte_eth_trace_xstats_get_id_by_name(port_id,\n \t\t\t\t\t\t\t    xstat_name, *id);\n-\n-\t\t\treturn 0;\n+\t\t\trc = 0;\n+\t\t\tbreak;\n \t\t};\n \t}\n \n-\treturn -EINVAL;\n+\tfree(xstats_names);\n+\treturn rc;\n }\n \n /* retrieve basic stats names */\n@@ -3306,6 +3316,38 @@ eth_basic_stats_get_names(struct rte_eth_dev *dev,\n \treturn cnt_used_entries;\n }\n \n+static int\n+eth_xstats_get_by_name_by_id(struct rte_eth_dev *dev, const uint64_t *ids,\n+\tstruct rte_eth_xstat_name *xstats_names, uint32_t size,\n+\tuint32_t basic_count)\n+{\n+\tint32_t rc;\n+\tuint32_t i, k, m, n;\n+\tuint64_t ids_copy[ETH_XSTATS_ITER_NUM];\n+\n+\tm = 0;\n+\tfor (n = 0; n != size; n += k) {\n+\n+\t\tk = RTE_MIN(size - n, RTE_DIM(ids_copy));\n+\n+\t\t/*\n+\t\t * Convert ids to xstats ids that PMD knows.\n+\t\t * ids known by user are basic + extended stats.\n+\t\t */\n+\t\tfor (i = 0; i < k; i++)\n+\t\t\tids_copy[i] = ids[n + i] - basic_count;\n+\n+\t\trc = (*dev->dev_ops->xstats_get_names_by_id)(dev, ids_copy,\n+\t\t\t\t\txstats_names + m, k);\n+\t\tif (rc < 0)\n+\t\t\treturn rc;\n+\t\tm += rc;\n+\t}\n+\n+\treturn m;\n+}\n+\n+\n /* retrieve ethdev extended statistics names */\n int\n rte_eth_xstats_get_names_by_id(uint16_t port_id,\n@@ -3313,9 +3355,8 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,\n \tuint64_t *ids)\n {\n \tstruct rte_eth_xstat_name *xstats_names_copy;\n-\tunsigned int no_basic_stat_requested = 1;\n-\tunsigned int no_ext_stat_requested = 1;\n \tunsigned int expected_entries;\n+\tunsigned int nb_basic_stats;\n \tunsigned int basic_count;\n \tstruct rte_eth_dev *dev;\n \tunsigned int i;\n@@ -3341,27 +3382,18 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,\n \tif (ids && !xstats_names)\n \t\treturn -EINVAL;\n \n-\tif (ids && dev->dev_ops->xstats_get_names_by_id != NULL && size > 0) {\n-\t\tuint64_t ids_copy[size];\n-\n-\t\tfor (i = 0; i < size; i++) {\n-\t\t\tif (ids[i] < basic_count) {\n-\t\t\t\tno_basic_stat_requested = 0;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\n-\t\t\t/*\n-\t\t\t * Convert ids to xstats ids that PMD knows.\n-\t\t\t * ids known by user are basic + extended stats.\n-\t\t\t */\n-\t\t\tids_copy[i] = ids[i] - basic_count;\n-\t\t}\n-\n-\t\tif (no_basic_stat_requested)\n-\t\t\treturn (*dev->dev_ops->xstats_get_names_by_id)(dev,\n-\t\t\t\t\tids_copy, xstats_names, size);\n+\tnb_basic_stats = 0;\n+\tif (ids != NULL) {\n+\t\tfor (i = 0; i < size; i++)\n+\t\t\tnb_basic_stats += (ids[i] < basic_count);\n \t}\n \n+\t/* no baisc stats requested, devops function provided */\n+\tif (nb_basic_stats == 0 && ids != NULL && size != 0 &&\n+\t\t\tdev->dev_ops->xstats_get_names_by_id != NULL)\n+\t\treturn eth_xstats_get_by_name_by_id(dev, ids, xstats_names,\n+\t\t\t\tsize, basic_count);\n+\n \t/* Retrieve all stats */\n \tif (!ids) {\n \t\tint num_stats = rte_eth_xstats_get_names(port_id, xstats_names,\n@@ -3380,17 +3412,8 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,\n \t\treturn -ENOMEM;\n \t}\n \n-\tif (ids) {\n-\t\tfor (i = 0; i < size; i++) {\n-\t\t\tif (ids[i] >= basic_count) {\n-\t\t\t\tno_ext_stat_requested = 0;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\t\t}\n-\t}\n-\n \t/* Fill xstats_names_copy structure */\n-\tif (ids && no_ext_stat_requested) {\n+\tif (ids && nb_basic_stats == size) {\n \t\teth_basic_stats_get_names(dev, xstats_names_copy);\n \t} else {\n \t\tret = rte_eth_xstats_get_names(port_id, xstats_names_copy,\n@@ -3514,17 +3537,47 @@ eth_basic_stats_get(uint16_t port_id, struct rte_eth_xstat *xstats)\n \treturn count;\n }\n \n+static int\n+eth_xtats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,\n+\tuint64_t *values, uint32_t size, uint32_t basic_count)\n+{\n+\tint32_t rc;\n+\tuint32_t i, k, m, n;\n+\tuint64_t ids_copy[ETH_XSTATS_ITER_NUM];\n+\n+\tm = 0;\n+\tfor (n = 0; n != size; n += k) {\n+\n+\t\tk = RTE_MIN(size - n, RTE_DIM(ids_copy));\n+\n+\t\t/*\n+\t\t * Convert ids to xstats ids that PMD knows.\n+\t\t * ids known by user are basic + extended stats.\n+\t\t */\n+\t\tfor (i = 0; i < k; i++)\n+\t\t\tids_copy[i] = ids[n + i] - basic_count;\n+\n+\t\trc = (*dev->dev_ops->xstats_get_by_id)(dev, ids_copy,\n+\t\t\t\t\tvalues + m, k);\n+\t\tif (rc < 0)\n+\t\t\treturn rc;\n+\t\tm += rc;\n+\t}\n+\n+\treturn m;\n+}\n+\n /* retrieve ethdev extended statistics */\n int\n rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,\n \t\t\t uint64_t *values, unsigned int size)\n {\n-\tunsigned int no_basic_stat_requested = 1;\n-\tunsigned int no_ext_stat_requested = 1;\n+\tunsigned int nb_basic_stats;\n \tunsigned int num_xstats_filled;\n \tunsigned int basic_count;\n \tuint16_t expected_entries;\n \tstruct rte_eth_dev *dev;\n+\tstruct rte_eth_xstat *xstats;\n \tunsigned int i;\n \tint ret;\n \n@@ -3535,7 +3588,6 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,\n \tif (ret < 0)\n \t\treturn ret;\n \texpected_entries = (uint16_t)ret;\n-\tstruct rte_eth_xstat xstats[expected_entries];\n \tbasic_count = eth_dev_get_xstats_basic_count(dev);\n \n \t/* Return max number of stats if no ids given */\n@@ -3549,51 +3601,41 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,\n \tif (ids && !values)\n \t\treturn -EINVAL;\n \n-\tif (ids && dev->dev_ops->xstats_get_by_id != NULL && size) {\n-\t\tunsigned int basic_count = eth_dev_get_xstats_basic_count(dev);\n-\t\tuint64_t ids_copy[size];\n-\n-\t\tfor (i = 0; i < size; i++) {\n-\t\t\tif (ids[i] < basic_count) {\n-\t\t\t\tno_basic_stat_requested = 0;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\n-\t\t\t/*\n-\t\t\t * Convert ids to xstats ids that PMD knows.\n-\t\t\t * ids known by user are basic + extended stats.\n-\t\t\t */\n-\t\t\tids_copy[i] = ids[i] - basic_count;\n-\t\t}\n-\n-\t\tif (no_basic_stat_requested)\n-\t\t\treturn (*dev->dev_ops->xstats_get_by_id)(dev, ids_copy,\n-\t\t\t\t\tvalues, size);\n+\tnb_basic_stats = 0;\n+\tif (ids != NULL) {\n+\t\tfor (i = 0; i < size; i++)\n+\t\t\tnb_basic_stats += (ids[i] < basic_count);\n \t}\n \n-\tif (ids) {\n-\t\tfor (i = 0; i < size; i++) {\n-\t\t\tif (ids[i] >= basic_count) {\n-\t\t\t\tno_ext_stat_requested = 0;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\t\t}\n+\t/* no baisc stats requested, devops function provided */\n+\tif (nb_basic_stats == 0 && ids != NULL && size != 0 &&\n+\t\t\tdev->dev_ops->xstats_get_by_id != NULL)\n+\t\treturn eth_xtats_get_by_id(dev, ids, values, size, basic_count);\n+\n+\txstats = calloc(expected_entries, sizeof(xstats[0]));\n+\tif (xstats == NULL) {\n+\t\tRTE_ETHDEV_LOG_LINE(ERR, \"Can't allocate memory\");\n+\t\treturn -ENOMEM;\n \t}\n \n \t/* Fill the xstats structure */\n-\tif (ids && no_ext_stat_requested)\n+\tif (ids && nb_basic_stats == size)\n \t\tret = eth_basic_stats_get(port_id, xstats);\n \telse\n \t\tret = rte_eth_xstats_get(port_id, xstats, expected_entries);\n \n-\tif (ret < 0)\n+\tif (ret < 0) {\n+\t\tfree(xstats);\n \t\treturn ret;\n+\t}\n \tnum_xstats_filled = (unsigned int)ret;\n \n \t/* Return all stats */\n \tif (!ids) {\n \t\tfor (i = 0; i < num_xstats_filled; i++)\n \t\t\tvalues[i] = xstats[i].value;\n+\n+\t\tfree(xstats);\n \t\treturn expected_entries;\n \t}\n \n@@ -3601,14 +3643,15 @@ rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,\n \tfor (i = 0; i < size; i++) {\n \t\tif (ids[i] >= expected_entries) {\n \t\t\tRTE_ETHDEV_LOG_LINE(ERR, \"Id value isn't valid\");\n-\t\t\treturn -1;\n+\t\t\tbreak;\n \t\t}\n \t\tvalues[i] = xstats[ids[i]].value;\n \t}\n \n \trte_eth_trace_xstats_get_by_id(port_id, ids, values, size);\n \n-\treturn size;\n+\tfree(xstats);\n+\treturn (i == size) ? (int32_t)size : -1;\n }\n \n int\n",
    "prefixes": [
        "RFC",
        "3/6"
    ]
}