get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 74962,
    "url": "http://patches.dpdk.org/api/patches/74962/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200728191330.20864-9-stephen@networkplumber.org/",
    "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": "<20200728191330.20864-9-stephen@networkplumber.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200728191330.20864-9-stephen@networkplumber.org",
    "date": "2020-07-28T19:13:30",
    "name": "[v5,8/8] app/proc-info: provide way to request info on owned ports",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "fc545e7292883340e75649c1bb38f26f38e9cea9",
    "submitter": {
        "id": 27,
        "url": "http://patches.dpdk.org/api/people/27/?format=api",
        "name": "Stephen Hemminger",
        "email": "stephen@networkplumber.org"
    },
    "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/20200728191330.20864-9-stephen@networkplumber.org/mbox/",
    "series": [
        {
            "id": 11371,
            "url": "http://patches.dpdk.org/api/series/11371/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=11371",
            "date": "2020-07-28T19:13:22",
            "name": "app/proc-info enhancements",
            "version": 5,
            "mbox": "http://patches.dpdk.org/series/11371/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/74962/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/74962/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id DDA91A052B;\n\tTue, 28 Jul 2020 21:14:56 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 39A781C0CE;\n\tTue, 28 Jul 2020 21:14:03 +0200 (CEST)",
            "from mail-pl1-f194.google.com (mail-pl1-f194.google.com\n [209.85.214.194]) by dpdk.org (Postfix) with ESMTP id 543F71C0B4\n for <dev@dpdk.org>; Tue, 28 Jul 2020 21:13:54 +0200 (CEST)",
            "by mail-pl1-f194.google.com with SMTP id q17so10429609pls.9\n for <dev@dpdk.org>; Tue, 28 Jul 2020 12:13:54 -0700 (PDT)",
            "from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127])\n by smtp.gmail.com with ESMTPSA id x66sm19045748pgb.12.2020.07.28.12.13.51\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 28 Jul 2020 12:13:52 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=networkplumber-org.20150623.gappssmtp.com; s=20150623;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=xcX9eNGEAnm0RHIiNky2usP0Kr61Z7Vlgzqb1yCT9/E=;\n b=FGwin6pwbA+wE2vb0h9Gpchm7VDsEd3GSqzT7dFLb6eSc+WxK4Pv54jCpVoVYZkUrZ\n VrJq4pJUoj8KuSEUy5I5fLNYaRRF/jjfmpj9joPejS/cPCZ+fD0GVeroMyrhnya9bY/g\n qWyNMBWX45gCTHW600W3qIwN5H6prNPgVe1/AA/0Bqj1/mPy/751+qsywHDv62ZuXWjH\n lvioOefpYNrlIjbsz4FSctgyUBrdkcR76aA+c+N1mWDrnHT2THUkES1AqOzNqLInnZxo\n mq8TxssZ/LyrlP8z5DDH9cxfbMyzMnwawzUKcFFcoYG8C/gbZo4skLbB2o94/fu+F8RP\n 7yWA==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20161025;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references:mime-version:content-transfer-encoding;\n bh=xcX9eNGEAnm0RHIiNky2usP0Kr61Z7Vlgzqb1yCT9/E=;\n b=XFzzWMZJDSf3gd3uWKrMrGkhpkuzhoTlYQB2PPLM+UdBfdVatmSdaYGKdNwgdFeXhF\n sQ6x33wjjaMvh4oiAqYk/v/avql0R1XeShztXEyunkep7UIMMOFEMlZCjuSrCMyYMDuN\n 76SztF62AV+C/zyKejXOZ7Yq2tmJPVyQk+/VXB+/vYwYlvlqMbHsv8MyJVh9PdEjDpDc\n 8V+KdJvPH740Yj7G4uIJouwWh9yHc4wP02NIpjt3L+0WOxAz7LNwwpfbt4hbmxwMvZjl\n sUrwAtNJWsLOjmfOu5M9nI/FAb8kwG7Wq0IzVfDkH0sylhwTDuKl6k0W5LSn4rTU8+X+\n uPuA==",
        "X-Gm-Message-State": "AOAM530Hdk4DovumaGQZBjYuFEnFNqZ7uHugCHebEA4R8UqtyhG8Szml\n omTeK5w12tAw9u1Z3/OqXhDpRGAqRoDI8w==",
        "X-Google-Smtp-Source": "\n ABdhPJwI9Yio+xq/1Awfu48Qd48P2eFHZYDNZ59Fz/pKJnQZCu6CTDJWRmfCmkaTHtFGsdxMhXZRSw==",
        "X-Received": "by 2002:a17:902:6b43:: with SMTP id\n g3mr18997469plt.303.1595963632991;\n Tue, 28 Jul 2020 12:13:52 -0700 (PDT)",
        "From": "Stephen Hemminger <stephen@networkplumber.org>",
        "To": "dev@dpdk.org",
        "Cc": "Stephen Hemminger <stephen@networkplumber.org>,\n Hemant Agrawal <hemant.agrawal@nxp.com>",
        "Date": "Tue, 28 Jul 2020 12:13:30 -0700",
        "Message-Id": "<20200728191330.20864-9-stephen@networkplumber.org>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20200728191330.20864-1-stephen@networkplumber.org>",
        "References": "<20200506193741.24117-1-stephen@networkplumber.org>\n <20200728191330.20864-1-stephen@networkplumber.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v5 8/8] app/proc-info: provide way to request\n\tinfo on owned ports",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "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": "There are cases where a port maybe owned by another (failsafe, netvsc,\nbond); but currently proc-info has no way to look at stats of those\nports. This patch provides way for the user to explicitly ask for these\nports.\n\nIf no portmask is given the output is unchanged; it only shows the\ntop level ports. If portmask requests a specific port it will be\nshown even if owned.\n\nIncrease the size of port mask variable to unsigned long to\nallow up to 64 ports to be handled on 64 bit architecture.\n\nThe device owner is also a useful thing to show in port info.\n\nSigned-off-by: Stephen Hemminger <stephen@networkplumber.org>\nAcked-by: Hemant Agrawal <hemant.agrawal@nxp.com>\n---\n app/proc-info/main.c | 92 ++++++++++++++++++++++++++------------------\n 1 file changed, 54 insertions(+), 38 deletions(-)",
    "diff": "diff --git a/app/proc-info/main.c b/app/proc-info/main.c\nindex 282af670d20a..f78cc0f59c74 100644\n--- a/app/proc-info/main.c\n+++ b/app/proc-info/main.c\n@@ -12,6 +12,7 @@\n #include <stdlib.h>\n #include <getopt.h>\n #include <unistd.h>\n+#include <strings.h>\n \n #include <rte_eal.h>\n #include <rte_common.h>\n@@ -46,7 +47,7 @@\n \tSTATS_BDR_FMT, s, w, STATS_BDR_FMT)\n \n /**< mask of enabled ports */\n-static uint32_t enabled_port_mask;\n+static unsigned long enabled_port_mask;\n /**< Enable stats. */\n static uint32_t enable_stats;\n /**< Enable xstats. */\n@@ -128,23 +129,17 @@ static int\n parse_portmask(const char *portmask)\n {\n \tchar *end = NULL;\n-\tunsigned long pm;\n \n \terrno = 0;\n \n \t/* parse hexadecimal string */\n-\tpm = strtoul(portmask, &end, 16);\n-\tif ((portmask[0] == '\\0') || (end == NULL) || (*end != '\\0') ||\n-\t\t(errno != 0)) {\n-\t\tprintf(\"%s ERROR parsing the port mask\\n\", __func__);\n+\tenabled_port_mask = strtoul(portmask, &end, 16);\n+\tif (portmask[0] == '\\0' || end == NULL || *end != '\\0' || errno != 0) {\n+\t\tfprintf(stderr, \"Invalid portmask '%s'\\n\", portmask);\n \t\treturn -1;\n \t}\n \n-\tif (pm == 0)\n-\t\treturn -1;\n-\n-\treturn pm;\n-\n+\treturn 0;\n }\n \n /*\n@@ -242,9 +237,7 @@ proc_info_parse_args(int argc, char **argv)\n \t\tswitch (opt) {\n \t\t/* portmask */\n \t\tcase 'p':\n-\t\t\tenabled_port_mask = parse_portmask(optarg);\n-\t\t\tif (enabled_port_mask == 0) {\n-\t\t\t\tprintf(\"invalid portmask\\n\");\n+\t\t\tif (parse_portmask(optarg) < 0) {\n \t\t\t\tproc_info_usage(prgname);\n \t\t\t\treturn -1;\n \t\t\t}\n@@ -702,19 +695,27 @@ show_security_context(uint16_t portid)\n static void\n show_port(void)\n {\n-\tuint16_t i = 0;\n-\tint ret = 0, j, k;\n+\tint i, ret, j, k;\n \n \tsnprintf(bdr_str, MAX_STRING_LEN, \" show - Port PMD \");\n \tSTATS_BDR_STR(10, bdr_str);\n \n-\tRTE_ETH_FOREACH_DEV(i) {\n+\tfor (i = 0; i < RTE_MAX_ETHPORTS; i++) {\n \t\tuint16_t mtu = 0;\n \t\tstruct rte_eth_link link;\n \t\tstruct rte_eth_dev_info dev_info;\n \t\tstruct rte_eth_rss_conf rss_conf;\n \t\tstruct rte_eth_fc_conf fc_conf;\n \t\tstruct rte_ether_addr mac;\n+\t\tstruct rte_eth_dev_owner owner;\n+\n+\t\t/* Skip if port is not in mask */\n+\t\tif ((enabled_port_mask & (1ul << i)) == 0)\n+\t\t\tcontinue;\n+\n+\t\t/* Skip if port is unused */\n+\t\tif (!rte_eth_dev_is_valid_port(i))\n+\t\t\tcontinue;\n \n \t\tmemset(&rss_conf, 0, sizeof(rss_conf));\n \n@@ -733,6 +734,11 @@ show_port(void)\n \t\t       dev_info.driver_name, dev_info.device->name,\n \t\t       rte_eth_dev_socket_id(i));\n \n+\t\tret = rte_eth_dev_owner_get(i, &owner);\n+\t\tif (ret == 0 && owner.id != RTE_ETH_DEV_NO_OWNER)\n+\t\t\tprintf(\"\\t --  owner %#\"PRIx64\":%s\\n\",\n+\t\t\t       owner.id, owner.name);\n+\n \t\tret = rte_eth_link_get(i, &link);\n \t\tif (ret < 0) {\n \t\t\tprintf(\"Link get failed (port %u): %s\\n\",\n@@ -1412,28 +1418,38 @@ main(int argc, char **argv)\n \tif (nb_ports == 0)\n \t\trte_exit(EXIT_FAILURE, \"No Ethernet ports - bye\\n\");\n \n-\t/* If no port mask was specified*/\n-\tif (enabled_port_mask == 0)\n-\t\tenabled_port_mask = 0xffff;\n+\t/* If no port mask was specified, then show non-owned ports */\n+\tif (enabled_port_mask == 0) {\n+\t\tRTE_ETH_FOREACH_DEV(i)\n+\t\t\tenabled_port_mask = 1ul << i;\n+\t}\n+\n+\tfor (i = 0; i < RTE_MAX_ETHPORTS; i++) {\n+\n+\t\t/* Skip if port is not in mask */\n+\t\tif ((enabled_port_mask & (1ul << i)) == 0)\n+\t\t\tcontinue;\n+\n+\t\t/* Skip if port is unused */\n+\t\tif (!rte_eth_dev_is_valid_port(i))\n+\t\t\tcontinue;\n+\n+\t\tif (enable_stats)\n+\t\t\tnic_stats_display(i);\n+\t\telse if (enable_xstats)\n+\t\t\tnic_xstats_display(i);\n+\t\telse if (reset_stats)\n+\t\t\tnic_stats_clear(i);\n+\t\telse if (reset_xstats)\n+\t\t\tnic_xstats_clear(i);\n+\t\telse if (enable_xstats_name)\n+\t\t\tnic_xstats_by_name_display(i, xstats_name);\n+\t\telse if (nb_xstats_ids > 0)\n+\t\t\tnic_xstats_by_ids_display(i, xstats_ids,\n+\t\t\t\t\t\t  nb_xstats_ids);\n+\t\telse if (enable_metrics)\n+\t\t\tmetrics_display(i);\n \n-\tRTE_ETH_FOREACH_DEV(i) {\n-\t\tif (enabled_port_mask & (1 << i)) {\n-\t\t\tif (enable_stats)\n-\t\t\t\tnic_stats_display(i);\n-\t\t\telse if (enable_xstats)\n-\t\t\t\tnic_xstats_display(i);\n-\t\t\telse if (reset_stats)\n-\t\t\t\tnic_stats_clear(i);\n-\t\t\telse if (reset_xstats)\n-\t\t\t\tnic_xstats_clear(i);\n-\t\t\telse if (enable_xstats_name)\n-\t\t\t\tnic_xstats_by_name_display(i, xstats_name);\n-\t\t\telse if (nb_xstats_ids > 0)\n-\t\t\t\tnic_xstats_by_ids_display(i, xstats_ids,\n-\t\t\t\t\t\tnb_xstats_ids);\n-\t\t\telse if (enable_metrics)\n-\t\t\t\tmetrics_display(i);\n-\t\t}\n \t}\n \n \t/* print port independent stats */\n",
    "prefixes": [
        "v5",
        "8/8"
    ]
}