get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 120262,
    "url": "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(&reg, \"e=([_[:alnum:]-],?)+\", REG_EXTENDED))\n+\t\treturn;\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] = '\\0';\n+\t\tadd_events(buf);\n+\n+\t\tpattern += rmatch.rm_eo;\n+\t}\n+\n+\tregfree(&reg);\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"
    ]
}