get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 91036,
    "url": "http://patches.dpdk.org/api/patches/91036/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1618064637-16413-5-git-send-email-xuemingl@nvidia.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": "<1618064637-16413-5-git-send-email-xuemingl@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1618064637-16413-5-git-send-email-xuemingl@nvidia.com",
    "date": "2021-04-10T14:23:56",
    "name": "[v4,4/5] bus: add device arguments name parsing API",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "e300ed1d0058fd437de6f85b360e9d1849790d59",
    "submitter": {
        "id": 1904,
        "url": "http://patches.dpdk.org/api/people/1904/?format=api",
        "name": "Xueming Li",
        "email": "xuemingl@nvidia.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/1618064637-16413-5-git-send-email-xuemingl@nvidia.com/mbox/",
    "series": [
        {
            "id": 16267,
            "url": "http://patches.dpdk.org/api/series/16267/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=16267",
            "date": "2021-04-10T14:23:52",
            "name": "eal: enable global device syntax by default",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/16267/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/91036/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/91036/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 0E65BA0546;\n\tSat, 10 Apr 2021 16:24:36 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A8EF81412CE;\n\tSat, 10 Apr 2021 16:24:30 +0200 (CEST)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n by mails.dpdk.org (Postfix) with ESMTP id 46EE01412CA\n for <dev@dpdk.org>; Sat, 10 Apr 2021 16:24:29 +0200 (CEST)",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n xuemingl@nvidia.com) with SMTP; 10 Apr 2021 17:24:27 +0300",
            "from nvidia.com (pegasus05.mtr.labs.mlnx [10.210.16.100])\n by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 13AEO6E2018265;\n Sat, 10 Apr 2021 17:24:27 +0300"
        ],
        "From": "Xueming Li <xuemingl@nvidia.com>",
        "To": "Thomas Monjalon <thomas@monjalon.net>, Gaetan Rivet <gaetanr@nvidia.com>",
        "Cc": "dev@dpdk.org, xuemingl@nvidia.com, Asaf Penso <asafp@nvidia.com>",
        "Date": "Sat, 10 Apr 2021 14:23:56 +0000",
        "Message-Id": "<1618064637-16413-5-git-send-email-xuemingl@nvidia.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": [
            "<1618064637-16413-1-git-send-email-xuemingl@nvidia.com>",
            "<1608304614-13908-2-git-send-email-xuemingl@nvidia.com>"
        ],
        "References": [
            "<1618064637-16413-1-git-send-email-xuemingl@nvidia.com>",
            "<1608304614-13908-2-git-send-email-xuemingl@nvidia.com>"
        ],
        "Subject": "[dpdk-dev] [PATCH v4 4/5] bus: add device arguments name parsing API",
        "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": "For device probe and iterator, devargs name was key information,\nparsed by rte_devargs_parse. In legacy parser, devargs name was\nextracted after bus name:\n  bus:name,kv_arguments,,,\nExample:\n  pci:83:00.0,arguments,...\n  vdev:pcap0,...\n\nTo be compatible with legacy parser, this patch introduces new\nbus driver API devargs_parse to parse devargs and update devargs name.\nIf devargs_parse not implemented by bus driver, the new syntax parser\nrte_devargs_layers_parse default will resolve devargs name from bus's\n\"name\" argument.\n\nDifferent bus driver might choose different keys from arguments with\nunified format. The PCI bus implementation fills the devargs name with\nthe \"addr\" argument, example:\n -a bus=pci,addr=83:00.0/class=eth/driver=mlx5,...\n    name: 0000:03:00.0\n -a bus=vdev,name=pcap0/class=eth/driver=pcap,...\n    name:pcap0\n\nSigned-off-by: Xueming Li <xuemingl@nvidia.com>\nReviewed-by: Gaetan Rivet <grive@u256.net>\n---\n drivers/bus/pci/pci_common.c               |  1 +\n drivers/bus/pci/pci_params.c               | 47 ++++++++++++++++++++++\n drivers/bus/pci/private.h                  | 14 +++++++\n lib/librte_eal/common/eal_common_devargs.c | 31 ++++++++++++++\n lib/librte_eal/include/rte_bus.h           | 18 +++++++++\n 5 files changed, 111 insertions(+)",
    "diff": "diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c\nindex 9b8d769287..61d3f51452 100644\n--- a/drivers/bus/pci/pci_common.c\n+++ b/drivers/bus/pci/pci_common.c\n@@ -760,6 +760,7 @@ struct rte_pci_bus rte_pci_bus = {\n \t\t.dev_iterate = rte_pci_dev_iterate,\n \t\t.hot_unplug_handler = pci_hot_unplug_handler,\n \t\t.sigbus_handler = pci_sigbus_handler,\n+\t\t.devargs_parse = rte_pci_devargs_parse,\n \t},\n \t.device_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.device_list),\n \t.driver_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.driver_list),\ndiff --git a/drivers/bus/pci/pci_params.c b/drivers/bus/pci/pci_params.c\nindex 3192e9c967..c0c282e948 100644\n--- a/drivers/bus/pci/pci_params.c\n+++ b/drivers/bus/pci/pci_params.c\n@@ -8,6 +8,8 @@\n #include <rte_errno.h>\n #include <rte_kvargs.h>\n #include <rte_pci.h>\n+#include <rte_devargs.h>\n+#include <rte_debug.h>\n \n #include \"private.h\"\n \n@@ -76,3 +78,48 @@ rte_pci_dev_iterate(const void *start,\n \trte_kvargs_free(kvargs);\n \treturn dev;\n }\n+\n+int\n+rte_pci_devargs_parse(struct rte_devargs *da)\n+{\n+\tstruct rte_kvargs *kvargs;\n+\tconst char *addr_str;\n+\tstruct rte_pci_addr addr;\n+\tint ret;\n+\n+\tif (da == NULL)\n+\t\treturn 0;\n+\tRTE_ASSERT(da->bus_str != NULL);\n+\n+\tkvargs = rte_kvargs_parse(da->bus_str, NULL);\n+\tif (kvargs == NULL) {\n+\t\tRTE_LOG(ERR, EAL, \"cannot parse argument list: %s\\n\",\n+\t\t\tda->bus_str);\n+\t\tret = -ENODEV;\n+\t\tgoto out;\n+\t}\n+\n+\taddr_str = rte_kvargs_get(kvargs, pci_params_keys[RTE_PCI_PARAM_ADDR]);\n+\tif (addr_str == NULL) {\n+\t\tRTE_LOG(ERR, EAL, \"No PCI address specified using '%s=<id>' in: %s\\n\",\n+\t\t\tpci_params_keys[RTE_PCI_PARAM_ADDR], da->bus_str);\n+\t\tret = -ENODEV;\n+\t\tgoto out;\n+\t}\n+\n+\tret = rte_pci_addr_parse(addr_str, &addr);\n+\tif (ret != 0) {\n+\t\tRTE_LOG(ERR, EAL, \"PCI address invalid: %s\\n\", da->bus_str);\n+\t\tret = -EINVAL;\n+\t\tgoto out;\n+\t}\n+\n+\trte_pci_device_name(&addr, da->name, sizeof(da->name));\n+\n+out:\n+\tif (kvargs != NULL)\n+\t\trte_kvargs_free(kvargs);\n+\tif (ret != 0)\n+\t\trte_errno = -ret;\n+\treturn ret;\n+}\ndiff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h\nindex f566943f5e..8bc5140e97 100644\n--- a/drivers/bus/pci/private.h\n+++ b/drivers/bus/pci/private.h\n@@ -267,4 +267,18 @@ rte_pci_dev_iterate(const void *start,\n \t\t    const char *str,\n \t\t    const struct rte_dev_iterator *it);\n \n+/*\n+ * Parse device arguments and update name.\n+ *\n+ * @param da\n+ *   device arguments to parse.\n+ *\n+ * @return\n+ *   0 on success.\n+ *   -EINVAL: kvargs string is invalid and cannot be parsed.\n+ *   -ENODEV: no key matching a device ID is found in the kv list.\n+ */\n+int\n+rte_pci_devargs_parse(struct rte_devargs *da);\n+\n #endif /* _PCI_PRIVATE_H_ */\ndiff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c\nindex e40b91ea66..3a62521e05 100644\n--- a/lib/librte_eal/common/eal_common_devargs.c\n+++ b/lib/librte_eal/common/eal_common_devargs.c\n@@ -19,6 +19,7 @@\n #include <rte_kvargs.h>\n #include <rte_log.h>\n #include <rte_tailq.h>\n+#include <rte_string_fns.h>\n #include \"eal_private.h\"\n \n /** user device double-linked queue type definition */\n@@ -40,6 +41,28 @@ devargs_layer_count(const char *s)\n \treturn i;\n }\n \n+/* Resolve devargs name from bus arguments. */\n+static int\n+devargs_bus_parse_default(struct rte_devargs *devargs,\n+\t\t\t  struct rte_kvargs *bus_args)\n+{\n+\tconst char *name;\n+\n+\t/* Parse devargs name from bus key-value list. */\n+\tname = rte_kvargs_get(bus_args, \"name\");\n+\tif (name == NULL) {\n+\t\tRTE_LOG(INFO, EAL, \"devargs name not found: %s\\n\",\n+\t\t\tdevargs->data);\n+\t\treturn 0;\n+\t}\n+\tif (rte_strscpy(devargs->name, name, sizeof(devargs->name)) < 0) {\n+\t\tRTE_LOG(ERR, EAL, \"devargs name too long: %s\\n\",\n+\t\t\tdevargs->data);\n+\t\treturn -E2BIG;\n+\t}\n+\treturn 0;\n+}\n+\n int\n rte_devargs_layers_parse(struct rte_devargs *devargs,\n \t\t\t const char *devstr)\n@@ -118,6 +141,8 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,\n \t\tif (layers[i].kvlist == NULL)\n \t\t\tcontinue;\n \t\tkv = &layers[i].kvlist->pairs[0];\n+\t\tif (kv->key == NULL)\n+\t\t\tcontinue;\n \t\tif (strcmp(kv->key, \"bus\") == 0) {\n \t\t\tbus = rte_bus_find_by_name(kv->value);\n \t\t\tif (bus == NULL) {\n@@ -160,6 +185,12 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,\n \t\t}\n \t}\n \n+\t/* Resolve devarg's name. */\n+\tif (bus && bus->devargs_parse)\n+\t\tret = bus->devargs_parse(devargs);\n+\telse if (layers[0].kvlist != NULL)\n+\t\tret = devargs_bus_parse_default(devargs, layers[0].kvlist);\n+\n get_out:\n \tfor (i = 0; i < RTE_DIM(layers); i++) {\n \t\tif (layers[i].kvlist)\ndiff --git a/lib/librte_eal/include/rte_bus.h b/lib/librte_eal/include/rte_bus.h\nindex 80b154fb98..0a99f3b5a3 100644\n--- a/lib/librte_eal/include/rte_bus.h\n+++ b/lib/librte_eal/include/rte_bus.h\n@@ -210,6 +210,23 @@ typedef int (*rte_bus_hot_unplug_handler_t)(struct rte_device *dev);\n  */\n typedef int (*rte_bus_sigbus_handler_t)(const void *failure_addr);\n \n+/**\n+ * Parse device arguments, setting the device name in the devargs as a result.\n+ *\n+ * On error rte_errno is set.\n+ *\n+ * @param da\n+ *\tPointer to the devargs to parse.\n+ *\tThe 'bus_str' field must be set.\n+ *\n+ * @return\n+ *\t0 on successful parsing.\n+ *\t-EINVAL: on parsing error.\n+ *\t-ENODEV: if no key matching a device argument is specified.\n+ *\t-E2BIG: device name is too long.\n+ */\n+typedef int (*rte_bus_devargs_parse_t)(struct rte_devargs *da);\n+\n /**\n  * Bus scan policies\n  */\n@@ -267,6 +284,7 @@ struct rte_bus {\n \t\t\t\t/**< handle hot-unplug failure on the bus */\n \trte_bus_sigbus_handler_t sigbus_handler;\n \t\t\t\t\t/**< handle sigbus error on the bus */\n+\trte_bus_devargs_parse_t devargs_parse; /**< Parse device arguments */\n \n };\n \n",
    "prefixes": [
        "v4",
        "4/5"
    ]
}