get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 78644,
    "url": "https://patches.dpdk.org/api/patches/78644/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20200924053433.12648-8-stephen@networkplumber.org/",
    "project": {
        "id": 1,
        "url": "https://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": "<20200924053433.12648-8-stephen@networkplumber.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200924053433.12648-8-stephen@networkplumber.org",
    "date": "2020-09-24T05:34:33",
    "name": "[v6,7/7] app/proc-info: provide way to request info on owned ports",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "d5a9483868e1d8f7801210255fb0da134868316d",
    "submitter": {
        "id": 27,
        "url": "https://patches.dpdk.org/api/people/27/?format=api",
        "name": "Stephen Hemminger",
        "email": "stephen@networkplumber.org"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20200924053433.12648-8-stephen@networkplumber.org/mbox/",
    "series": [
        {
            "id": 12454,
            "url": "https://patches.dpdk.org/api/series/12454/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=12454",
            "date": "2020-09-24T05:34:26",
            "name": "app/proc-info: enhancements",
            "version": 6,
            "mbox": "https://patches.dpdk.org/series/12454/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/78644/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/78644/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 AA2CAA04B1;\n\tThu, 24 Sep 2020 07:35:38 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 180D31DD71;\n\tThu, 24 Sep 2020 07:34:58 +0200 (CEST)",
            "from mail-pf1-f194.google.com (mail-pf1-f194.google.com\n [209.85.210.194]) by dpdk.org (Postfix) with ESMTP id D919C1DD56\n for <dev@dpdk.org>; Thu, 24 Sep 2020 07:34:50 +0200 (CEST)",
            "by mail-pf1-f194.google.com with SMTP id b124so1161523pfg.13\n for <dev@dpdk.org>; Wed, 23 Sep 2020 22:34:50 -0700 (PDT)",
            "from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127])\n by smtp.gmail.com with ESMTPSA id v8sm1529609pgg.58.2020.09.23.22.34.48\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Wed, 23 Sep 2020 22:34:48 -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=saEJf9aDDP8G1rcyLHugLFE2Yje+nPwZEKkPL359VRQ=;\n b=rbXRYPuLaXBpmLh0zi27wdgxSScCutFx5g6YOybw7R4YBft8oS9RSoRSf9EnRKBz41\n wwiHLw3RPzmOqfu7WbJaAUsi7DS48bWlHtdL64snGUnM1h4QU10ByA1nhXEnvTX0zWAr\n jKH9g1gUXL1dSCz0d6BQGw453xBfp7jE4vOG99kv93pNHPSFA6ySPgClwjyqehjIhBaJ\n CaPy8DzfxAVV6twA6QVpO56Kzq+QLUa+v25k08j4nBWpb+a0KJrKCC8SzuLzRg6CUNd0\n e5EnloMId/zO3X6GvDVpJZt377o5KJs2kSyE1hW3t7rByUYScadoDBswSfqsB74u/gvo\n qo5Q==",
        "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=saEJf9aDDP8G1rcyLHugLFE2Yje+nPwZEKkPL359VRQ=;\n b=H+V433BnsSGh8DGe5WjiAHRBN3VCkewxldLhIopbUxod6gJPhZHPU+1kOrlj2aL6Km\n exXr15TWvL1zRRORCBlharqc52/nck3GDwvUN2ZOh9RoQnLDPhe+ZgPPMCKLUDTdu9Na\n kYrRbTGdYdwhQ7Hs4ysOES4jgPxLl9neiXDaeFOA79+autx+PytRan/8LYzNykGmqvlq\n 9YLZ31cjBZLhTOuUHpf1rvgaQdrzXOdeeftVP8pur6ep1uw/uEpDXG9snN+F7+f9cjZC\n xKkmYTn0jGZJITAOh40gs67CcE+y+RI5vZx47mMqxFHb7FgyQz9zpy5tLkpQZhimFMmD\n OQIg==",
        "X-Gm-Message-State": "AOAM532kISBfSAv9EmaX/ArMHHDS04hzT84VuHhb600vdfiEgHGIL7ri\n GnIVyUc/bKQny8ZSDwEEUURM08ahNEDYiA==",
        "X-Google-Smtp-Source": "\n ABdhPJyMJ0jurWZju2arc0dcpaRusOXr78nGKJ5FVXB40tUo+IeoPhH7oqs+3OfoQwm7EH3AxBE6Qg==",
        "X-Received": "by 2002:a63:1408:: with SMTP id u8mr2428462pgl.297.1600925689651;\n Wed, 23 Sep 2020 22:34:49 -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": "Wed, 23 Sep 2020 22:34:33 -0700",
        "Message-Id": "<20200924053433.12648-8-stephen@networkplumber.org>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20200924053433.12648-1-stephen@networkplumber.org>",
        "References": "<20200728191330.20864-1-stephen@networkplumber.org>\n <20200924053433.12648-1-stephen@networkplumber.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v6 7/7] 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 e90e9aba080e..267e16bc318b 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@@ -695,13 +688,12 @@ show_offloads(uint64_t offloads,\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@@ -709,6 +701,15 @@ show_port(void)\n \t\tchar link_status_text[RTE_ETH_LINK_MAX_STR_LEN];\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@@ -727,6 +728,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@@ -1397,28 +1403,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": [
        "v6",
        "7/7"
    ]
}