get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 93725,
    "url": "http://patchwork.dpdk.org/api/patches/93725/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/cd120fa340cb9b842876fc3e313b82dbc33edcf3.1622548381.git.anatoly.burakov@intel.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": "<cd120fa340cb9b842876fc3e313b82dbc33edcf3.1622548381.git.anatoly.burakov@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/cd120fa340cb9b842876fc3e313b82dbc33edcf3.1622548381.git.anatoly.burakov@intel.com",
    "date": "2021-06-01T12:00:35",
    "name": "[v1,6/7] power: support monitoring multiple Rx queues",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "a4b9e22b3fb9c175fd798d6aa8987166886aca32",
    "submitter": {
        "id": 4,
        "url": "http://patchwork.dpdk.org/api/people/4/?format=api",
        "name": "Anatoly Burakov",
        "email": "anatoly.burakov@intel.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/cd120fa340cb9b842876fc3e313b82dbc33edcf3.1622548381.git.anatoly.burakov@intel.com/mbox/",
    "series": [
        {
            "id": 17191,
            "url": "http://patchwork.dpdk.org/api/series/17191/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=17191",
            "date": "2021-06-01T12:00:29",
            "name": "Enhancements for PMD power management",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/17191/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/93725/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/93725/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 ED98AA0524;\n\tTue,  1 Jun 2021 14:01:24 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id EF8E44111A;\n\tTue,  1 Jun 2021 14:00:53 +0200 (CEST)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n by mails.dpdk.org (Postfix) with ESMTP id 44BE440689\n for <dev@dpdk.org>; Tue,  1 Jun 2021 14:00:52 +0200 (CEST)",
            "from fmsmga001.fm.intel.com ([10.253.24.23])\n by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 01 Jun 2021 05:00:51 -0700",
            "from silpixa00399498.ir.intel.com (HELO\n silpixa00399498.ger.corp.intel.com) ([10.237.222.54])\n by fmsmga001.fm.intel.com with ESMTP; 01 Jun 2021 05:00:50 -0700"
        ],
        "IronPort-SDR": [
            "\n gP9kZ4BlKDP426F02Ixp4UbMBieq0Yi8mbBmRxIzVaaaV4xmeJEyFI5HKOEs1zhF4t3J19xJ2H\n jhAKe69bajBA==",
            "\n I9eKDRiv3RRS2Lc8My3B68qjnENer2hs4aLLy/ztcdKP0yE10142wLV6jEvZTnxXIsQbV5Q+LZ\n YIXdwHw1QQUw=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10001\"; a=\"203528496\"",
            "E=Sophos;i=\"5.83,239,1616482800\"; d=\"scan'208\";a=\"203528496\"",
            "E=Sophos;i=\"5.83,239,1616482800\"; d=\"scan'208\";a=\"549707033\""
        ],
        "X-ExtLoop1": "1",
        "From": "Anatoly Burakov <anatoly.burakov@intel.com>",
        "To": "dev@dpdk.org,\n\tDavid Hunt <david.hunt@intel.com>",
        "Cc": "ciara.loftus@intel.com",
        "Date": "Tue,  1 Jun 2021 12:00:35 +0000",
        "Message-Id": "\n <cd120fa340cb9b842876fc3e313b82dbc33edcf3.1622548381.git.anatoly.burakov@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<cover.1622548381.git.anatoly.burakov@intel.com>",
        "References": "<cover.1622548381.git.anatoly.burakov@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v1 6/7] power: support monitoring multiple Rx\n queues",
        "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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Use the new multi-monitor intrinsic to allow monitoring multiple ethdev\nRx queues while entering the energy efficient power state. The multi\nversion will be used unconditionally if supported, and the UMWAIT one\nwill only be used when multi-monitor is not supported by the hardware.\n\nSigned-off-by: Anatoly Burakov <anatoly.burakov@intel.com>\n---\n lib/power/rte_power_pmd_mgmt.c | 75 +++++++++++++++++++++++++++++++++-\n 1 file changed, 73 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/lib/power/rte_power_pmd_mgmt.c b/lib/power/rte_power_pmd_mgmt.c\nindex 60dd21a19c..9e0b8bdfaf 100644\n--- a/lib/power/rte_power_pmd_mgmt.c\n+++ b/lib/power/rte_power_pmd_mgmt.c\n@@ -147,6 +147,23 @@ queue_list_remove(struct pmd_core_cfg *cfg, const struct queue *q)\n \treturn 0;\n }\n \n+static inline int\n+get_monitor_addresses(struct pmd_core_cfg *cfg,\n+\t\tstruct rte_power_monitor_cond *pmc)\n+{\n+\tsize_t i;\n+\tint ret;\n+\n+\tfor (i = 0; i < cfg->n_queues; i++) {\n+\t\tstruct rte_power_monitor_cond *cur = &pmc[i];\n+\t\tstruct queue *q = &cfg->queues[i];\n+\t\tret = rte_eth_get_monitor_addr(q->portid, q->qid, cur);\n+\t\tif (ret < 0)\n+\t\t\treturn ret;\n+\t}\n+\treturn 0;\n+}\n+\n static void\n calc_tsc(void)\n {\n@@ -175,6 +192,48 @@ calc_tsc(void)\n \t}\n }\n \n+static uint16_t\n+clb_multiwait(uint16_t port_id, uint16_t qidx,\n+\t\tstruct rte_mbuf **pkts __rte_unused, uint16_t nb_rx,\n+\t\tuint16_t max_pkts __rte_unused, void *addr __rte_unused)\n+{\n+\tconst unsigned int lcore = rte_lcore_id();\n+\tconst struct queue q = {port_id, qidx};\n+\tconst bool empty = nb_rx == 0;\n+\tstruct pmd_core_cfg *q_conf;\n+\n+\tq_conf = &lcore_cfg[lcore];\n+\n+\t/* early exit */\n+\tif (likely(!empty)) {\n+\t\tq_conf->empty_poll_stats = 0;\n+\t} else {\n+\t\t/* do we care about this particular queue? */\n+\t\tif (!queue_is_power_save(q_conf, &q))\n+\t\t\treturn nb_rx;\n+\n+\t\t/*\n+\t\t * we can increment unconditionally here because if there were\n+\t\t * non-empty polls in other queues assigned to this core, we\n+\t\t * dropped the counter to zero anyway.\n+\t\t */\n+\t\tq_conf->empty_poll_stats++;\n+\t\tif (unlikely(q_conf->empty_poll_stats > EMPTYPOLL_MAX)) {\n+\t\t\tstruct rte_power_monitor_cond pmc[RTE_MAX_ETHPORTS];\n+\t\t\tuint16_t ret;\n+\n+\t\t\t/* gather all monitoring conditions */\n+\t\t\tret = get_monitor_addresses(q_conf, pmc);\n+\n+\t\t\tif (ret == 0)\n+\t\t\t\trte_power_monitor_multi(pmc,\n+\t\t\t\t\tq_conf->n_queues, UINT64_MAX);\n+\t\t}\n+\t}\n+\n+\treturn nb_rx;\n+}\n+\n static uint16_t\n clb_umwait(uint16_t port_id, uint16_t qidx, struct rte_mbuf **pkts __rte_unused,\n \t\tuint16_t nb_rx, uint16_t max_pkts __rte_unused,\n@@ -315,14 +374,19 @@ static int\n check_monitor(struct pmd_core_cfg *cfg, const struct queue *qdata)\n {\n \tstruct rte_power_monitor_cond dummy;\n+\tbool multimonitor_supported;\n \n \t/* check if rte_power_monitor is supported */\n \tif (!global_data.intrinsics_support.power_monitor) {\n \t\tRTE_LOG(DEBUG, POWER, \"Monitoring intrinsics are not supported\\n\");\n \t\treturn -ENOTSUP;\n \t}\n+\t/* check if multi-monitor is supported */\n+\tmultimonitor_supported =\n+\t\t\tglobal_data.intrinsics_support.power_monitor_multi;\n \n-\tif (cfg->n_queues > 0) {\n+\t/* if we're adding a new queue, do we support multiple queues? */\n+\tif (cfg->n_queues > 0 && !multimonitor_supported) {\n \t\tRTE_LOG(DEBUG, POWER, \"Monitoring multiple queues is not supported\\n\");\n \t\treturn -ENOTSUP;\n \t}\n@@ -338,6 +402,13 @@ check_monitor(struct pmd_core_cfg *cfg, const struct queue *qdata)\n \treturn 0;\n }\n \n+static inline rte_rx_callback_fn\n+get_monitor_callback(void)\n+{\n+\treturn global_data.intrinsics_support.power_monitor_multi ?\n+\t\tclb_multiwait : clb_umwait;\n+}\n+\n int\n rte_power_ethdev_pmgmt_queue_enable(unsigned int lcore_id, uint16_t port_id,\n \t\tuint16_t queue_id, enum rte_power_pmd_mgmt_type mode)\n@@ -385,7 +456,7 @@ rte_power_ethdev_pmgmt_queue_enable(unsigned int lcore_id, uint16_t port_id,\n \t\tif (ret < 0)\n \t\t\tgoto end;\n \n-\t\tclb = clb_umwait;\n+\t\tclb = get_monitor_callback();\n \t\tbreak;\n \tcase RTE_POWER_MGMT_TYPE_SCALE:\n \t\t/* check if we can add a new queue */\n",
    "prefixes": [
        "v1",
        "6/7"
    ]
}