get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 122869,
    "url": "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(&reg, \"e=([_[:alnum:]-],?)+\", REG_EXTENDED);\n+\tif (ret)\n+\t\treturn -EINVAL;\n+\n+\tfor (;;) {\n+\t\tif (regexec(&reg, 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(&reg);\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"
    ]
}