get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 104666,
    "url": "http://patchwork.dpdk.org/api/patches/104666/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20211124124524.25754-1-olivier.matz@6wind.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": "<20211124124524.25754-1-olivier.matz@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211124124524.25754-1-olivier.matz@6wind.com",
    "date": "2021-11-24T12:45:24",
    "name": "[v4] bus: fix device iterator match from arguments",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "b6e22983bcb5d204b36dc61b53b101c5225f05af",
    "submitter": {
        "id": 8,
        "url": "http://patchwork.dpdk.org/api/people/8/?format=api",
        "name": "Olivier Matz",
        "email": "olivier.matz@6wind.com"
    },
    "delegate": {
        "id": 24651,
        "url": "http://patchwork.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20211124124524.25754-1-olivier.matz@6wind.com/mbox/",
    "series": [
        {
            "id": 20747,
            "url": "http://patchwork.dpdk.org/api/series/20747/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=20747",
            "date": "2021-11-24T12:45:24",
            "name": "[v4] bus: fix device iterator match from arguments",
            "version": 4,
            "mbox": "http://patchwork.dpdk.org/series/20747/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/104666/comments/",
    "check": "fail",
    "checks": "http://patchwork.dpdk.org/api/patches/104666/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 B8DD3A0C52;\n\tWed, 24 Nov 2021 13:45:38 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 499EB410E5;\n\tWed, 24 Nov 2021 13:45:38 +0100 (CET)",
            "from mail-wm1-f46.google.com (mail-wm1-f46.google.com\n [209.85.128.46]) by mails.dpdk.org (Postfix) with ESMTP id 34EEA40F35\n for <dev@dpdk.org>; Wed, 24 Nov 2021 13:45:37 +0100 (CET)",
            "by mail-wm1-f46.google.com with SMTP id y196so2210854wmc.3\n for <dev@dpdk.org>; Wed, 24 Nov 2021 04:45:37 -0800 (PST)",
            "from gojira.dev.6wind.com ([185.13.181.2])\n by smtp.gmail.com with ESMTPSA id f19sm5911491wmq.34.2021.11.24.04.45.36\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Wed, 24 Nov 2021 04:45:36 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind.com; s=google;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=6x2swgkZ52Lu6KKQoLAJayAEKfwD7mLXO7RAjxpSFiU=;\n b=GS2N09ru8wRoxTaxcJmaNxRGgsAF2KZwuZlZBOcVqKTwuSO8DB7cC3ysV6zYniZI9e\n 6CETFjG09GRUiaw423JhtpEAbIBpKeMMefEd4MZhvjXQ30HhMxt9w7H9y/p/FjxOhw7P\n VInUnK8ZO5vPx1Mz+Q2C4hpp750HRMSQzxX3wpl3J/edCJaBTp+U8QvrCUkNc/NNS3OH\n 1Ej7pAMu1MmV5qf1Xy9K4rjNvKS2TLLUqHho9+zxcux/vyr9YhHS2phmNC7u8on8+ufG\n TU/QQkgNxIePHheTT93ALK0XuZO1FHqgIvx4DAZe2q5O9RrZgiOhLjIUcNhdgZxa1VzL\n gCAg==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20210112;\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=6x2swgkZ52Lu6KKQoLAJayAEKfwD7mLXO7RAjxpSFiU=;\n b=bViV7ElgpL4FdXCPd04twwXpyAWE15GYi5bx8Qg1lHLGwlDbJrowP4EvBBboRfWWFB\n B6DpWoIp8OfemMNaC3nZfpV8a/+rTqL8RvXSLpFhyLS9zf74MfV/zK45ncc/FZsPBzQE\n 9Udxl2P94iR/uOG0XXsr3oVZTpsP0ubphKme/vJsE+tOyKDfuYPqa3AJk53wRYEnUQUK\n XztUfpQq6wBFx2jHURQGpLDjUoJI8Ke+oRDmQbATcBcVl0SML1OqpyS0FDCuZ9PQrt/6\n hSOC7WdT3f2VCMh9pYg6YafD7oz2dLR1ZYOwZcLISC4exP+0Dt432dLfUEAYfRxqPvh1\n 1Zsg==",
        "X-Gm-Message-State": "AOAM531IPvBPfSSsprNh/zNXBMxIucDlSky23K3OCNC5fDT6/k0C2oC9\n kfYwBM7+i79FOqOkyEcNP/gzwr4xolpSaw==",
        "X-Google-Smtp-Source": "\n ABdhPJzzu9o7F/B82hjqSRiNxST6C54MC1d3lONcPWiC1NnwVuXXCQMyu8ruC38dDYpTzoBHpz446w==",
        "X-Received": "by 2002:a7b:c742:: with SMTP id w2mr14837006wmk.65.1637757936820;\n Wed, 24 Nov 2021 04:45:36 -0800 (PST)",
        "From": "Olivier Matz <olivier.matz@6wind.com>",
        "To": "dev@dpdk.org",
        "Cc": "xuemingl@nvidia.com, Lior Margalit <lmargalit@nvidia.com>,\n Parav Pandit <parav@nvidia.com>,\n David Marchand <david.marchand@redhat.com>, Ray Kinsella <mdr@ashroe.eu>",
        "Subject": "[PATCH v4] bus: fix device iterator match from arguments",
        "Date": "Wed, 24 Nov 2021 13:45:24 +0100",
        "Message-Id": "<20211124124524.25754-1-olivier.matz@6wind.com>",
        "X-Mailer": "git-send-email 2.30.2",
        "In-Reply-To": "<20211122061250.3220823-1-xuemingl@nvidia.com>",
        "References": "<20211122061250.3220823-1-xuemingl@nvidia.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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"
    },
    "content": "From: Xueming Li <xuemingl@nvidia.com>\n\nDevice iterator RTE_DEV_FOREACH() failed to return devices from\nclassifier like \"class=vdpa\", because matching name from empty kvargs\nreturns no result. If device name not specified in kvargs, the function\nshould iterate all devices.\n\nThis patch allows empty devargs or devargs without name specified.\n\nFixes: 6aebb942907d (\"kvargs: add function to get from key and value\")\n\nSigned-off-by: Xueming Li <xuemingl@nvidia.com>\nSigned-off-by: Olivier Matz <olivier.matz@6wind.com>\nReviewed-by: Xueming Li <xuemingl@nvidia.com>\n---\nbug is specific to 21.11, no need to cc stable@dpdk.org\n\nv4:\n- disable unit test when net/null is not enabled\nv3:\n- add unit test\nv2:\n- use rte_kvargs_get() + strcmp instead of rte_kvargs_get_with_value()\n---\n app/test/meson.build                     |   5 +\n app/test/test_vdev.c                     | 168 +++++++++++++++++++++++\n drivers/bus/auxiliary/auxiliary_params.c |   9 +-\n drivers/bus/vdev/vdev_params.c           |   9 +-\n 4 files changed, 189 insertions(+), 2 deletions(-)\n create mode 100644 app/test/test_vdev.c",
    "diff": "diff --git a/app/test/meson.build b/app/test/meson.build\nindex 961bebc5cb..2b480adfba 100644\n--- a/app/test/meson.build\n+++ b/app/test/meson.build\n@@ -426,6 +426,11 @@ if dpdk_conf.has('RTE_NET_RING')\n         fast_tests += [['pdump_autotest', true]]\n     endif\n endif\n+if dpdk_conf.has('RTE_NET_NULL')\n+    test_deps += 'net_null'\n+    test_sources += 'test_vdev.c'\n+    fast_tests += [['vdev_autotest', true]]\n+endif\n \n if dpdk_conf.has('RTE_HAS_LIBPCAP')\n     ext_deps += pcap_dep\ndiff --git a/app/test/test_vdev.c b/app/test/test_vdev.c\nnew file mode 100644\nindex 0000000000..720722c363\n--- /dev/null\n+++ b/app/test/test_vdev.c\n@@ -0,0 +1,168 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright 2021 6WIND S.A.\n+ */\n+\n+#include <stdlib.h>\n+#include <stdio.h>\n+#include <string.h>\n+\n+#include <rte_common.h>\n+#include <rte_kvargs.h>\n+#include <rte_bus_vdev.h>\n+\n+#include \"test.h\"\n+\n+#define TEST_VDEV_KEY_NAME \"name\"\n+\n+static const char * const valid_keys[] = {\n+\tTEST_VDEV_KEY_NAME,\n+\tNULL,\n+};\n+\n+static int\n+cmp_dev_name(const struct rte_device *dev, const void *name)\n+{\n+\treturn strcmp(dev->name, name);\n+}\n+\n+static int\n+cmp_dev_match(const struct rte_device *dev, const void *_kvlist)\n+{\n+\tconst struct rte_kvargs *kvlist = _kvlist;\n+\tconst char *key = TEST_VDEV_KEY_NAME;\n+\tconst char *name;\n+\n+\t/* no kvlist arg, all devices match */\n+\tif (kvlist == NULL)\n+\t\treturn 0;\n+\n+\t/* if key is present in kvlist and does not match, filter device */\n+\tname = rte_kvargs_get(kvlist, key);\n+\tif (name != NULL && strcmp(name, dev->name))\n+\t\treturn -1;\n+\n+\treturn 0;\n+}\n+\n+static struct rte_device *\n+get_matching_vdev(const char *match_str)\n+{\n+\tstruct rte_bus *vdev_bus = rte_bus_find_by_name(\"vdev\");\n+\tstruct rte_kvargs *kvargs = NULL;\n+\tstruct rte_device *dev;\n+\n+\tif (match_str != NULL) {\n+\t\tkvargs = rte_kvargs_parse(match_str, valid_keys);\n+\t\tif (kvargs == NULL) {\n+\t\t\tprintf(\"Failed to parse match string\\n\");\n+\t\t\treturn NULL;\n+\t\t}\n+\t}\n+\n+\tdev = vdev_bus->find_device(NULL, cmp_dev_match, kvargs);\n+\trte_kvargs_free(kvargs);\n+\n+\treturn dev;\n+}\n+\n+static int\n+test_vdev_bus(void)\n+{\n+\tstruct rte_bus *vdev_bus = rte_bus_find_by_name(\"vdev\");\n+\tstruct rte_dev_iterator dev_iter = { 0 };\n+\tstruct rte_device *dev, *dev0, *dev1;\n+\n+\t/* not supported */\n+\tif (vdev_bus == NULL)\n+\t\treturn 0;\n+\n+\t/* create first vdev */\n+\tif (rte_vdev_init(\"net_null_test0\", \"\") < 0) {\n+\t\tprintf(\"Failed to create vdev net_null_test0\\n\");\n+\t\tgoto fail;\n+\t}\n+\tdev0 = vdev_bus->find_device(NULL, cmp_dev_name, \"net_null_test0\");\n+\tif (dev0 == NULL) {\n+\t\tprintf(\"Cannot find net_null_test0 vdev\\n\");\n+\t\tgoto fail;\n+\t}\n+\n+\t/* create second vdev */\n+\tif (rte_vdev_init(\"net_null_test1\", \"\") < 0) {\n+\t\tprintf(\"Failed to create vdev net_null_test1\\n\");\n+\t\tgoto fail;\n+\t}\n+\tdev1 = vdev_bus->find_device(NULL, cmp_dev_name, \"net_null_test1\");\n+\tif (dev1 == NULL) {\n+\t\tprintf(\"Cannot find net_null_test1 vdev\\n\");\n+\t\tgoto fail;\n+\t}\n+\n+\t/* try to match vdevs */\n+\tdev = get_matching_vdev(\"name=net_null_test0\");\n+\tif (dev != dev0) {\n+\t\tprintf(\"Cannot match net_null_test0 vdev\\n\");\n+\t\tgoto fail;\n+\t}\n+\n+\tdev = get_matching_vdev(\"name=net_null_test1\");\n+\tif (dev != dev1) {\n+\t\tprintf(\"Cannot match net_null_test1 vdev\\n\");\n+\t\tgoto fail;\n+\t}\n+\n+\tdev = get_matching_vdev(\"name=unexistant\");\n+\tif (dev != NULL) {\n+\t\tprintf(\"Unexistant vdev should not match\\n\");\n+\t\tgoto fail;\n+\t}\n+\n+\tdev = get_matching_vdev(\"\");\n+\tif (dev == NULL || dev == dev1) {\n+\t\tprintf(\"Cannot match any vdev with empty match string\\n\");\n+\t\tgoto fail;\n+\t}\n+\n+\tdev = get_matching_vdev(NULL);\n+\tif (dev == NULL || dev == dev1) {\n+\t\tprintf(\"Cannot match any vdev with NULL match string\\n\");\n+\t\tgoto fail;\n+\t}\n+\n+\t/* iterate all vdevs, and ensure we find vdev0 and vdev1 */\n+\tRTE_DEV_FOREACH(dev, \"bus=vdev\", &dev_iter) {\n+\t\tif (dev == dev0)\n+\t\t\tdev0 = NULL;\n+\t\telse if (dev == dev1)\n+\t\t\tdev1 = NULL;\n+\t}\n+\tif (dev0 != NULL) {\n+\t\tprintf(\"dev0 was not iterated\\n\");\n+\t\tgoto fail;\n+\t}\n+\tif (dev1 != NULL) {\n+\t\tprintf(\"dev1 was not iterated\\n\");\n+\t\tgoto fail;\n+\t}\n+\n+\trte_vdev_uninit(\"net_null_test0\");\n+\trte_vdev_uninit(\"net_null_test1\");\n+\n+\treturn 0;\n+\n+fail:\n+\trte_vdev_uninit(\"net_null_test0\");\n+\trte_vdev_uninit(\"net_null_test1\");\n+\treturn -1;\n+}\n+\n+static int\n+test_vdev(void)\n+{\n+\tprintf(\"== test vdev bus ==\\n\");\n+\tif (test_vdev_bus() < 0)\n+\t\treturn -1;\n+\treturn 0;\n+}\n+\n+REGISTER_TEST_COMMAND(vdev_autotest, test_vdev);\ndiff --git a/drivers/bus/auxiliary/auxiliary_params.c b/drivers/bus/auxiliary/auxiliary_params.c\nindex 8dd8813611..9c08ccdd1b 100644\n--- a/drivers/bus/auxiliary/auxiliary_params.c\n+++ b/drivers/bus/auxiliary/auxiliary_params.c\n@@ -28,8 +28,15 @@ auxiliary_dev_match(const struct rte_device *dev,\n {\n \tconst struct rte_kvargs *kvlist = _kvlist;\n \tconst char *key = auxiliary_params_keys[RTE_AUXILIARY_PARAM_NAME];\n+\tconst char *name;\n \n-\tif (rte_kvargs_get_with_value(kvlist, key, dev->name) == NULL)\n+\t/* no kvlist arg, all devices match */\n+\tif (kvlist == NULL)\n+\t\treturn 0;\n+\n+\t/* if key is present in kvlist and does not match, filter device */\n+\tname = rte_kvargs_get(kvlist, key);\n+\tif (name != NULL && strcmp(name, dev->name))\n \t\treturn -1;\n \n \treturn 0;\ndiff --git a/drivers/bus/vdev/vdev_params.c b/drivers/bus/vdev/vdev_params.c\nindex 37d95395e7..3969faf16d 100644\n--- a/drivers/bus/vdev/vdev_params.c\n+++ b/drivers/bus/vdev/vdev_params.c\n@@ -28,8 +28,15 @@ vdev_dev_match(const struct rte_device *dev,\n {\n \tconst struct rte_kvargs *kvlist = _kvlist;\n \tconst char *key = vdev_params_keys[RTE_VDEV_PARAM_NAME];\n+\tconst char *name;\n \n-\tif (rte_kvargs_get_with_value(kvlist, key, dev->name) == NULL)\n+\t/* no kvlist arg, all devices match */\n+\tif (kvlist == NULL)\n+\t\treturn 0;\n+\n+\t/* if key is present in kvlist and does not match, filter device */\n+\tname = rte_kvargs_get(kvlist, key);\n+\tif (name != NULL && strcmp(name, dev->name))\n \t\treturn -1;\n \n \treturn 0;\n",
    "prefixes": [
        "v4"
    ]
}