Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/120262/?format=api
http://patches.dpdk.org/api/patches/120262/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20221129092821.1304853-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": "<20221129092821.1304853-5-tduszynski@marvell.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20221129092821.1304853-5-tduszynski@marvell.com", "date": "2022-11-29T09:28:21", "name": "[v3,4/4] eal: add PMU support to tracing library", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "46ee7eb8a80d15bb7350b7f289eca620ff46b7a3", "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/20221129092821.1304853-5-tduszynski@marvell.com/mbox/", "series": [ { "id": 25916, "url": "http://patches.dpdk.org/api/series/25916/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=25916", "date": "2022-11-29T09:28:17", "name": "add support for self monitoring", "version": 3, "mbox": "http://patches.dpdk.org/series/25916/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/120262/comments/", "check": "fail", "checks": "http://patches.dpdk.org/api/patches/120262/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 54028A0093;\n\tTue, 29 Nov 2022 10:29:00 +0100 (CET)", "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id AA50442D0B;\n\tTue, 29 Nov 2022 10:28:45 +0100 (CET)", "from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com\n [67.231.148.174])\n by mails.dpdk.org (Postfix) with ESMTP id 34BFA42D14\n for <dev@dpdk.org>; Tue, 29 Nov 2022 10:28:43 +0100 (CET)", "from pps.filterd (m0045849.ppops.net [127.0.0.1])\n by mx0a-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id\n 2AT3Nr8t005707; Tue, 29 Nov 2022 01:28:42 -0800", "from dc5-exch02.marvell.com ([199.233.59.182])\n by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3m5a5098cy-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);\n Tue, 29 Nov 2022 01:28:42 -0800", "from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.18;\n Tue, 29 Nov 2022 01:28:39 -0800", "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.2 via Frontend\n Transport; Tue, 29 Nov 2022 01:28:39 -0800", "from localhost.localdomain (unknown [10.28.34.39])\n by maili.marvell.com (Postfix) with ESMTP id 364953F7051;\n Tue, 29 Nov 2022 01:28:37 -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=1vE2AVQnCCgzoDRlqx/OsDv9KQoXlYwQYjGW1geXOsI=;\n b=TlGRoZ9UjzIw3JC7H18jyZ55nyk/uwONOCXuEgI05+XX4/yOEHGR58iSio+YqCnPGjNc\n y3Km+ND9XY1uctGV5+MbnjRUY1PqiJFjJCf+eW+W9b6P4lVTYWKPQf/hbPaUOKsBk1rV\n EK2YqNrDUJ2o/pi6qQk4EiWtuwK/0nSUro9WN/qm19SckzHIgOjB6H88l9KJgzh3hRZV\n /27EF+kAXlzj5xnIS4fI5rLmNL4kyoB6pZGwzfn66ff43NTDzlePlpHlNuyEdIqbS58C\n t462hC8CVLI5ZlrgFIp3EUbs+yeO3QDzfoDMUrtwQJIB0Wpbhu40LTbhRod/jYD6YAv1 qQ==", "From": "Tomasz Duszynski <tduszynski@marvell.com>", "To": "<dev@dpdk.org>, Jerin Jacob <jerinj@marvell.com>, Sunil Kumar Kori\n <skori@marvell.com>", "CC": "<thomas@monjalon.net>, Tomasz Duszynski <tduszynski@marvell.com>", "Subject": "[PATCH v3 4/4] eal: add PMU support to tracing library", "Date": "Tue, 29 Nov 2022 10:28:21 +0100", "Message-ID": "<20221129092821.1304853-5-tduszynski@marvell.com>", "X-Mailer": "git-send-email 2.25.1", "In-Reply-To": "<20221129092821.1304853-1-tduszynski@marvell.com>", "References": "<20221121121121.3917194-1-tduszynski@marvell.com>\n <20221129092821.1304853-1-tduszynski@marvell.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Content-Type": "text/plain", "X-Proofpoint-ORIG-GUID": "db0t1p1LLJ6W4ToVhIoiMtAo87H_NaLj", "X-Proofpoint-GUID": "db0t1p1LLJ6W4ToVhIoiMtAo87H_NaLj", "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.219,Aquarius:18.0.895,Hydra:6.0.545,FMLib:17.11.122.1\n definitions=2022-11-29_06,2022-11-28_02,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 | 4 ++\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_points.c | 3 ++\n lib/eal/common/rte_pmu.c | 63 ++++++++++++++++++++++++\n lib/eal/include/rte_eal_trace.h | 11 +++++\n lib/eal/version.map | 1 +\n 7 files changed, 119 insertions(+)", "diff": "diff --git a/app/test/test_trace_perf.c b/app/test/test_trace_perf.c\nindex 46ae7d8074..4851b6852f 100644\n--- a/app/test/test_trace_perf.c\n+++ b/app/test/test_trace_perf.c\n@@ -114,6 +114,8 @@ 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+/* 0 corresponds first event passed via --trace= */\n+#define READ_PMU rte_eal_trace_pmu_read(0)\n \n WORKER_DEFINE(GENERIC_VOID)\n WORKER_DEFINE(GENERIC_U64)\n@@ -122,6 +124,7 @@ WORKER_DEFINE(GENERIC_FLOAT)\n WORKER_DEFINE(GENERIC_DOUBLE)\n WORKER_DEFINE(GENERIC_STR)\n WORKER_DEFINE(VOID_FP)\n+WORKER_DEFINE(READ_PMU)\n \n static void\n run_test(const char *str, lcore_function_t f, struct test_data *data, size_t sz)\n@@ -174,6 +177,7 @@ 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+\trun_test(\"read_pmu\", worker_fn_READ_PMU, data, sz);\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 8fc1b20cab..977800ea01 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..9a845fd86f 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 (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_points.c b/lib/eal/common/eal_common_trace_points.c\nindex 0b0b254615..de918ca618 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,6 @@ 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+RTE_TRACE_POINT_REGISTER(rte_eal_trace_pmu_read,\n+\tlib.eal.pmu.read)\ndiff --git a/lib/eal/common/rte_pmu.c b/lib/eal/common/rte_pmu.c\nindex 6763005903..db8f6f43c3 100644\n--- a/lib/eal/common/rte_pmu.c\n+++ b/lib/eal/common/rte_pmu.c\n@@ -20,6 +20,7 @@\n #include <rte_tailq.h>\n \n #include \"pmu_private.h\"\n+#include \"eal_trace.h\"\n \n #define EVENT_SOURCE_DEVICES_PATH \"/sys/bus/event_source/devices\"\n \n@@ -404,11 +405,70 @@ rte_pmu_add_event(const char *name)\n \treturn event->index;\n }\n \n+static void\n+add_events(const char *pattern)\n+{\n+\tchar *token, *copy;\n+\tint ret;\n+\n+\tcopy = strdup(pattern);\n+\tif (!copy)\n+\t\treturn;\n+\n+\ttoken = strtok(copy, \",\");\n+\twhile (token) {\n+\t\tret = rte_pmu_add_event(token);\n+\t\tif (ret < 0)\n+\t\t\tRTE_LOG(ERR, EAL, \"failed to add %s event\\n\", token);\n+\n+\t\ttoken = strtok(NULL, \",\");\n+\t}\n+\n+\tfree(copy);\n+}\n+\n+static void\n+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+\n+\t/* events are matched against occurrences of e=ev1[,ev2,..] pattern */\n+\tif (regcomp(®, \"e=([_[:alnum:]-],?)+\", REG_EXTENDED))\n+\t\treturn;\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] = '\\0';\n+\t\tadd_events(buf);\n+\n+\t\tpattern += rmatch.rm_eo;\n+\t}\n+\n+\tregfree(®);\n+}\n+\n void\n eal_pmu_init(void)\n {\n+\tstruct trace_arg *arg;\n+\tstruct trace *trace;\n \tint ret;\n \n+\ttrace = trace_obj_get();\n+\tif (!trace)\n+\t\tRTE_LOG(WARNING, EAL, \"tracing not initialized\\n\");\n+\n \trte_pmu = rte_calloc(NULL, 1, sizeof(*rte_pmu), RTE_CACHE_LINE_SIZE);\n \tif (!rte_pmu) {\n \t\tRTE_LOG(ERR, EAL, \"failed to alloc PMU\\n\");\n@@ -430,6 +490,9 @@ eal_pmu_init(void)\n \t\tgoto out;\n \t}\n \n+\tSTAILQ_FOREACH(arg, &trace->args, next)\n+\t\tadd_events_by_pattern(arg->val);\n+\n \treturn;\n out:\n \tfree(rte_pmu->name);\ndiff --git a/lib/eal/include/rte_eal_trace.h b/lib/eal/include/rte_eal_trace.h\nindex 5ef4398230..2a10f63e97 100644\n--- a/lib/eal/include/rte_eal_trace.h\n+++ b/lib/eal/include/rte_eal_trace.h\n@@ -17,6 +17,7 @@ extern \"C\" {\n \n #include <rte_alarm.h>\n #include <rte_interrupts.h>\n+#include <rte_pmu.h>\n #include <rte_trace_point.h>\n \n #include \"eal_interrupts.h\"\n@@ -279,6 +280,16 @@ RTE_TRACE_POINT(\n \trte_trace_point_emit_string(cpuset);\n )\n \n+/* PMU */\n+RTE_TRACE_POINT_FP(\n+\trte_eal_trace_pmu_read,\n+\tRTE_TRACE_POINT_ARGS(int index),\n+\tuint64_t val;\n+\trte_trace_point_emit_int(index);\n+\tval = rte_pmu_read(index);\n+\trte_trace_point_emit_u64(val);\n+)\n+\n #ifdef __cplusplus\n }\n #endif\ndiff --git a/lib/eal/version.map b/lib/eal/version.map\nindex 9225f46f67..73803f9601 100644\n--- a/lib/eal/version.map\n+++ b/lib/eal/version.map\n@@ -442,6 +442,7 @@ EXPERIMENTAL {\n \trte_thread_join;\n \n \t# added in 23.03\n+\t__rte_eal_trace_pmu_read; # WINDOWS_NO_EXPORT\n \trte_pmu; # WINDOWS_NO_EXPORT\n \trte_pmu_add_event; # WINDOWS_NO_EXPORT\n \trte_pmu_read; # WINDOWS_NO_EXPORT\n", "prefixes": [ "v3", "4/4" ] }{ "id": 120262, "url": "