Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/96575/?format=api
http://patchwork.dpdk.org/api/patches/96575/?format=api", "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/9e86342d13e58f568a2ea4763163d9223ae7d710.1627967359.git.gmuthukrishn@marvell.com/", "project": { "id": 1, "url": "http://patchwork.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": "<9e86342d13e58f568a2ea4763163d9223ae7d710.1627967359.git.gmuthukrishn@marvell.com>", "list_archive_url": "https://inbox.dpdk.org/dev/9e86342d13e58f568a2ea4763163d9223ae7d710.1627967359.git.gmuthukrishn@marvell.com", "date": "2021-08-03T08:05:44", "name": "[v3,1/3] telemetry: enable storing pointer value", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "c4abef79b17c8faf72fe551b6807694b81a1caa6", "submitter": { "id": 2301, "url": "http://patchwork.dpdk.org/api/people/2301/?format=api", "name": "Gowrishankar Muthukrishnan", "email": "gmuthukrishn@marvell.com" }, "delegate": { "id": 1, "url": "http://patchwork.dpdk.org/api/users/1/?format=api", "username": "tmonjalo", "first_name": "Thomas", "last_name": "Monjalon", "email": "thomas@monjalon.net" }, "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/9e86342d13e58f568a2ea4763163d9223ae7d710.1627967359.git.gmuthukrishn@marvell.com/mbox/", "series": [ { "id": 18157, "url": "http://patchwork.dpdk.org/api/series/18157/?format=api", "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=18157", "date": "2021-08-03T08:05:43", "name": "common/cnxk: enable npa telemetry", "version": 3, "mbox": "http://patchwork.dpdk.org/series/18157/mbox/" } ], "comments": "http://patchwork.dpdk.org/api/patches/96575/comments/", "check": "success", "checks": "http://patchwork.dpdk.org/api/patches/96575/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 9C887A0C41;\n\tTue, 3 Aug 2021 10:06:00 +0200 (CEST)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 47860411B2;\n\tTue, 3 Aug 2021 10:05:58 +0200 (CEST)", "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id 3C559411B2\n for <dev@dpdk.org>; Tue, 3 Aug 2021 10:05:57 +0200 (CEST)", "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id\n 17382Fl8009555; Tue, 3 Aug 2021 01:05:56 -0700", "from dc5-exch01.marvell.com ([199.233.59.181])\n by mx0b-0016f401.pphosted.com with ESMTP id 3a6b46v9wt-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);\n Tue, 03 Aug 2021 01:05:56 -0700", "from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.18;\n Tue, 3 Aug 2021 01:05:54 -0700", "from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.18 via Frontend\n Transport; Tue, 3 Aug 2021 01:05:54 -0700", "from localhost.localdomain (unknown [10.28.34.38])\n by maili.marvell.com (Postfix) with ESMTP id 04E135B6943;\n Tue, 3 Aug 2021 01:05:51 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : mime-version :\n content-transfer-encoding : content-type; s=pfpt0220;\n bh=Edy/Gem/w2+p3VStfb41EcphsWZyWbLMOav0IGueDaA=;\n b=NPICr7me0avZddb3Amd7l5DgZlohOjXaygHKiGpMOblg7pnNhRNRZpY09fgAprDTVm9v\n FJaqb71vSPFNNh/EdeLsc45+Et8UBkVz46ZhfSsydHCeNZtrtV09hg87ONM9yHZysKDE\n B5AtH3372r6YUNuadlmZiPaAIWri7JBE1Ly3OMv8XqNtC1mZicHDODAvz+RjO8A95oqE\n MmW0lL5yEhFYTCpAfe3TUPS68ctcf80Pt0cuJuvy7Jnx5i+p0EhLjxfaXvLsGsz+4wAY\n BZtKwbnzMfVFKCh9XXKUDxQb/OGpdAXNDK9a0yPPWkwHljTwXkYHbKFuPeiJfR8hAzE7 Bg==", "From": "Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>", "To": "<dev@dpdk.org>", "CC": "<bruce.richardson@intel.com>, <ciara.power@intel.com>,\n <jerinj@marvell.com>, <kirankumark@marvell.com>,\n <ndabilpuram@marvell.com>, <skori@marvell.com>, <skoteshwar@marvell.com>,\n Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>", "Date": "Tue, 3 Aug 2021 13:35:44 +0530", "Message-ID": "\n <9e86342d13e58f568a2ea4763163d9223ae7d710.1627967359.git.gmuthukrishn@marvell.com>", "X-Mailer": "git-send-email 2.25.1", "In-Reply-To": "<cover.1627967359.git.gmuthukrishn@marvell.com>", "References": "<cover.1627967359.git.gmuthukrishn@marvell.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Content-Type": "text/plain", "X-Proofpoint-GUID": "fftF15PEcMxiqoMiTiIhbKX11DBxAMxx", "X-Proofpoint-ORIG-GUID": "fftF15PEcMxiqoMiTiIhbKX11DBxAMxx", "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10434:6.0.391, 18.0.790\n definitions=2021-08-03_02:2021-08-03,\n 2021-08-03 signatures=0", "Subject": "[dpdk-dev] [v3, 1/3] telemetry: enable storing pointer value", "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", "Sender": "\"dev\" <dev-bounces@dpdk.org>" }, "content": "At present, value of pointer variable or address is stored in\nu64 type which may not properly work in non64 bit arch. Hence,\nthis patch adds new API to store it in void*. JSON encoding is\nafter converting to uintptr_t so, address value is correctly\ncasted as per arch as well. Once JSON5 support is available\nat JSON clients, hex value of address can be encoded instead\nof uintptr_t.\n\nSigned-off-by: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>\n---\n lib/telemetry/rte_telemetry.h | 37 ++++++++++++++++++++++++++++++-\n lib/telemetry/telemetry.c | 21 ++++++++++++++++--\n lib/telemetry/telemetry_data.c | 40 ++++++++++++++++++++++++++++++----\n lib/telemetry/telemetry_data.h | 2 ++\n lib/telemetry/telemetry_json.h | 32 +++++++++++++++++++++++++++\n lib/telemetry/version.map | 2 ++\n 6 files changed, 127 insertions(+), 7 deletions(-)", "diff": "diff --git a/lib/telemetry/rte_telemetry.h b/lib/telemetry/rte_telemetry.h\nindex 8776998b54..6a420f918c 100644\n--- a/lib/telemetry/rte_telemetry.h\n+++ b/lib/telemetry/rte_telemetry.h\n@@ -46,7 +46,8 @@ enum rte_tel_value_type {\n \tRTE_TEL_STRING_VAL, /** a string value */\n \tRTE_TEL_INT_VAL, /** a signed 32-bit int value */\n \tRTE_TEL_U64_VAL, /** an unsigned 64-bit int value */\n-\tRTE_TEL_CONTAINER, /** a container struct */\n+\tRTE_TEL_CONTAINER, /** a container struct */\n+\tRTE_TEL_PTR_VAL, /** a pointer value */\n };\n \n /**\n@@ -137,6 +138,22 @@ __rte_experimental\n int\n rte_tel_data_add_array_u64(struct rte_tel_data *d, uint64_t x);\n \n+/**\n+ * Add a pointer value to an array.\n+ * The array must have been started by rte_tel_data_start_array() with\n+ * RTE_TEL_PTR_VAL as the type parameter.\n+ *\n+ * @param d\n+ * The data structure passed to the callback\n+ * @param x\n+ * The pointer value to be returned in the array\n+ * @return\n+ * 0 on success, negative errno on error\n+ */\n+__rte_experimental\n+int\n+rte_tel_data_add_array_ptr(struct rte_tel_data *d, void *x);\n+\n /**\n * Add a container to an array. A container is an existing telemetry data\n * array. The array the container is to be added to must have been started by\n@@ -213,6 +230,24 @@ int\n rte_tel_data_add_dict_u64(struct rte_tel_data *d,\n \t\tconst char *name, uint64_t val);\n \n+/**\n+ * Add a pointer value to a dictionary.\n+ * The dict must have been started by rte_tel_data_start_dict().\n+ *\n+ * @param d\n+ * The data structure passed to the callback\n+ * @param name\n+ * The name the value is to be stored under in the dict\n+ * @param ptr\n+ * The pointer value to be stored in the dict\n+ * @return\n+ * 0 on success, negative errno on error, E2BIG on string truncation of name.\n+ */\n+__rte_experimental\n+int\n+rte_tel_data_add_dict_ptr(struct rte_tel_data *d,\n+\t\tconst char *name, void *ptr);\n+\n /**\n * Add a container to a dictionary. A container is an existing telemetry data\n * array. The dict the container is to be added to must have been started by\ndiff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c\nindex 8665db8d03..5842b28740 100644\n--- a/lib/telemetry/telemetry.c\n+++ b/lib/telemetry/telemetry.c\n@@ -157,8 +157,10 @@ container_to_json(const struct rte_tel_data *d, char *out_buf, size_t buf_len)\n \tsize_t used = 0;\n \tunsigned int i;\n \n-\tif (d->type != RTE_TEL_ARRAY_U64 && d->type != RTE_TEL_ARRAY_INT\n-\t\t\t&& d->type != RTE_TEL_ARRAY_STRING)\n+\tif (d->type != RTE_TEL_ARRAY_U64\n+\t\t&& d->type != RTE_TEL_ARRAY_INT\n+\t\t&& d->type != RTE_TEL_ARRAY_PTR\n+\t\t&& d->type != RTE_TEL_ARRAY_STRING)\n \t\treturn snprintf(out_buf, buf_len, \"null\");\n \n \tused = rte_tel_json_empty_array(out_buf, buf_len, 0);\n@@ -167,6 +169,11 @@ container_to_json(const struct rte_tel_data *d, char *out_buf, size_t buf_len)\n \t\t\tused = rte_tel_json_add_array_u64(out_buf,\n \t\t\t\tbuf_len, used,\n \t\t\t\td->data.array[i].u64val);\n+\tif (d->type == RTE_TEL_ARRAY_PTR)\n+\t\tfor (i = 0; i < d->data_len; i++)\n+\t\t\tused = rte_tel_json_add_array_ptr(out_buf,\n+\t\t\t\tbuf_len, used,\n+\t\t\t\td->data.array[i].ptrval);\n \tif (d->type == RTE_TEL_ARRAY_INT)\n \t\tfor (i = 0; i < d->data_len; i++)\n \t\t\tused = rte_tel_json_add_array_int(out_buf,\n@@ -226,6 +233,11 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)\n \t\t\t\t\t\tbuf_len, used,\n \t\t\t\t\t\tv->name, v->value.u64val);\n \t\t\t\tbreak;\n+\t\t\tcase RTE_TEL_PTR_VAL:\n+\t\t\t\tused = rte_tel_json_add_obj_ptr(cb_data_buf,\n+\t\t\t\t\t\tbuf_len, used,\n+\t\t\t\t\t\tv->name, v->value.ptrval);\n+\t\t\t\tbreak;\n \t\t\tcase RTE_TEL_CONTAINER:\n \t\t\t{\n \t\t\t\tchar temp[buf_len];\n@@ -248,6 +260,7 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)\n \tcase RTE_TEL_ARRAY_STRING:\n \tcase RTE_TEL_ARRAY_INT:\n \tcase RTE_TEL_ARRAY_U64:\n+\tcase RTE_TEL_ARRAY_PTR:\n \tcase RTE_TEL_ARRAY_CONTAINER:\n \t\tprefix_used = snprintf(out_buf, sizeof(out_buf), \"{\\\"%.*s\\\":\",\n \t\t\t\tMAX_CMD_LEN, cmd);\n@@ -269,6 +282,10 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)\n \t\t\t\tused = rte_tel_json_add_array_u64(cb_data_buf,\n \t\t\t\t\t\tbuf_len, used,\n \t\t\t\t\t\td->data.array[i].u64val);\n+\t\t\telse if (d->type == RTE_TEL_ARRAY_PTR)\n+\t\t\t\tused = rte_tel_json_add_array_ptr(cb_data_buf,\n+\t\t\t\t\t\tbuf_len, used,\n+\t\t\t\t\t\td->data.array[i].ptrval);\n \t\t\telse if (d->type == RTE_TEL_ARRAY_CONTAINER) {\n \t\t\t\tchar temp[buf_len];\n \t\t\t\tconst struct container *rec_data =\ndiff --git a/lib/telemetry/telemetry_data.c b/lib/telemetry/telemetry_data.c\nindex 77b0fe09a5..9384f48589 100644\n--- a/lib/telemetry/telemetry_data.c\n+++ b/lib/telemetry/telemetry_data.c\n@@ -15,6 +15,7 @@ rte_tel_data_start_array(struct rte_tel_data *d, enum rte_tel_value_type type)\n \t\t\tRTE_TEL_ARRAY_INT, /* RTE_TEL_INT_VAL = 1 */\n \t\t\tRTE_TEL_ARRAY_U64, /* RTE_TEL_u64_VAL = 2 */\n \t\t\tRTE_TEL_ARRAY_CONTAINER, /* RTE_TEL_CONTAINER = 3 */\n+\t\t\tRTE_TEL_ARRAY_PTR, /* RTE_TEL_PTR_VAL = 4 */\n \t};\n \td->type = array_types[type];\n \td->data_len = 0;\n@@ -75,6 +76,17 @@ rte_tel_data_add_array_u64(struct rte_tel_data *d, uint64_t x)\n \treturn 0;\n }\n \n+int\n+rte_tel_data_add_array_ptr(struct rte_tel_data *d, void *x)\n+{\n+\tif (d->type != RTE_TEL_ARRAY_PTR)\n+\t\treturn -EINVAL;\n+\tif (d->data_len >= RTE_TEL_MAX_ARRAY_ENTRIES)\n+\t\treturn -ENOSPC;\n+\td->data.array[d->data_len++].ptrval = x;\n+\treturn 0;\n+}\n+\n int\n rte_tel_data_add_array_container(struct rte_tel_data *d,\n \t\tstruct rte_tel_data *val, int keep)\n@@ -82,7 +94,8 @@ rte_tel_data_add_array_container(struct rte_tel_data *d,\n \tif (d->type != RTE_TEL_ARRAY_CONTAINER ||\n \t\t\t(val->type != RTE_TEL_ARRAY_U64\n \t\t\t&& val->type != RTE_TEL_ARRAY_INT\n-\t\t\t&& val->type != RTE_TEL_ARRAY_STRING))\n+\t\t\t&& val->type != RTE_TEL_ARRAY_STRING\n+\t\t\t&& val->type != RTE_TEL_ARRAY_PTR))\n \t\treturn -EINVAL;\n \tif (d->data_len >= RTE_TEL_MAX_ARRAY_ENTRIES)\n \t\treturn -ENOSPC;\n@@ -147,15 +160,34 @@ rte_tel_data_add_dict_u64(struct rte_tel_data *d,\n \treturn bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;\n }\n \n+int\n+rte_tel_data_add_dict_ptr(struct rte_tel_data *d,\n+\t\tconst char *name, void *ptr)\n+{\n+\tstruct tel_dict_entry *e = &d->data.dict[d->data_len];\n+\tif (d->type != RTE_TEL_DICT)\n+\t\treturn -EINVAL;\n+\tif (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES)\n+\t\treturn -ENOSPC;\n+\n+\td->data_len++;\n+\te->type = RTE_TEL_PTR_VAL;\n+\te->value.ptrval = ptr;\n+\tconst size_t bytes = strlcpy(e->name, name, RTE_TEL_MAX_STRING_LEN);\n+\treturn bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;\n+}\n+\n int\n rte_tel_data_add_dict_container(struct rte_tel_data *d, const char *name,\n \t\tstruct rte_tel_data *val, int keep)\n {\n \tstruct tel_dict_entry *e = &d->data.dict[d->data_len];\n \n-\tif (d->type != RTE_TEL_DICT || (val->type != RTE_TEL_ARRAY_U64\n-\t\t\t&& val->type != RTE_TEL_ARRAY_INT\n-\t\t\t&& val->type != RTE_TEL_ARRAY_STRING))\n+\tif (d->type != RTE_TEL_DICT ||\n+\t\t(val->type != RTE_TEL_ARRAY_U64\n+\t\t && val->type != RTE_TEL_ARRAY_INT\n+\t\t && val->type != RTE_TEL_ARRAY_STRING\n+\t\t && val->type != RTE_TEL_ARRAY_PTR))\n \t\treturn -EINVAL;\n \tif (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES)\n \t\treturn -ENOSPC;\ndiff --git a/lib/telemetry/telemetry_data.h b/lib/telemetry/telemetry_data.h\nindex adb84a09f1..bb361e3bcc 100644\n--- a/lib/telemetry/telemetry_data.h\n+++ b/lib/telemetry/telemetry_data.h\n@@ -16,6 +16,7 @@ enum tel_container_types {\n \tRTE_TEL_ARRAY_INT, /** array of signed, 32-bit int values */\n \tRTE_TEL_ARRAY_U64, /** array of unsigned 64-bit int values */\n \tRTE_TEL_ARRAY_CONTAINER, /** array of container structs */\n+\tRTE_TEL_ARRAY_PTR, /** array of pointer values */\n };\n \n struct container {\n@@ -31,6 +32,7 @@ union tel_value {\n \tchar sval[RTE_TEL_MAX_STRING_LEN];\n \tint ival;\n \tuint64_t u64val;\n+\tvoid *ptrval;\n \tstruct container container;\n };\n \ndiff --git a/lib/telemetry/telemetry_json.h b/lib/telemetry/telemetry_json.h\nindex ad270b9b30..b41329902f 100644\n--- a/lib/telemetry/telemetry_json.h\n+++ b/lib/telemetry/telemetry_json.h\n@@ -102,6 +102,20 @@ rte_tel_json_add_array_u64(char *buf, const int len, const int used,\n \treturn ret == 0 ? used : end + ret;\n }\n \n+/* Appends a pointer value into the JSON array in the provided buffer. */\n+static inline int\n+rte_tel_json_add_array_ptr(char *buf, const int len, const int used, void *ptr)\n+{\n+\tint ret, end = used - 1; /* strip off final delimiter */\n+\tif (used <= 2)\t\t /* assume empty, since minimum is '[]' */\n+\t\treturn __json_snprintf(buf, len, \"[%\" PRIuPTR \"]\",\n+\t\t\t\t (uintptr_t)ptr);\n+\n+\tret = __json_snprintf(buf + end, len - end, \",%\" PRIuPTR \"]\",\n+\t\t\t (uintptr_t)ptr);\n+\treturn ret == 0 ? used : end + ret;\n+}\n+\n /*\n * Add a new element with raw JSON value to the JSON array stored in the\n * provided buffer.\n@@ -136,6 +150,24 @@ rte_tel_json_add_obj_u64(char *buf, const int len, const int used,\n \treturn ret == 0 ? used : end + ret;\n }\n \n+/**\n+ * Add a new element with uint64_t value to the JSON object stored in the\n+ * provided buffer.\n+ */\n+static inline int\n+rte_tel_json_add_obj_ptr(char *buf, const int len, const int used,\n+\t\t\t const char *name, void *ptr)\n+{\n+\tint ret, end = used - 1;\n+\tif (used <= 2) /* assume empty, since minimum is '{}' */\n+\t\treturn __json_snprintf(buf, len, \"{\\\"%s\\\":%\" PRIuPTR \"}\", name,\n+\t\t\t\t (uintptr_t)ptr);\n+\n+\tret = __json_snprintf(buf + end, len - end, \",\\\"%s\\\":%\" PRIuPTR \"}\",\n+\t\t\t name, (uintptr_t)ptr);\n+\treturn ret == 0 ? used : end + ret;\n+}\n+\n /**\n * Add a new element with int value to the JSON object stored in the\n * provided buffer.\ndiff --git a/lib/telemetry/version.map b/lib/telemetry/version.map\nindex bde80ce29b..d919340bc6 100644\n--- a/lib/telemetry/version.map\n+++ b/lib/telemetry/version.map\n@@ -5,10 +5,12 @@ EXPERIMENTAL {\n \trte_tel_data_add_array_int;\n \trte_tel_data_add_array_string;\n \trte_tel_data_add_array_u64;\n+\trte_tel_data_add_array_ptr;\n \trte_tel_data_add_dict_container;\n \trte_tel_data_add_dict_int;\n \trte_tel_data_add_dict_string;\n \trte_tel_data_add_dict_u64;\n+\trte_tel_data_add_dict_ptr;\n \trte_tel_data_alloc;\n \trte_tel_data_free;\n \trte_tel_data_start_array;\n", "prefixes": [ "v3", "1/3" ] }{ "id": 96575, "url": "