Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/122869/?format=api
http://patches.dpdk.org/api/patches/122869/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20230201131757.1787527-5-tduszynski@marvell.com/", "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": "<20230201131757.1787527-5-tduszynski@marvell.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20230201131757.1787527-5-tduszynski@marvell.com", "date": "2023-02-01T13:17:57", "name": "[v7,4/4] eal: add PMU support to tracing library", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "e9ae2889829eb261b06bffd37ee5ac0c44eb13c1", "submitter": { "id": 2215, "url": "http://patches.dpdk.org/api/people/2215/?format=api", "name": "Tomasz Duszynski", "email": "tduszynski@marvell.com" }, "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/20230201131757.1787527-5-tduszynski@marvell.com/mbox/", "series": [ { "id": 26736, "url": "http://patches.dpdk.org/api/series/26736/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=26736", "date": "2023-02-01T13:17:53", "name": "add support for self monitoring", "version": 7, "mbox": "http://patches.dpdk.org/series/26736/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/122869/comments/", "check": "warning", "checks": "http://patches.dpdk.org/api/patches/122869/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 051EA41B9F;\n\tWed, 1 Feb 2023 14:18:37 +0100 (CET)", "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id EB9AD42D38;\n\tWed, 1 Feb 2023 14:18:26 +0100 (CET)", "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id E51CF42D53\n for <dev@dpdk.org>; Wed, 1 Feb 2023 14:18:25 +0100 (CET)", "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id\n 3116MLrK010385; Wed, 1 Feb 2023 05:18:24 -0800", "from dc5-exch01.marvell.com ([199.233.59.181])\n by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3nfjrj1mrp-3\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);\n Wed, 01 Feb 2023 05:18:23 -0800", "from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.42;\n Wed, 1 Feb 2023 05:18:20 -0800", "from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.42 via Frontend\n Transport; Wed, 1 Feb 2023 05:18:20 -0800", "from cavium-DT10.. (unknown [10.28.34.39])\n by maili.marvell.com (Postfix) with ESMTP id 1A8A83F711C;\n Wed, 1 Feb 2023 05:18:16 -0800 (PST)" ], "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=NJhC4/zi70rNoLQUZIxxt+AR7rBvnicKSkwhdoqGfSI=;\n b=H0NiMDfviboNb6ADxkzFkFwajE4oNPMpeVP12FXJ0wsGdDYsvyg6Io1oLndy0k7RoJ5o\n 99L86OeV0+ORVsnFLcA7cdoh++2h3PEkm+bgOrIVSU3oe02pUKxxPpWAWlzj3eECer7/\n 7HOkZyE1jLQroDvsr7aBCtpuYiLavTPh4y0I9DFdb/dlhAaM1xVICGX3KtxTI7MwGJ+C\n rVSns2I9TKQajg869MnnGjN0wY7kw0WFliBJT1L7BRP9MzvX39n7NHDQp5ntmNHAeSMK\n QDtfjj5mLJJf7Xnd0vZkp9gjjH/Fon82RphbxRlZGM1Ko6RTwdskh1tySPGEP5thKTW3 7A==", "From": "Tomasz Duszynski <tduszynski@marvell.com>", "To": "<dev@dpdk.org>, Jerin Jacob <jerinj@marvell.com>, Sunil Kumar Kori\n <skori@marvell.com>, Tomasz Duszynski <tduszynski@marvell.com>", "CC": "<roretzla@linux.microsoft.com>, <Ruifeng.Wang@arm.com>,\n <bruce.richardson@intel.com>, <mattias.ronnblom@ericsson.com>,\n <mb@smartsharesystems.com>, <thomas@monjalon.net>, <zhoumin@loongson.cn>", "Subject": "[PATCH v7 4/4] eal: add PMU support to tracing library", "Date": "Wed, 1 Feb 2023 14:17:57 +0100", "Message-ID": "<20230201131757.1787527-5-tduszynski@marvell.com>", "X-Mailer": "git-send-email 2.34.1", "In-Reply-To": "<20230201131757.1787527-1-tduszynski@marvell.com>", "References": "<20230119233916.4029128-1-tduszynski@marvell.com>\n <20230201131757.1787527-1-tduszynski@marvell.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Content-Type": "text/plain", "X-Proofpoint-ORIG-GUID": "fJ0r1lP1kHqtrU3iWLcuTw3qWfLwrQvE", "X-Proofpoint-GUID": "fJ0r1lP1kHqtrU3iWLcuTw3qWfLwrQvE", "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.219,Aquarius:18.0.930,Hydra:6.0.562,FMLib:17.11.122.1\n definitions=2023-02-01_04,2023-01-31_01,2022-06-22_01", "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": "In order to profile app one needs to store significant amount of samples\nsomewhere for an analysis latern on. Since trace library supports\nstoring data in a CTF format lets take adventage of that and add a\ndedicated PMU tracepoint.\n\nSigned-off-by: Tomasz Duszynski <tduszynski@marvell.com>\n---\n app/test/test_trace_perf.c | 10 ++++\n doc/guides/prog_guide/profile_app.rst | 5 ++\n doc/guides/prog_guide/trace_lib.rst | 32 +++++++++++++\n lib/eal/common/eal_common_trace.c | 13 ++++-\n lib/eal/common/eal_common_trace_points.c | 5 ++\n lib/eal/include/rte_eal_trace.h | 13 +++++\n lib/eal/meson.build | 3 ++\n lib/eal/version.map | 3 ++\n lib/pmu/rte_pmu.c | 61 ++++++++++++++++++++++++\n lib/pmu/rte_pmu.h | 14 ++++++\n lib/pmu/version.map | 1 +\n 11 files changed, 159 insertions(+), 1 deletion(-)", "diff": "diff --git a/app/test/test_trace_perf.c b/app/test/test_trace_perf.c\nindex 46ae7d8074..f1929f2734 100644\n--- a/app/test/test_trace_perf.c\n+++ b/app/test/test_trace_perf.c\n@@ -114,6 +114,10 @@ worker_fn_##func(void *arg) \\\n #define GENERIC_DOUBLE rte_eal_trace_generic_double(3.66666)\n #define GENERIC_STR rte_eal_trace_generic_str(\"hello world\")\n #define VOID_FP app_dpdk_test_fp()\n+#ifdef RTE_EXEC_ENV_LINUX\n+/* 0 corresponds first event passed via --trace= */\n+#define READ_PMU rte_eal_trace_pmu_read(0)\n+#endif\n \n WORKER_DEFINE(GENERIC_VOID)\n WORKER_DEFINE(GENERIC_U64)\n@@ -122,6 +126,9 @@ WORKER_DEFINE(GENERIC_FLOAT)\n WORKER_DEFINE(GENERIC_DOUBLE)\n WORKER_DEFINE(GENERIC_STR)\n WORKER_DEFINE(VOID_FP)\n+#ifdef RTE_EXEC_ENV_LINUX\n+WORKER_DEFINE(READ_PMU)\n+#endif\n \n static void\n run_test(const char *str, lcore_function_t f, struct test_data *data, size_t sz)\n@@ -174,6 +181,9 @@ test_trace_perf(void)\n \trun_test(\"double\", worker_fn_GENERIC_DOUBLE, data, sz);\n \trun_test(\"string\", worker_fn_GENERIC_STR, data, sz);\n \trun_test(\"void_fp\", worker_fn_VOID_FP, data, sz);\n+#ifdef RTE_EXEC_ENV_LINUX\n+\trun_test(\"read_pmu\", worker_fn_READ_PMU, data, sz);\n+#endif\n \n \trte_free(data);\n \treturn TEST_SUCCESS;\ndiff --git a/doc/guides/prog_guide/profile_app.rst b/doc/guides/prog_guide/profile_app.rst\nindex a8b501fe0c..6a53341c6b 100644\n--- a/doc/guides/prog_guide/profile_app.rst\n+++ b/doc/guides/prog_guide/profile_app.rst\n@@ -16,6 +16,11 @@ that information, perf being an example here. Though in some scenarios, eg. when\n isolated (nohz_full) and run dedicated tasks, using perf is less than ideal. In such cases one can\n read specific events directly from application via ``rte_pmu_read()``.\n \n+Alternatively tracing library can be used which offers dedicated tracepoint\n+``rte_eal_trace_pmu_event()``.\n+\n+Refer to :doc:`../prog_guide/trace_lib` for more details.\n+\n Profiling on x86\n ----------------\n \ndiff --git a/doc/guides/prog_guide/trace_lib.rst b/doc/guides/prog_guide/trace_lib.rst\nindex 9a8f38073d..a8e97ee1ec 100644\n--- a/doc/guides/prog_guide/trace_lib.rst\n+++ b/doc/guides/prog_guide/trace_lib.rst\n@@ -46,6 +46,7 @@ DPDK tracing library features\n trace format and is compatible with ``LTTng``.\n For detailed information, refer to\n `Common Trace Format <https://diamon.org/ctf/>`_.\n+- Support reading PMU events on ARM64 and x86-64 (Intel)\n \n How to add a tracepoint?\n ------------------------\n@@ -137,6 +138,37 @@ the user must use ``RTE_TRACE_POINT_FP`` instead of ``RTE_TRACE_POINT``.\n ``RTE_TRACE_POINT_FP`` is compiled out by default and it can be enabled using\n the ``enable_trace_fp`` option for meson build.\n \n+PMU tracepoint\n+--------------\n+\n+Performance measurement unit (PMU) event values can be read from hardware\n+registers using predefined ``rte_pmu_read`` tracepoint.\n+\n+Tracing is enabled via ``--trace`` EAL option by passing both expression\n+matching PMU tracepoint name i.e ``lib.eal.pmu.read`` and expression\n+``e=ev1[,ev2,...]`` matching particular events::\n+\n+ --trace='.*pmu.read\\|e=cpu_cycles,l1d_cache'\n+\n+Event names are available under ``/sys/bus/event_source/devices/PMU/events``\n+directory, where ``PMU`` is a placeholder for either a ``cpu`` or a directory\n+containing ``cpus``.\n+\n+In contrary to other tracepoints this does not need any extra variables\n+added to source files. Instead, caller passes index which follows the order of\n+events specified via ``--trace`` parameter. In the following example index ``0``\n+corresponds to ``cpu_cyclces`` while index ``1`` corresponds to ``l1d_cache``.\n+\n+.. code-block:: c\n+\n+ ...\n+ rte_eal_trace_pmu_read(0);\n+ rte_eal_trace_pmu_read(1);\n+ ...\n+\n+PMU tracing support must be explicitly enabled using the ``enable_trace_fp``\n+option for meson build.\n+\n Event record mode\n -----------------\n \ndiff --git a/lib/eal/common/eal_common_trace.c b/lib/eal/common/eal_common_trace.c\nindex 5caaac8e59..3631d0032b 100644\n--- a/lib/eal/common/eal_common_trace.c\n+++ b/lib/eal/common/eal_common_trace.c\n@@ -11,6 +11,9 @@\n #include <rte_errno.h>\n #include <rte_lcore.h>\n #include <rte_per_lcore.h>\n+#ifdef RTE_EXEC_ENV_LINUX\n+#include <rte_pmu.h>\n+#endif\n #include <rte_string_fns.h>\n \n #include \"eal_trace.h\"\n@@ -71,8 +74,13 @@ eal_trace_init(void)\n \t\tgoto free_meta;\n \n \t/* Apply global configurations */\n-\tSTAILQ_FOREACH(arg, &trace.args, next)\n+\tSTAILQ_FOREACH(arg, &trace.args, next) {\n \t\ttrace_args_apply(arg->val);\n+#ifdef RTE_EXEC_ENV_LINUX\n+\t\tif (rte_pmu_init() == 0)\n+\t\t\trte_pmu_add_events_by_pattern(arg->val);\n+#endif\n+\t}\n \n \trte_trace_mode_set(trace.mode);\n \n@@ -88,6 +96,9 @@ eal_trace_init(void)\n void\n eal_trace_fini(void)\n {\n+#ifdef RTE_EXEC_ENV_LINUX\n+\trte_pmu_fini();\n+#endif\n \ttrace_mem_free();\n \ttrace_metadata_destroy();\n \teal_trace_args_free();\ndiff --git a/lib/eal/common/eal_common_trace_points.c b/lib/eal/common/eal_common_trace_points.c\nindex 0b0b254615..1e46ce549a 100644\n--- a/lib/eal/common/eal_common_trace_points.c\n+++ b/lib/eal/common/eal_common_trace_points.c\n@@ -75,3 +75,8 @@ RTE_TRACE_POINT_REGISTER(rte_eal_trace_intr_enable,\n \tlib.eal.intr.enable)\n RTE_TRACE_POINT_REGISTER(rte_eal_trace_intr_disable,\n \tlib.eal.intr.disable)\n+\n+#ifdef RTE_EXEC_ENV_LINUX\n+RTE_TRACE_POINT_REGISTER(rte_eal_trace_pmu_read,\n+\tlib.eal.pmu.read)\n+#endif\ndiff --git a/lib/eal/include/rte_eal_trace.h b/lib/eal/include/rte_eal_trace.h\nindex 5ef4398230..afb459b198 100644\n--- a/lib/eal/include/rte_eal_trace.h\n+++ b/lib/eal/include/rte_eal_trace.h\n@@ -17,6 +17,9 @@ extern \"C\" {\n \n #include <rte_alarm.h>\n #include <rte_interrupts.h>\n+#ifdef RTE_EXEC_ENV_LINUX\n+#include <rte_pmu.h>\n+#endif\n #include <rte_trace_point.h>\n \n #include \"eal_interrupts.h\"\n@@ -279,6 +282,16 @@ RTE_TRACE_POINT(\n \trte_trace_point_emit_string(cpuset);\n )\n \n+#ifdef RTE_EXEC_ENV_LINUX\n+RTE_TRACE_POINT_FP(\n+\trte_eal_trace_pmu_read,\n+\tRTE_TRACE_POINT_ARGS(unsigned int index),\n+\tuint64_t val;\n+\tval = rte_pmu_read(index);\n+\trte_trace_point_emit_u64(val);\n+)\n+#endif\n+\n #ifdef __cplusplus\n }\n #endif\ndiff --git a/lib/eal/meson.build b/lib/eal/meson.build\nindex 056beb9461..f5865dbcd9 100644\n--- a/lib/eal/meson.build\n+++ b/lib/eal/meson.build\n@@ -26,6 +26,9 @@ deps += ['kvargs']\n if not is_windows\n deps += ['telemetry']\n endif\n+if is_linux\n+ deps += ['pmu']\n+endif\n if dpdk_conf.has('RTE_USE_LIBBSD')\n ext_deps += libbsd\n endif\ndiff --git a/lib/eal/version.map b/lib/eal/version.map\nindex 7ad12a7dc9..eddb45bebf 100644\n--- a/lib/eal/version.map\n+++ b/lib/eal/version.map\n@@ -440,6 +440,9 @@ EXPERIMENTAL {\n \trte_thread_detach;\n \trte_thread_equal;\n \trte_thread_join;\n+\n+\t# added in 23.03\n+\t__rte_eal_trace_pmu_read; # WINDOWS_NO_EXPORT\n };\n \n INTERNAL {\ndiff --git a/lib/pmu/rte_pmu.c b/lib/pmu/rte_pmu.c\nindex 4cf3161155..ae880c72b7 100644\n--- a/lib/pmu/rte_pmu.c\n+++ b/lib/pmu/rte_pmu.c\n@@ -402,6 +402,67 @@ rte_pmu_add_event(const char *name)\n \treturn event->index;\n }\n \n+static int\n+add_events(const char *pattern)\n+{\n+\tchar *token, *copy;\n+\tint ret;\n+\n+\tcopy = strdup(pattern);\n+\tif (copy == NULL)\n+\t\treturn -ENOMEM;\n+\n+\ttoken = strtok(copy, \",\");\n+\twhile (token) {\n+\t\tret = rte_pmu_add_event(token);\n+\t\tif (ret < 0)\n+\t\t\tbreak;\n+\n+\t\ttoken = strtok(NULL, \",\");\n+\t}\n+\n+\tfree(copy);\n+\n+\treturn ret >= 0 ? 0 : ret;\n+}\n+\n+int\n+rte_pmu_add_events_by_pattern(const char *pattern)\n+{\n+\tregmatch_t rmatch;\n+\tchar buf[BUFSIZ];\n+\tunsigned int num;\n+\tregex_t reg;\n+\tint ret;\n+\n+\t/* events are matched against occurrences of e=ev1[,ev2,..] pattern */\n+\tret = regcomp(®, \"e=([_[:alnum:]-],?)+\", REG_EXTENDED);\n+\tif (ret)\n+\t\treturn -EINVAL;\n+\n+\tfor (;;) {\n+\t\tif (regexec(®, pattern, 1, &rmatch, 0))\n+\t\t\tbreak;\n+\n+\t\tnum = rmatch.rm_eo - rmatch.rm_so;\n+\t\tif (num > sizeof(buf))\n+\t\t\tnum = sizeof(buf);\n+\n+\t\t/* skip e= pattern prefix */\n+\t\tmemcpy(buf, pattern + rmatch.rm_so + 2, num - 2);\n+\t\tbuf[num - 2] = '\\0';\n+\t\tret = add_events(buf);\n+\t\tif (ret)\n+\t\t\tbreak;\n+\n+\t\tpattern += rmatch.rm_eo;\n+\t}\n+\n+\tregfree(®);\n+\n+\treturn ret;\n+}\n+\n int\n rte_pmu_init(void)\n {\ndiff --git a/lib/pmu/rte_pmu.h b/lib/pmu/rte_pmu.h\nindex 0f7004c31c..0f6250e81f 100644\n--- a/lib/pmu/rte_pmu.h\n+++ b/lib/pmu/rte_pmu.h\n@@ -169,6 +169,20 @@ __rte_experimental\n int\n rte_pmu_add_event(const char *name);\n \n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice\n+ *\n+ * Add events matching pattern to the group of enabled events.\n+ *\n+ * @param pattern\n+ * Pattern e=ev1[,ev2,...] matching events, where evX is a placeholder for an event listed under\n+ * /sys/bus/event_source/devices/pmu/events.\n+ */\n+__rte_experimental\n+int\n+rte_pmu_add_events_by_pattern(const char *pattern);\n+\n /**\n * @warning\n * @b EXPERIMENTAL: this API may change without prior notice\ndiff --git a/lib/pmu/version.map b/lib/pmu/version.map\nindex 50fb0f354e..20a27d085c 100644\n--- a/lib/pmu/version.map\n+++ b/lib/pmu/version.map\n@@ -8,6 +8,7 @@ EXPERIMENTAL {\n \tper_lcore__event_group;\n \trte_pmu;\n \trte_pmu_add_event;\n+\trte_pmu_add_events_by_pattern;\n \trte_pmu_fini;\n \trte_pmu_init;\n \trte_pmu_read;\n", "prefixes": [ "v7", "4/4" ] }{ "id": 122869, "url": "