get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 102345,
    "url": "http://patches.dpdk.org/api/patches/102345/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20211020073151.2374674-4-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": "<20211020073151.2374674-4-xuemingl@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211020073151.2374674-4-xuemingl@nvidia.com",
    "date": "2021-10-20T07:31:51",
    "name": "[v2,3/3] test/devargs: add devargs test cases",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "75a052d1d4b20281f5f900bb16e34bfa19bebee3",
    "submitter": {
        "id": 1904,
        "url": "http://patches.dpdk.org/api/people/1904/?format=api",
        "name": "Xueming Li",
        "email": "xuemingl@nvidia.com"
    },
    "delegate": {
        "id": 24651,
        "url": "http://patches.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20211020073151.2374674-4-xuemingl@nvidia.com/mbox/",
    "series": [
        {
            "id": 19819,
            "url": "http://patches.dpdk.org/api/series/19819/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=19819",
            "date": "2021-10-20T07:31:48",
            "name": "devargs: support path in global syntax",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/19819/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/102345/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/102345/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 04E99A0C45;\n\tWed, 20 Oct 2021 09:32:36 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 3EE7441182;\n\tWed, 20 Oct 2021 09:32:29 +0200 (CEST)",
            "from NAM04-MW2-obe.outbound.protection.outlook.com\n (mail-mw2nam08on2052.outbound.protection.outlook.com [40.107.101.52])\n by mails.dpdk.org (Postfix) with ESMTP id AF30A4117B\n for <dev@dpdk.org>; Wed, 20 Oct 2021 09:32:21 +0200 (CEST)",
            "from DM6PR06CA0004.namprd06.prod.outlook.com (2603:10b6:5:120::17)\n by BN8PR12MB3217.namprd12.prod.outlook.com (2603:10b6:408:6e::30) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4608.18; Wed, 20 Oct\n 2021 07:32:19 +0000",
            "from DM6NAM11FT008.eop-nam11.prod.protection.outlook.com\n (2603:10b6:5:120:cafe::a5) by DM6PR06CA0004.outlook.office365.com\n (2603:10b6:5:120::17) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4608.15 via Frontend\n Transport; Wed, 20 Oct 2021 07:32:19 +0000",
            "from mail.nvidia.com (216.228.112.34) by\n DM6NAM11FT008.mail.protection.outlook.com (10.13.172.85) with Microsoft SMTP\n Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id\n 15.20.4628.16 via Frontend Transport; Wed, 20 Oct 2021 07:32:18 +0000",
            "from nvidia.com (172.20.187.5) by HQMAIL107.nvidia.com\n (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Wed, 20 Oct\n 2021 07:32:15 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=e3CWnU137xmbiA7+OiR7I/JjqF4r8VwHuG4FdfBWtIuid4EpQCzQIe59al9B2cApuyiu0Oz0ygNPOsGIw0VD9D2FR6GcT9MBKia8kxwsYXTew4a3IVAycgtJEVVdKeyoPJpAAAtvdxXJ7PakOhe3XB76OMqm44E0gwmok0zCS2Pey3JYr27mszPBt9CFnMi37F6bHVkkwCVO+6IICFxEZV7sh18iGAmXt7w+fdSTEpS8yaZUcJt61SlPXcLs8tUB2WmAbddHOsBSKR/mLiArBDcnecYH86mmap25HBxjZWKmOQtWlXD5GjNjwWebX6lrKHfMx9X7v0aHS4oVbUIazQ==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=5h65FyPoGGqt+ZO2zf6v7Jd+eTpDH3U2bKTNJkmhSsU=;\n b=a78RJDIHfBTJOhHRrwv2hg2PZjb2WBHpQqU+KAL1PQyP/ji1JJ8MfpRj8BuVJy/mRQE1o9wp5+LPJRyR3d0ig3IphVBtW1D2XwYrbW0odxsBRgoHZpwu4lWp5pvkExrM96+FQJ5SjykLbth03rSQo+dDt9efwMLHwSCZP5pjlf3KZ//Y0wBg+FQSug31WSW1pTx4XFuDXniNd+kQAD9VDqG8bgEc7intNZs2sG6P/nln6tGxe+KPQ8pvqAt5ea4P7JNAgAOEKZ0jW1NXLtTX8th8j6sLP2J3xdbxrUYUtpQ9SynWHp5tPDDSYxKvEnGG98YpKr2cerkpsG4yeZy/Mg==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 216.228.112.34) smtp.rcpttodomain=monjalon.net smtp.mailfrom=nvidia.com;\n dmarc=pass (p=quarantine sp=quarantine pct=100) action=none\n header.from=nvidia.com; dkim=none (message not signed); arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=5h65FyPoGGqt+ZO2zf6v7Jd+eTpDH3U2bKTNJkmhSsU=;\n b=PWQV3wqCcC4bnY55mpPQY2EL2s8EAeDV6ds+ieNzU1ExvKO0Z8UTOFXCljdV2lP7xb6LIZOBLXxZFPCRshbRelgApd5MPPFPR/bK7qrB+TmRDf9PotJ4fHPn6up3Zx6iLCWCFGLmnDf7nksDJKu/P3i4l65Owe1JhgAJAZS4O4HZZyTjcfAiTDuctvjK/SUQWjqcxwBDVp5ysoIJikUDqtd0ep0l0L/e6cgxxiIxvT9KLR6UuGbZFFUAM7cLtpQdkxcEZHS1K7xUX3d34X+DdN7Ll2kw81MfFUlpbb1tumkM41H8vJiGb2GQSm9YfAJ8RP9RmikKcXV+L3VEZBYMpA==",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 216.228.112.34)\n smtp.mailfrom=nvidia.com; monjalon.net; dkim=none (message not signed)\n header.d=none;monjalon.net; dmarc=pass action=none header.from=nvidia.com;",
        "Received-SPF": "Pass (protection.outlook.com: domain of nvidia.com designates\n 216.228.112.34 as permitted sender) receiver=protection.outlook.com;\n client-ip=216.228.112.34; helo=mail.nvidia.com;",
        "From": "Xueming Li <xuemingl@nvidia.com>",
        "To": "<dev@dpdk.org>, Gaetan Rivet <grive@u256.net>",
        "CC": "<xuemingl@nvidia.com>, Thomas Monjalon <thomas@monjalon.net>, \"Lior\n Margalit\" <lmargalit@nvidia.com>",
        "Date": "Wed, 20 Oct 2021 15:31:51 +0800",
        "Message-ID": "<20211020073151.2374674-4-xuemingl@nvidia.com>",
        "X-Mailer": "git-send-email 2.33.0",
        "In-Reply-To": "<20211020073151.2374674-1-xuemingl@nvidia.com>",
        "References": "<20211005155435.279043-1-xuemingl@nvidia.com>\n <20211020073151.2374674-1-xuemingl@nvidia.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[172.20.187.5]",
        "X-ClientProxiedBy": "HQMAIL111.nvidia.com (172.20.187.18) To\n HQMAIL107.nvidia.com (172.20.187.13)",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "8c3f9a42-3970-48e2-cc36-08d9939bbf61",
        "X-MS-TrafficTypeDiagnostic": "BN8PR12MB3217:",
        "X-LD-Processed": "43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr",
        "X-Microsoft-Antispam-PRVS": "\n <BN8PR12MB3217021344261ED5F4F9FE94A1BE9@BN8PR12MB3217.namprd12.prod.outlook.com>",
        "X-MS-Oob-TLC-OOBClassifiers": "OLM:94;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n VXiDHb6dWwjQg4O94cM6bzV/K7sq2ICFja5sYV/VE6bpEwPSbysm9ChQrr3w8iyL99i5N3vUOdsWJKFu8QUj3kUNjjfAxEQWLaWJIJr4s2q+v6B7zByrhEwnAaEgplz87UYpnYP6dGubeXhB9l1beQaL63Mz+U0VcwiQzZaYzLWpY9bOI7YxwFc001bzcHmQojY67AMVbkgL91h+vLdV4xPCN9VH32fsdkvOxSpdQC9psjBedQYLgeR458yPmt1vXGGFJ9dbIZjUYFssV6cWaTmMtzgYwGujca8PMKTHFh7HhwfYNCIsFBABk38HwBmH+J/zBk2LVuQdoYhAsczHnLpqaRON4eCH/0X/8hvoBK7sZf43ypSHhPQ5uQZ3D3LVjU7Fwp+PuDT6aY8Co3sZuwlp3qoa7Ao7HmJYOGS4ahScOSxHS/q9tG/jx7CM3dElXLpAen9FD4eA5CwG7sB0/lieR2VI0LTJfOEYoVlqz9nRyD4am7I9BGk5FobnXUyg++TFjZT4+PIX/dn7miG/I2WtxHaFwOolaOp1E9HjFhx0WqCrxFwVKU5jLggU8iccnf42aOPhaWUYBGJvNU5FoUyN7hpe0QjTR8adsziEihcltairMH5fTgIpTXnRbaMlg46F04WIJ0wL4JT7SVc8ig79k1c5nIwoyTa2ran4eyXp9ViAuBp7J3bepkM53QTOnUJMm0LzBXJY35Ub3jCyZw==",
        "X-Forefront-Antispam-Report": "CIP:216.228.112.34; CTRY:US; LANG:en; SCL:1;\n SRV:;\n IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid03.nvidia.com; CAT:NONE;\n SFS:(4636009)(46966006)(36840700001)(6286002)(30864003)(26005)(47076005)(36756003)(1076003)(8936002)(70206006)(316002)(2616005)(5660300002)(110136005)(336012)(508600001)(8676002)(7696005)(426003)(70586007)(4326008)(36860700001)(2906002)(82310400003)(54906003)(86362001)(83380400001)(55016002)(356005)(7636003)(107886003)(6666004)(186003)(16526019);\n DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "Nvidia.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "20 Oct 2021 07:32:18.7778 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 8c3f9a42-3970-48e2-cc36-08d9939bbf61",
        "X-MS-Exchange-CrossTenant-Id": "43083d15-7273-40c1-b7db-39efd9ccc17a",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.34];\n Helo=[mail.nvidia.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n DM6NAM11FT008.eop-nam11.prod.protection.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "BN8PR12MB3217",
        "Subject": "[dpdk-dev] [PATCH v2 3/3] test/devargs: add devargs test cases",
        "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": "Initial version to test Global devargs syntax.\n\nSigned-off-by: Xueming Li <xuemingl@nvidia.com>\n---\n app/test/autotest_data.py | 803 ++++++++++++++++++++++++++++++++++++++\n app/test/meson.build      |   2 +\n app/test/test_devargs.c   | 184 +++++++++\n 3 files changed, 989 insertions(+)\n create mode 100644 app/test/autotest_data.py\n create mode 100644 app/test/test_devargs.c",
    "diff": "diff --git a/app/test/autotest_data.py b/app/test/autotest_data.py\nnew file mode 100644\nindex 00000000000..3b841e71918\n--- /dev/null\n+++ b/app/test/autotest_data.py\n@@ -0,0 +1,803 @@\n+#!/usr/bin/env python3\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2010-2014 Intel Corporation\n+\n+# Test data for autotests\n+\n+from autotest_test_funcs import *\n+\n+# groups of tests that can be run in parallel\n+# the grouping has been found largely empirically\n+parallel_test_list = [\n+    {\n+        \"Name\":    \"Timer autotest\",\n+        \"Command\": \"timer_autotest\",\n+        \"Func\":    timer_autotest,\n+        \"Report\":   None,\n+    },\n+    {\n+        \"Name\":    \"Debug autotest\",\n+        \"Command\": \"debug_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Errno autotest\",\n+        \"Command\": \"errno_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Meter autotest\",\n+        \"Command\": \"meter_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Common autotest\",\n+        \"Command\": \"common_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Resource autotest\",\n+        \"Command\": \"resource_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Memory autotest\",\n+        \"Command\": \"memory_autotest\",\n+        \"Func\":    memory_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Read/write lock autotest\",\n+        \"Command\": \"rwlock_autotest\",\n+        \"Func\":    rwlock_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Lcores autotest\",\n+        \"Command\": \"lcores_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Logs autotest\",\n+        \"Command\": \"logs_autotest\",\n+        \"Func\":    logs_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"CPU flags autotest\",\n+        \"Command\": \"cpuflags_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Version autotest\",\n+        \"Command\": \"version_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"EAL filesystem autotest\",\n+        \"Command\": \"eal_fs_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"EAL flags autotest\",\n+        \"Command\": \"eal_flags_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Hash autotest\",\n+        \"Command\": \"hash_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"LPM autotest\",\n+        \"Command\": \"lpm_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"LPM6 autotest\",\n+        \"Command\": \"lpm6_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"RIB autotest\",\n+        \"Command\": \"rib_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"RIB slow autotest\",\n+        \"Command\": \"rib_slow_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"RIB6 autotest\",\n+        \"Command\": \"rib6_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"RIB6 slow autotest\",\n+        \"Command\": \"rib6_slow_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"FIB autotest\",\n+        \"Command\": \"fib_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"FIB slow autotest\",\n+        \"Command\": \"fib_slow_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"FIB6 autotest\",\n+        \"Command\": \"fib6_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"FIB6 slow autotest\",\n+        \"Command\": \"fib6_slow_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Memcpy autotest\",\n+        \"Command\": \"memcpy_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Memzone autotest\",\n+        \"Command\": \"memzone_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"String autotest\",\n+        \"Command\": \"string_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Malloc autotest\",\n+        \"Command\": \"malloc_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Multi-process autotest\",\n+        \"Command\": \"multiprocess_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Mbuf autotest\",\n+        \"Command\": \"mbuf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Per-lcore autotest\",\n+        \"Command\": \"per_lcore_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Ring autotest\",\n+        \"Command\": \"ring_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Spinlock autotest\",\n+        \"Command\": \"spinlock_autotest\",\n+        \"Func\":    spinlock_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Ticketlock autotest\",\n+        \"Command\": \"ticketlock_autotest\",\n+        \"Func\":    ticketlock_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"MCSlock autotest\",\n+        \"Command\": \"mcslock_autotest\",\n+        \"Func\":    mcslock_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Byte order autotest\",\n+        \"Command\": \"byteorder_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"TAILQ autotest\",\n+        \"Command\": \"tailq_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Command-line autotest\",\n+        \"Command\": \"cmdline_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Interrupts autotest\",\n+        \"Command\": \"interrupt_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Function reentrancy autotest\",\n+        \"Command\": \"func_reentrancy_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Mempool autotest\",\n+        \"Command\": \"mempool_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Atomics autotest\",\n+        \"Command\": \"atomic_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Prefetch autotest\",\n+        \"Command\": \"prefetch_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Red autotest\",\n+        \"Command\": \"red_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"PMD ring autotest\",\n+        \"Command\": \"ring_pmd_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Access list control autotest\",\n+        \"Command\": \"acl_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Sched autotest\",\n+        \"Command\": \"sched_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Eventdev selftest octeontx\",\n+        \"Command\": \"eventdev_selftest_octeontx\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Event ring autotest\",\n+        \"Command\": \"event_ring_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Table autotest\",\n+        \"Command\": \"table_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Flow classify autotest\",\n+        \"Command\": \"flow_classify_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Event eth rx adapter autotest\",\n+        \"Command\": \"event_eth_rx_adapter_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"User delay\",\n+        \"Command\": \"user_delay_us\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Rawdev autotest\",\n+        \"Command\": \"rawdev_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Kvargs autotest\",\n+        \"Command\": \"kvargs_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Link bonding autotest\",\n+        \"Command\": \"link_bonding_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Link bonding mode4 autotest\",\n+        \"Command\": \"link_bonding_mode4_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Link bonding rssconf autotest\",\n+        \"Command\": \"link_bonding_rssconf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Crc autotest\",\n+        \"Command\": \"crc_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Distributor autotest\",\n+        \"Command\": \"distributor_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Reorder autotest\",\n+        \"Command\": \"reorder_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Barrier autotest\",\n+        \"Command\": \"barrier_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Bitmap test\",\n+        \"Command\": \"bitmap_test\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Bitops test\",\n+        \"Command\": \"bitops_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Hash multiwriter autotest\",\n+        \"Command\": \"hash_multiwriter_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Service autotest\",\n+        \"Command\": \"service_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Timer racecond autotest\",\n+        \"Command\": \"timer_racecond_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Member autotest\",\n+        \"Command\": \"member_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":   \"Efd_autotest\",\n+        \"Command\": \"efd_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Thash autotest\",\n+        \"Command\": \"thash_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Hash function autotest\",\n+        \"Command\": \"hash_functions_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Cryptodev sw mvsam autotest\",\n+        \"Command\": \"cryptodev_sw_mvsam_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Cryptodev dpaa2 sec autotest\",\n+        \"Command\": \"cryptodev_dpaa2_sec_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Cryptodev dpaa sec autotest\",\n+        \"Command\": \"cryptodev_dpaa_sec_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Cryptodev qat autotest\",\n+        \"Command\": \"cryptodev_qat_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Cryptodev aesni mb autotest\",\n+        \"Command\": \"cryptodev_aesni_mb_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Cryptodev openssl autotest\",\n+        \"Command\": \"cryptodev_openssl_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Cryptodev scheduler autotest\",\n+        \"Command\": \"cryptodev_scheduler_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Cryptodev aesni gcm autotest\",\n+        \"Command\": \"cryptodev_aesni_gcm_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Cryptodev null autotest\",\n+        \"Command\": \"cryptodev_null_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Cryptodev sw snow3g autotest\",\n+        \"Command\": \"cryptodev_sw_snow3g_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Cryptodev sw kasumi autotest\",\n+        \"Command\": \"cryptodev_sw_kasumi_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Cryptodev_sw_zuc_autotest\",\n+        \"Command\": \"cryptodev_sw_zuc_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Reciprocal division\",\n+        \"Command\": \"reciprocal_division\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Red all\",\n+        \"Command\": \"red_all\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+\t\"Name\":    \"Fbarray autotest\",\n+\t\"Command\": \"fbarray_autotest\",\n+\t\"Func\":    default_autotest,\n+\t\"Report\":  None,\n+    },\n+    {\n+\t\"Name\":    \"External memory autotest\",\n+\t\"Command\": \"external_mem_autotest\",\n+\t\"Func\":    default_autotest,\n+\t\"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Metrics autotest\",\n+        \"Command\": \"metrics_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Bitratestats autotest\",\n+        \"Command\": \"bitratestats_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Latencystats autotest\",\n+        \"Command\": \"latencystats_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Pdump autotest\",\n+        \"Command\": \"pdump_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"IPsec_SAD\",\n+        \"Command\": \"ipsec_sad_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Checksum autotest\",\n+        \"Command\": \"cksum_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    #\n+    #Please always keep all dump tests at the end and together!\n+    #\n+    {\n+        \"Name\":    \"Dump physmem\",\n+        \"Command\": \"dump_physmem\",\n+        \"Func\":    dump_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Dump memzone\",\n+        \"Command\": \"dump_memzone\",\n+        \"Func\":    dump_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Dump struct sizes\",\n+        \"Command\": \"dump_struct_sizes\",\n+        \"Func\":    dump_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Dump mempool\",\n+        \"Command\": \"dump_mempool\",\n+        \"Func\":    dump_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Dump malloc stats\",\n+        \"Command\": \"dump_malloc_stats\",\n+        \"Func\":    dump_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Dump devargs\",\n+        \"Command\": \"dump_devargs\",\n+        \"Func\":    dump_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Dump log types\",\n+        \"Command\": \"dump_log_types\",\n+        \"Func\":    dump_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Dump_ring\",\n+        \"Command\": \"dump_ring\",\n+        \"Func\":    dump_autotest,\n+        \"Report\":  None,\n+    },\n+]\n+\n+# tests that should not be run when any other tests are running\n+non_parallel_test_list = [\n+    {\n+        \"Name\":    \"Eventdev common autotest\",\n+        \"Command\": \"eventdev_common_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Eventdev selftest sw\",\n+        \"Command\": \"eventdev_selftest_sw\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"KNI autotest\",\n+        \"Command\": \"kni_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Mempool performance autotest\",\n+        \"Command\": \"mempool_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Memcpy performance autotest\",\n+        \"Command\": \"memcpy_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Hash performance autotest\",\n+        \"Command\": \"hash_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Hash read-write concurrency functional autotest\",\n+        \"Command\": \"hash_readwrite_func_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Hash read-write concurrency perf autotest\",\n+        \"Command\": \"hash_readwrite_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Hash read-write lock-free concurrency perf autotest\",\n+        \"Command\": \"hash_readwrite_lf_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":       \"Power autotest\",\n+        \"Command\":    \"power_autotest\",\n+        \"Func\":       default_autotest,\n+        \"Report\":      None,\n+    },\n+    {\n+        \"Name\":       \"Power cpufreq autotest\",\n+        \"Command\":    \"power_cpufreq_autotest\",\n+        \"Func\":       default_autotest,\n+        \"Report\":     None,\n+    },\n+    {\n+        \"Name\":       \"Power KVM VM  autotest\",\n+        \"Command\":    \"power_kvm_vm_autotest\",\n+        \"Func\":       default_autotest,\n+        \"Report\":     None,\n+    },\n+    {\n+        \"Name\":    \"Timer performance autotest\",\n+        \"Command\": \"timer_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+\n+        \"Name\":    \"Pmd perf autotest\",\n+        \"Command\": \"pmd_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Ring pmd perf autotest\",\n+        \"Command\": \"ring_pmd_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Distributor perf autotest\",\n+        \"Command\": \"distributor_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Red_perf\",\n+        \"Command\": \"red_perf\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Lpm6 perf autotest\",\n+        \"Command\": \"lpm6_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Lpm perf autotest\",\n+        \"Command\": \"lpm_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"FIB perf autotest\",\n+        \"Command\": \"fib_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"FIB6 perf autotest\",\n+        \"Command\": \"fib6_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+         \"Name\":    \"Efd perf autotest\",\n+         \"Command\": \"efd_perf_autotest\",\n+         \"Func\":    default_autotest,\n+         \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Member perf autotest\",\n+        \"Command\": \"member_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Reciprocal division perf\",\n+        \"Command\": \"reciprocal_division_perf\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"RCU QSBR autotest\",\n+        \"Command\": \"rcu_qsbr_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"RCU QSBR performance autotest\",\n+        \"Command\": \"rcu_qsbr_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    {\n+        \"Name\":    \"Devargs autotest\",\n+        \"Command\": \"devargs_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+    #\n+    # Please always make sure that ring_perf is the last test!\n+    #\n+    {\n+        \"Name\":    \"Ring performance autotest\",\n+        \"Command\": \"ring_perf_autotest\",\n+        \"Func\":    default_autotest,\n+        \"Report\":  None,\n+    },\n+]\ndiff --git a/app/test/meson.build b/app/test/meson.build\nindex a16374b7a10..842388b0d32 100644\n--- a/app/test/meson.build\n+++ b/app/test/meson.build\n@@ -42,6 +42,7 @@ test_sources = files(\n         'test_cryptodev_security_pdcp.c',\n         'test_cycles.c',\n         'test_debug.c',\n+        'test_devargs.c',\n         'test_distributor.c',\n         'test_distributor_perf.c',\n         'test_dmadev.c',\n@@ -204,6 +205,7 @@ fast_tests = [\n         ['common_autotest', true],\n         ['cpuflags_autotest', true],\n         ['debug_autotest', true],\n+        ['devargs_autotest', true],\n         ['eal_flags_c_opt_autotest', false],\n         ['eal_flags_main_opt_autotest', false],\n         ['eal_flags_n_opt_autotest', false],\ndiff --git a/app/test/test_devargs.c b/app/test/test_devargs.c\nnew file mode 100644\nindex 00000000000..13e95f052b0\n--- /dev/null\n+++ b/app/test/test_devargs.c\n@@ -0,0 +1,184 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2021 NVIDIA Corporation & Affiliates\n+ */\n+\n+#include <stdlib.h>\n+#include <stdio.h>\n+#include <string.h>\n+\n+#include <rte_common.h>\n+#include <rte_devargs.h>\n+#include <rte_kvargs.h>\n+#include <rte_bus.h>\n+#include <rte_class.h>\n+\n+#include \"test.h\"\n+\n+/* Check layer arguments. */\n+static int\n+test_args(const char *devargs, const char *layer, const char *args, const int n)\n+{\n+\tstruct rte_kvargs *kvlist;\n+\n+\tif (n == 0) {\n+\t\tif (args != NULL && strlen(args) > 0) {\n+\t\t\tprintf(\"rte_devargs_parse(%s) %s args parsed (not expected)\\n\",\n+\t\t\t       devargs, layer);\n+\t\t\treturn -1;\n+\t\t} else {\n+\t\t\treturn 0;\n+\t\t}\n+\t}\n+\tif (args == NULL) {\n+\t\tprintf(\"rte_devargs_parse(%s) %s args not parsed\\n\",\n+\t\t       devargs, layer);\n+\t\treturn -1;\n+\t}\n+\tkvlist = rte_kvargs_parse(args, NULL);\n+\tif (kvlist == NULL) {\n+\t\tprintf(\"rte_devargs_parse(%s) %s_str: %s not parsed\\n\",\n+\t\t       devargs, layer, args);\n+\t\treturn -1;\n+\t}\n+\tif ((int)kvlist->count != n) {\n+\t\tprintf(\"rte_devargs_parse(%s) %s_str: %s kv number %u, not %d\\n\",\n+\t\t       devargs, layer, args, kvlist->count, n);\n+\t\treturn -1;\n+\t}\n+\treturn 0;\n+}\n+\n+/* Test several valid cases */\n+static int\n+test_valid_devargs(void)\n+{\n+\tstatic const struct {\n+\t\tconst char *devargs;\n+\t\tint bus_kv;\n+\t\tint class_kv;\n+\t\tint driver_kv;\n+\t\tconst char *bus;\n+\t\tconst char *name;\n+\t\tconst char *class;\n+\t} list[] = {\n+\t\t/* Global devargs syntax: */\n+\t\t{ \"bus=pci\",\n+\t\t  1, 0, 0, \"pci\", NULL, NULL},\n+\t\t{ \"class=eth\",\n+\t\t  0, 1, 0, NULL, NULL, \"eth\" },\n+\t\t{ \"bus=pci,addr=1:2.3/class=eth/driver=abc,k0=v0\",\n+\t\t  2, 1, 2, \"pci\", \"0000:01:02.3\", \"eth\" },\n+\t\t{ \"bus=vdev,name=/dev/file/name/class=eth\",\n+\t\t  2, 1, 0, \"vdev\", \"/dev/file/name\", \"eth\" },\n+\t\t{ \"bus=vdev,name=/class/bus/path/class=eth\",\n+\t\t  2, 1, 0, \"vdev\", \"/class/bus/path\", \"eth\" },\n+\t\t{ \"bus=vdev,name=///dblslsh/class=eth\",\n+\t\t  2, 1, 0, \"vdev\", \"///dblslsh\", \"eth\" },\n+\t\t/* Legacy devargs syntax: */\n+\t\t{ \"1:2.3\", 0, 0, 0,\n+\t\t  \"pci\", \"1:2.3\", NULL },\n+\t\t{ \"pci:1:2.3,k0=v0\",\n+\t\t  0, 0, 1, \"pci\", \"1:2.3\", NULL },\n+\t\t{ \"net_virtio_user0,iface=test,path=/dev/vhost-net,queues=1\",\n+\t\t  0, 0, 3, \"vdev\", \"net_virtio_user0\", NULL },\n+\t\t{ \"net_virtio_user0,iface=test,path=/class/bus/,queues=1\",\n+\t\t  0, 0, 3, \"vdev\", \"net_virtio_user0\", NULL },\n+\t};\n+\tstruct rte_devargs da;\n+\tuint32_t i;\n+\tint ret;\n+\tint fail = 0;\n+\n+\tfor (i = 0; i < RTE_DIM(list); i++) {\n+\t\tmemset(&da, 0, sizeof(da));\n+\t\tret = rte_devargs_parse(&da, list[i].devargs);\n+\t\tif (ret < 0) {\n+\t\t\tprintf(\"rte_devargs_parse(%s) returned %d (but should not)\\n\",\n+\t\t\t       list[i].devargs, ret);\n+\t\t\tgoto fail;\n+\t\t}\n+\t\tif ((list[i].bus_kv > 0 || list[i].bus != NULL) &&\n+\t\t    da.bus == NULL) {\n+\t\t\tprintf(\"rte_devargs_parse(%s) bus not parsed\\n\",\n+\t\t\t       list[i].devargs);\n+\t\t\tgoto fail;\n+\t\t}\n+\t\tif (test_args(list[i].devargs, \"bus\", da.bus_str,\n+\t\t\t      list[i].bus_kv) != 0)\n+\t\t\tgoto fail;\n+\t\tif (list[i].bus != NULL &&\n+\t\t    strcmp(da.bus->name, list[i].bus) != 0) {\n+\t\t\tprintf(\"rte_devargs_parse(%s) bus name (%s) not expected (%s)\\n\",\n+\t\t\t       list[i].devargs, da.bus->name, list[i].bus);\n+\t\t\tgoto fail;\n+\t\t}\n+\t\tif ((list[i].class_kv > 0 || list[i].class != NULL) &&\n+\t\t    da.cls == NULL) {\n+\t\t\tprintf(\"rte_devargs_parse(%s) class not parsed\\n\",\n+\t\t\t       list[i].devargs);\n+\t\t\tgoto fail;\n+\t\t}\n+\t\tif (test_args(list[i].devargs, \"class\", da.cls_str,\n+\t\t\t      list[i].class_kv) != 0)\n+\t\t\tgoto fail;\n+\t\tif (list[i].class != NULL &&\n+\t\t    strcmp(da.cls->name, list[i].class) != 0) {\n+\t\t\tprintf(\"rte_devargs_parse(%s) class name (%s) not expected (%s)\\n\",\n+\t\t\t       list[i].devargs, da.cls->name, list[i].class);\n+\t\t\tgoto fail;\n+\t\t}\n+\t\tif (test_args(list[i].devargs, \"driver\", da.drv_str,\n+\t\t\t      list[i].driver_kv) != 0)\n+\t\t\tgoto fail;\n+\t\tif (list[i].name != NULL &&\n+\t\t    strcmp(da.name, list[i].name) != 0) {\n+\t\t\tprintf(\"rte_devargs_parse(%s) device name (%s) not expected (%s)\\n\",\n+\t\t\t       list[i].devargs, da.name, list[i].name);\n+\t\t\tgoto fail;\n+\t\t}\n+\t\tgoto cleanup;\n+fail:\n+\t\tfail = -1;\n+cleanup:\n+\t\trte_devargs_reset(&da);\n+\t}\n+\treturn fail;\n+}\n+\n+/* Test several invalid cases */\n+static int\n+test_invalid_devargs(void)\n+{\n+\tstatic const char * const list[] = {\n+\t\t\"bus=wrong-bus\",\n+\t\t\"class=wrong-class\"};\n+\tstruct rte_devargs da;\n+\tuint32_t i;\n+\tint ret;\n+\tint fail = 0;\n+\n+\tfor (i = 0; i < RTE_DIM(list); i++) {\n+\t\tret = rte_devargs_parse(&da, list[i]);\n+\t\tif (ret >= 0) {\n+\t\t\tprintf(\"rte_devargs_parse(%s) returned %d (but should not)\\n\",\n+\t\t\t       list[i], ret);\n+\t\t\tfail = ret;\n+\t\t}\n+\t\trte_devargs_reset(&da);\n+\t}\n+\treturn fail;\n+}\n+\n+static int\n+test_devargs(void)\n+{\n+\tprintf(\"== test valid case ==\\n\");\n+\tif (test_valid_devargs() < 0)\n+\t\treturn -1;\n+\tprintf(\"== test invalid case ==\\n\");\n+\tif (test_invalid_devargs() < 0)\n+\t\treturn -1;\n+\treturn 0;\n+}\n+\n+REGISTER_TEST_COMMAND(devargs_autotest, test_devargs);\n",
    "prefixes": [
        "v2",
        "3/3"
    ]
}