get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 122957,
    "url": "http://patchwork.dpdk.org/api/patches/122957/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20230202134329.539625-3-rjarry@redhat.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": "<20230202134329.539625-3-rjarry@redhat.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230202134329.539625-3-rjarry@redhat.com",
    "date": "2023-02-02T13:43:25",
    "name": "[v8,2/5] eal: report applications lcore usage",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "4546cd9daaa5d6292f8d7336dfaeefcabf122f1c",
    "submitter": {
        "id": 2850,
        "url": "http://patchwork.dpdk.org/api/people/2850/?format=api",
        "name": "Robin Jarry",
        "email": "rjarry@redhat.com"
    },
    "delegate": {
        "id": 24651,
        "url": "http://patchwork.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20230202134329.539625-3-rjarry@redhat.com/mbox/",
    "series": [
        {
            "id": 26762,
            "url": "http://patchwork.dpdk.org/api/series/26762/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=26762",
            "date": "2023-02-02T13:43:23",
            "name": "lcore telemetry improvements",
            "version": 8,
            "mbox": "http://patchwork.dpdk.org/series/26762/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/122957/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/122957/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 D1C2C41BAE;\n\tThu,  2 Feb 2023 14:44:06 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 6770D42FD6;\n\tThu,  2 Feb 2023 14:44:03 +0100 (CET)",
            "from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n by mails.dpdk.org (Postfix) with ESMTP id C36CA42FD6\n for <dev@dpdk.org>; Thu,  2 Feb 2023 14:44:01 +0100 (CET)",
            "from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com\n [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n us-mta-374-sBsIYZSJNmGMrp8JNXy0Uw-1; Thu, 02 Feb 2023 08:44:00 -0500",
            "from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com\n [10.11.54.2])\n (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n (No client certificate requested)\n by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E2D3885A588;\n Thu,  2 Feb 2023 13:43:59 +0000 (UTC)",
            "from ringo.home (unknown [10.39.208.27])\n by smtp.corp.redhat.com (Postfix) with ESMTP id DF4A4404CD80;\n Thu,  2 Feb 2023 13:43:58 +0000 (UTC)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1675345441;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=npeBlnkgUlvxUMKJTu+mHcsIzU7Nqt90vIj1N93519Y=;\n b=jKMVBsge5R+dUuso07MAqZWh2FDwuhSYmmw36DlbA9Xu/3BtPcNvsP66AFJaeq+8Nwosm2\n aiv0C2gP3ilQt7JZXd+5v0WJAhfBe3Bd/jYJN8UKSIh8GWz6QS+AZlm9SjWN5Yj8dS/mtl\n 740OWd8re8Z9reTmzE6aIyeZ/TzOW1I=",
        "X-MC-Unique": "sBsIYZSJNmGMrp8JNXy0Uw-1",
        "From": "Robin Jarry <rjarry@redhat.com>",
        "To": "dev@dpdk.org",
        "Cc": "Robin Jarry <rjarry@redhat.com>,\n =?utf-8?q?Morten_Br=C3=B8rup?= <mb@smartsharesystems.com>,\n Kevin Laatz <kevin.laatz@intel.com>",
        "Subject": "[PATCH v8 2/5] eal: report applications lcore usage",
        "Date": "Thu,  2 Feb 2023 14:43:25 +0100",
        "Message-Id": "<20230202134329.539625-3-rjarry@redhat.com>",
        "In-Reply-To": "<20230202134329.539625-1-rjarry@redhat.com>",
        "References": "<20221123102612.1688865-1-rjarry@redhat.com>\n <20230202134329.539625-1-rjarry@redhat.com>",
        "MIME-Version": "1.0",
        "X-Scanned-By": "MIMEDefang 3.1 on 10.11.54.2",
        "X-Mimecast-Spam-Score": "0",
        "X-Mimecast-Originator": "redhat.com",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "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": "Allow applications to register a callback that will be invoked in\nrte_lcore_dump() and when requesting lcore info in the telemetry API.\n\nThe callback is expected to return the number of TSC cycles that have\npassed since application start and the number of these cycles that were\nspent doing busy work.\n\nSigned-off-by: Robin Jarry <rjarry@redhat.com>\nAcked-by: Morten Brørup <mb@smartsharesystems.com>\nReviewed-by: Kevin Laatz <kevin.laatz@intel.com>\n---\n\nNotes:\n    v7 -> v8: no change\n\n doc/guides/rel_notes/release_23_03.rst |  7 ++++\n lib/eal/common/eal_common_lcore.c      | 48 ++++++++++++++++++++++++--\n lib/eal/include/rte_lcore.h            | 35 +++++++++++++++++++\n lib/eal/version.map                    |  1 +\n 4 files changed, 89 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/doc/guides/rel_notes/release_23_03.rst b/doc/guides/rel_notes/release_23_03.rst\nindex 73f5d94e143d..f407dc3df7a8 100644\n--- a/doc/guides/rel_notes/release_23_03.rst\n+++ b/doc/guides/rel_notes/release_23_03.rst\n@@ -78,6 +78,13 @@ New Features\n     ``rte_event_dev_config::nb_single_link_event_port_queues`` parameter\n     required for eth_rx, eth_tx, crypto and timer eventdev adapters.\n \n+* **Added support for reporting lcore usage in applications.**\n+\n+  * The ``/eal/lcore/list`` and ``/eal/lcore/info`` telemetry endpoints have\n+    been added to provide information similar to ``rte_lcore_dump()``.\n+  * Applications can register a callback at startup via\n+    ``rte_lcore_register_usage_cb()`` to provide lcore usage information.\n+\n \n Removed Items\n -------------\ndiff --git a/lib/eal/common/eal_common_lcore.c b/lib/eal/common/eal_common_lcore.c\nindex f53fc17b4d04..bbb734098b42 100644\n--- a/lib/eal/common/eal_common_lcore.c\n+++ b/lib/eal/common/eal_common_lcore.c\n@@ -2,6 +2,7 @@\n  * Copyright(c) 2010-2014 Intel Corporation\n  */\n \n+#include <inttypes.h>\n #include <stdlib.h>\n #include <string.h>\n \n@@ -437,20 +438,49 @@ lcore_role_str(enum rte_lcore_role_t role)\n \t}\n }\n \n+static rte_lcore_usage_cb lcore_usage_cb;\n+\n+void\n+rte_lcore_register_usage_cb(rte_lcore_usage_cb cb)\n+{\n+\tlcore_usage_cb = cb;\n+}\n+\n static int\n lcore_dump_cb(unsigned int lcore_id, void *arg)\n {\n \tstruct rte_config *cfg = rte_eal_get_configuration();\n \tchar cpuset[RTE_CPU_AFFINITY_STR_LEN];\n+\tstruct rte_lcore_usage usage;\n+\trte_lcore_usage_cb usage_cb;\n+\tchar *usage_str = NULL;\n \tFILE *f = arg;\n \tint ret;\n \n+\t/* The callback may not set all the fields in the structure, so clear it here. */\n+\tmemset(&usage, 0, sizeof(usage));\n+\t/*\n+\t * Guard against concurrent modification of lcore_usage_cb.\n+\t * rte_lcore_register_usage_cb() should only be called once at application init\n+\t * but nothing prevents and application to reset the callback to NULL.\n+\t */\n+\tusage_cb = lcore_usage_cb;\n+\tif (usage_cb != NULL && usage_cb(lcore_id, &usage) == 0) {\n+\t\tif (asprintf(&usage_str, \", busy cycles %\"PRIu64\"/%\"PRIu64,\n+\t\t\t\tusage.busy_cycles, usage.total_cycles) < 0) {\n+\t\t\treturn -ENOMEM;\n+\t\t}\n+\t}\n \tret = eal_thread_dump_affinity(&lcore_config[lcore_id].cpuset, cpuset,\n \t\tsizeof(cpuset));\n-\tfprintf(f, \"lcore %u, socket %u, role %s, cpuset %s%s\\n\", lcore_id,\n+\tfprintf(f, \"lcore %u, socket %u, role %s, cpuset %s%s%s\\n\", lcore_id,\n \t\trte_lcore_to_socket_id(lcore_id),\n \t\tlcore_role_str(cfg->lcore_role[lcore_id]),\n-\t\tcpuset, ret == 0 ? \"\" : \"...\");\n+\t\tcpuset, ret == 0 ? \"\" : \"...\",\n+\t\tusage_str ? usage_str : \"\");\n+\n+\tfree(usage_str);\n+\n \treturn 0;\n }\n \n@@ -489,7 +519,9 @@ lcore_telemetry_info_cb(unsigned int lcore_id, void *arg)\n {\n \tstruct rte_config *cfg = rte_eal_get_configuration();\n \tstruct lcore_telemetry_info *info = arg;\n+\tstruct rte_lcore_usage usage;\n \tstruct rte_tel_data *cpuset;\n+\trte_lcore_usage_cb usage_cb;\n \tunsigned int cpu;\n \n \tif (info->lcore_id != lcore_id)\n@@ -508,6 +540,18 @@ lcore_telemetry_info_cb(unsigned int lcore_id, void *arg)\n \t\t\trte_tel_data_add_array_int(cpuset, cpu);\n \t}\n \trte_tel_data_add_dict_container(info->d, \"cpuset\", cpuset, 0);\n+\t/* The callback may not set all the fields in the structure, so clear it here. */\n+\tmemset(&usage, 0, sizeof(usage));\n+\t/*\n+\t * Guard against concurrent modification of lcore_usage_cb.\n+\t * rte_lcore_register_usage_cb() should only be called once at application init\n+\t * but nothing prevents and application to reset the callback to NULL.\n+\t */\n+\tusage_cb = lcore_usage_cb;\n+\tif (usage_cb != NULL && usage_cb(lcore_id, &usage) == 0) {\n+\t\trte_tel_data_add_dict_u64(info->d, \"total_cycles\", usage.total_cycles);\n+\t\trte_tel_data_add_dict_u64(info->d, \"busy_cycles\", usage.busy_cycles);\n+\t}\n \n \treturn 0;\n }\ndiff --git a/lib/eal/include/rte_lcore.h b/lib/eal/include/rte_lcore.h\nindex 9c7865052100..b1c8afb05d28 100644\n--- a/lib/eal/include/rte_lcore.h\n+++ b/lib/eal/include/rte_lcore.h\n@@ -328,6 +328,41 @@ typedef int (*rte_lcore_iterate_cb)(unsigned int lcore_id, void *arg);\n int\n rte_lcore_iterate(rte_lcore_iterate_cb cb, void *arg);\n \n+/**\n+ * lcore usage statistics.\n+ */\n+struct rte_lcore_usage {\n+\t/** The total amount of time since application start, in TSC cycles. */\n+\tuint64_t total_cycles;\n+\t/** The amount of busy time since application start, in TSC cycles. */\n+\tuint64_t busy_cycles;\n+};\n+\n+/**\n+ * Callback to allow applications to report lcore usage.\n+ *\n+ * @param [in] lcore_id\n+ *   The lcore to consider.\n+ * @param [out] usage\n+ *   Counters representing this lcore usage. This can never be NULL.\n+ * @return\n+ *   - 0 if fields in usage were updated successfully. The fields that the\n+ *       application does not support must not be modified.\n+ *   - a negative value if the information is not available or if any error occurred.\n+ */\n+typedef int (*rte_lcore_usage_cb)(unsigned int lcore_id, struct rte_lcore_usage *usage);\n+\n+/**\n+ * Register a callback from an application to be called in rte_lcore_dump() and\n+ * the /eal/lcore/info telemetry endpoint handler. Applications are expected to\n+ * report lcore usage statistics via this callback.\n+ *\n+ * @param cb\n+ *   The callback function.\n+ */\n+__rte_experimental\n+void rte_lcore_register_usage_cb(rte_lcore_usage_cb cb);\n+\n /**\n  * List all lcores.\n  *\ndiff --git a/lib/eal/version.map b/lib/eal/version.map\nindex 6523102157e2..1f70caac7b9c 100644\n--- a/lib/eal/version.map\n+++ b/lib/eal/version.map\n@@ -442,6 +442,7 @@ EXPERIMENTAL {\n \n \t# added in 23.03\n \trte_thread_set_name;\n+\trte_lcore_register_usage_cb;\n };\n \n INTERNAL {\n",
    "prefixes": [
        "v8",
        "2/5"
    ]
}