get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 26469,
    "url": "https://patches.dpdk.org/api/patches/26469/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/9b68baa2b7c9cb0606be2bbb2a54a498d5f17a0b.1499211959.git.gaetan.rivet@6wind.com/",
    "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": "<9b68baa2b7c9cb0606be2bbb2a54a498d5f17a0b.1499211959.git.gaetan.rivet@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/9b68baa2b7c9cb0606be2bbb2a54a498d5f17a0b.1499211959.git.gaetan.rivet@6wind.com",
    "date": "2017-07-04T23:56:46",
    "name": "[dpdk-dev,v6,16/19] devargs: introduce cleaner parsing helper",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "6d3015aa9ebb95d92302f03dea366a451ad670e6",
    "submitter": {
        "id": 269,
        "url": "https://patches.dpdk.org/api/people/269/?format=api",
        "name": "Gaëtan Rivet",
        "email": "gaetan.rivet@6wind.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/9b68baa2b7c9cb0606be2bbb2a54a498d5f17a0b.1499211959.git.gaetan.rivet@6wind.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/26469/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/26469/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id A98797D1B;\n\tWed,  5 Jul 2017 01:57:36 +0200 (CEST)",
            "from mail-wm0-f42.google.com (mail-wm0-f42.google.com\n\t[74.125.82.42]) by dpdk.org (Postfix) with ESMTP id 983864BE1\n\tfor <dev@dpdk.org>; Wed,  5 Jul 2017 01:57:22 +0200 (CEST)",
            "by mail-wm0-f42.google.com with SMTP id w126so207224326wme.0\n\tfor <dev@dpdk.org>; Tue, 04 Jul 2017 16:57:22 -0700 (PDT)",
            "from bidouze.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com.\n\t[62.23.145.78]) by smtp.gmail.com with ESMTPSA id\n\tw197sm27273899wme.20.2017.07.04.16.57.20\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tTue, 04 Jul 2017 16:57:21 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=6wind-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:in-reply-to:references;\n\tbh=2jWCVajeHHfPF5UfwzYZO8u3TU28jDtgQj7NnOSZ/hA=;\n\tb=fBMJQpNxaMb7XfYxp5Uj6O8ewGJ5ejhiT7+QJgYYpEao0SDviO9E9JhpaU/JAJeVb3\n\tnT/g2VdVZwdBGwsnXGM10MzCkZFSc2pe5URRZRNk6VvniSD2pnCwyktw8RcxXHxczlXy\n\taqVQehAo65DMy6gtdWZSxV1S+YnqH06jPxKHCwHgdc+sU5MoEalp0DvxvXkQx+/Q4OSV\n\tdLu74hvG/JojyimpIYUcr3nBlTMLkh/IG0ggQ732a2bPhlq+t92+ShV038l9zyTP8xqy\n\tUUiRwfVWYF61J5zOD+WXQ6z4pFOIYjjMkA2iH6k/oXKfCsnZvyxufJ9E//WB8WP4ItMB\n\tu2uA==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:in-reply-to:references;\n\tbh=2jWCVajeHHfPF5UfwzYZO8u3TU28jDtgQj7NnOSZ/hA=;\n\tb=LVZgyQd0z6k4kb2JL2e/wKhXfzIa0lW6xdEM4CEnDKd72Z5U6SzO0ygk8CcIIL2RD0\n\tLR5dGcdbntZ3A4xzIyJYCeLzjBKQ9PEVRcAV5httG8JsvODZa8XoasoKiTjmIsI6vncv\n\tQg+oqrVzeELf9sjLzP5FrehHqs5unR4YP/ciwrJuZTETg3GDHlvftZEcJfN1JArIScvc\n\tGsGDKMS6tV0zZ8rG2Soyw00TbTRpM8Yvu6do83sixV6+gqWwdaoHylcqJNdE96xiGKPE\n\tl+9OZCCCnu7s/VaFJT3XIBluVX0gF2AZm2qGTfDpPilpEMu6KOGJMjtyk5eSd5OniNR4\n\tzu+g==",
        "X-Gm-Message-State": "AIVw1109IJqo5aJThLTnIbIrojoTEgla6Th4f5Rh5tDE+4Vpfskdw2KU\n\tApxHQUjnMMmYVtgRFig=",
        "X-Received": "by 10.28.87.205 with SMTP id l196mr22385460wmb.121.1499212641939;\n\tTue, 04 Jul 2017 16:57:21 -0700 (PDT)",
        "From": "Gaetan Rivet <gaetan.rivet@6wind.com>",
        "To": "dev@dpdk.org",
        "Cc": "Gaetan Rivet <gaetan.rivet@6wind.com>",
        "Date": "Wed,  5 Jul 2017 01:56:46 +0200",
        "Message-Id": "<9b68baa2b7c9cb0606be2bbb2a54a498d5f17a0b.1499211959.git.gaetan.rivet@6wind.com>",
        "X-Mailer": "git-send-email 2.1.4",
        "In-Reply-To": [
            "<cover.1499211959.git.gaetan.rivet@6wind.com>",
            "<cover.1499211959.git.gaetan.rivet@6wind.com>"
        ],
        "References": [
            "<cover.1498001626.git.gaetan.rivet@6wind.com>\n\t<cover.1499211959.git.gaetan.rivet@6wind.com>",
            "<cover.1499211959.git.gaetan.rivet@6wind.com>"
        ],
        "Subject": "[dpdk-dev] [PATCH v6 16/19] devargs: introduce cleaner parsing\n\thelper",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Introduce a more versatile helper to parse device strings. This\nhelper expects a generic rte_devargs structure as storage in order not\nto require any API changes in the future, should this structure be\nupdated.\n\nThe old equivalent function is thus being deprecated, as its API does\nnot allow to accompany current rte_devargs evolutions.\n\nA deprecation notice is issued.\n\nThis new helper will parse bus information as well as device name and\ndevice parameters. It does not allocate an rte_devargs structure and\nexpects one to be given as input.\n\nSigned-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>\n---\n doc/guides/rel_notes/deprecation.rst            |  5 ++\n lib/librte_eal/bsdapp/eal/rte_eal_version.map   |  1 +\n lib/librte_eal/common/eal_common_devargs.c      | 78 ++++++++++++++++---------\n lib/librte_eal/common/include/rte_devargs.h     | 20 +++++++\n lib/librte_eal/linuxapp/eal/rte_eal_version.map |  1 +\n 5 files changed, 79 insertions(+), 26 deletions(-)",
    "diff": "diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst\nindex 2e708db..56d0698 100644\n--- a/doc/guides/rel_notes/deprecation.rst\n+++ b/doc/guides/rel_notes/deprecation.rst\n@@ -95,3 +95,8 @@ Deprecation Notices\n   The non-\"do-sig\" versions of the hash tables will be removed\n   (including the ``signature_offset`` parameter)\n   and the \"do-sig\" versions renamed accordingly.\n+\n+* eal: the following function is deprecated starting from 17.08 and will\n+  be removed in 17.11:\n+\n+  - ``rte_eal_parse_devargs_str``, replaced by ``rte_eal_devargs_parse``\ndiff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map\nindex 0295ea9..cec3894 100644\n--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map\n+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map\n@@ -200,6 +200,7 @@ DPDK_17.08 {\n \trte_bus_find;\n \trte_bus_find_by_device;\n \trte_bus_find_by_name;\n+\trte_eal_devargs_parse;\n \n } DPDK_17.05;\n \ndiff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c\nindex 8fe1b39..3ea070d 100644\n--- a/lib/librte_eal/common/eal_common_devargs.c\n+++ b/lib/librte_eal/common/eal_common_devargs.c\n@@ -86,49 +86,77 @@ bus_name_cmp(const struct rte_bus *bus, const void *_name)\n \t\t       strlen(bus->name));\n }\n \n-/* store a whitelist parameter for later parsing */\n int\n-rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str)\n+rte_eal_devargs_parse(const char *dev, struct rte_devargs *da)\n {\n-\tstruct rte_devargs *devargs = NULL;\n \tstruct rte_bus *bus = NULL;\n-\tchar *dev = NULL;\n \tconst char *devname;\n-\tint ret;\n-\n-\t/* use malloc instead of rte_malloc as it's called early at init */\n-\tdevargs = malloc(sizeof(*devargs));\n-\tif (devargs == NULL)\n-\t\tgoto fail;\n-\n-\tmemset(devargs, 0, sizeof(*devargs));\n-\tdevargs->type = devtype;\n+\tconst size_t maxlen = sizeof(da->name);\n+\tsize_t i;\n \n-\tif (rte_eal_parse_devargs_str(devargs_str, &dev, &devargs->args))\n-\t\tgoto fail;\n-\tdevname = dev;\n+\tif (dev == NULL || da == NULL)\n+\t\treturn -EINVAL;\n+\t/* Retrieve eventual bus info */\n \tdo {\n+\t\tdevname = dev;\n \t\tbus = rte_bus_find(bus, bus_name_cmp, dev);\n \t\tif (bus == NULL)\n \t\t\tbreak;\n \t\tdevname = dev + strlen(bus->name) + 1;\n \t\tif (rte_bus_find_by_device_name(devname) == bus)\n \t\t\tbreak;\n-\t\tdevname = dev;\n \t} while (1);\n+\t/* Store device name */\n+\ti = 0;\n+\twhile (devname[i] != '\\0' && devname[i] != ',') {\n+\t\tda->name[i] = devname[i];\n+\t\ti++;\n+\t\tif (i == maxlen) {\n+\t\t\tfprintf(stderr, \"WARNING: Parsing \\\"%s\\\": device name should be shorter than %zu\\n\",\n+\t\t\t\tdev, maxlen);\n+\t\t\tda->name[i - 1] = '\\0';\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t}\n+\tda->name[i] = '\\0';\n \tif (bus == NULL) {\n-\t\tbus = rte_bus_find_by_device_name(devname);\n+\t\tbus = rte_bus_find_by_device_name(da->name);\n \t\tif (bus == NULL) {\n-\t\t\tfprintf(stderr, \"ERROR: failed to parse bus info from device declaration\\n\");\n-\t\t\tgoto fail;\n+\t\t\tfprintf(stderr, \"ERROR: failed to parse device \\\"%s\\\"\\n\",\n+\t\t\t\tda->name);\n+\t\t\treturn -EFAULT;\n \t\t}\n \t}\n-\tdevargs->bus = bus;\n+\tda->bus = bus;\n+\t/* Parse eventual device arguments */\n+\tif (devname[i] == ',')\n+\t\tda->args = strdup(&devname[i + 1]);\n+\telse\n+\t\tda->args = strdup(\"\");\n+\tif (da->args == NULL) {\n+\t\tfprintf(stderr, \"ERROR: not enough memory to parse arguments\\n\");\n+\t\treturn -ENOMEM;\n+\t}\n+\treturn 0;\n+}\n+\n+/* store a whitelist parameter for later parsing */\n+int\n+rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str)\n+{\n+\tstruct rte_devargs *devargs = NULL;\n+\tstruct rte_bus *bus = NULL;\n+\tconst char *dev = devargs_str;\n \n-\t/* save device name. */\n-\tret = snprintf(devargs->name, sizeof(devargs->name), \"%s\", devname);\n-\tif (ret < 0 || ret >= (int)sizeof(devargs->name))\n+\t/* use calloc instead of rte_zmalloc as it's called early at init */\n+\tdevargs = calloc(1, sizeof(*devargs));\n+\tif (devargs == NULL)\n \t\tgoto fail;\n+\n+\tif (rte_eal_devargs_parse(dev, devargs))\n+\t\tgoto fail;\n+\tdevargs->type = devtype;\n+\tbus = devargs->bus;\n \tif (devargs->type == RTE_DEVTYPE_WHITELISTED) {\n \t\tif (bus->conf.scan_mode == RTE_BUS_SCAN_UNDEFINED) {\n \t\t\tbus->conf.scan_mode = RTE_BUS_SCAN_WHITELIST;\n@@ -145,12 +173,10 @@ rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str)\n \t\t}\n \t}\n \n-\tfree(dev);\n \tTAILQ_INSERT_TAIL(&devargs_list, devargs, next);\n \treturn 0;\n \n fail:\n-\tfree(dev);\n \tif (devargs) {\n \t\tfree(devargs->args);\n \t\tfree(devargs);\ndiff --git a/lib/librte_eal/common/include/rte_devargs.h b/lib/librte_eal/common/include/rte_devargs.h\nindex 6e9e134..2ab8864 100644\n--- a/lib/librte_eal/common/include/rte_devargs.h\n+++ b/lib/librte_eal/common/include/rte_devargs.h\n@@ -119,6 +119,26 @@ int rte_eal_parse_devargs_str(const char *devargs_str,\n \t\t\t\tchar **drvname, char **drvargs);\n \n /**\n+ * Parse a device string.\n+ *\n+ * Verify that a bus is capable of handling the device passed\n+ * in argument. Store which bus will handle the device, its name\n+ * and the eventual device parameters.\n+ *\n+ * @param dev\n+ *   The device declaration string.\n+ * @param da\n+ *   The devargs structure holding the device information.\n+ *\n+ * @return\n+ *   - 0 on success.\n+ *   - Negative errno on error.\n+ */\n+int\n+rte_eal_devargs_parse(const char *dev,\n+\t\t      struct rte_devargs *da);\n+\n+/**\n  * Add a device to the user device list\n  *\n  * For PCI devices, the format of arguments string is \"PCI_ADDR\" or\ndiff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map\nindex a118fb1..09b875a 100644\n--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map\n+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map\n@@ -205,6 +205,7 @@ DPDK_17.08 {\n \trte_bus_find;\n \trte_bus_find_by_device;\n \trte_bus_find_by_name;\n+\trte_eal_devargs_parse;\n \n } DPDK_17.05;\n \n",
    "prefixes": [
        "dpdk-dev",
        "v6",
        "16/19"
    ]
}