Show a cover letter.

GET /api/covers/42169/?format=api
Content-Type: application/json
Vary: Accept

    "id": 42169,
    "url": "",
    "web_url": "",
    "project": {
        "id": 1,
        "url": "",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "",
        "list_email": "",
        "web_url": "",
        "scm_url": "git://",
        "webscm_url": ""
    "msgid": "<>",
    "date": "2018-07-03T22:14:43",
    "name": "[v9,00/27] Device querying",
    "submitter": {
        "id": 269,
        "url": "",
        "name": "Gaëtan Rivet",
        "email": ""
    "mbox": "",
    "series": [
            "id": 383,
            "url": "",
            "web_url": "",
            "date": "2018-07-03T22:14:43",
            "name": "Device querying",
            "version": 9,
            "mbox": ""
    "comments": "",
    "headers": {
        "Return-Path": "<>",
        "References": "<>",
        "X-Mailman-Version": "2.1.15",
        "From": "Gaetan Rivet <>",
        "List-Post": "<>",
        "List-Help": "<>",
        "X-BeenThere": "",
        "Message-Id": "<>",
        "X-Original-To": "",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=IEUzPu65Q42tzC4h31+3xVu/XjQRm65gnITF5gqCjFU=;\n\tb=WYXdKtptSggMgoVc+eqyuRvEq0+FOJR7iAShhjNUYmx3shO0axF5rdE6M5jRybZkn5\n\tY23YCDX9SNul9KOCsqG7XIsakgRiuY3qqJF2jsM2+8yzxbMr2QzdzdVSqYSu93SFVKUJ\n\t6seCM7slLZlNi1dKJ0bb3QNYcM8qyYVbRAX05PpfZ9Ekt5/iUFbQrZw/oZV43LXGE/IE\n\t+dUbjgFnICoQ/OKToqcZS3UcDOI/qd809icNw6cuCFENv7agdZuezedYSsdr9eYsPFOH\n\tk6XtgU9EmgQZIGOYdlonaPmqBFmZpHhi4sQjg6745pIV5wrEYExHNlhW0GXFqQXSQ8UC\n\ts2BA==",
        "Received": [
            "from [] (localhost [])\n\tby (Postfix) with ESMTP id A37181BE1B;\n\tWed,  4 Jul 2018 00:15:36 +0200 (CEST)",
            "from (\n\t[]) by (Postfix) with ESMTP id E1D2F1B4C1\n\tfor <>; Wed,  4 Jul 2018 00:15:34 +0200 (CEST)",
            "by with SMTP id w16-v6so3792207wmc.2\n\tfor <>; Tue, 03 Jul 2018 15:15:34 -0700 (PDT)",
            "from (\n\t[]) by with ESMTPSA id\n\ti190-v6sm3771084wmd.33.2018.\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tTue, 03 Jul 2018 15:15:32 -0700 (PDT)"
        "X-Mailer": "git-send-email 2.11.0",
        "X-Received": "by 2002:a1c:98a:: with SMTP id\n\t132-v6mr2166880wmj.86.1530656133899; \n\tTue, 03 Jul 2018 15:15:33 -0700 (PDT)",
        "Subject": "[dpdk-dev] [PATCH v9 00/27] Device querying",
        "Precedence": "list",
        "X-Gm-Message-State": "APt69E3FgBU2VB871ME/F/PyB9RnU1RuOqq/VrqHpuIbYFgKT5TvW6Qy\n\tXm3qYTbBL2/kq1jwXWOyP75+27yt",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=IEUzPu65Q42tzC4h31+3xVu/XjQRm65gnITF5gqCjFU=;\n\tb=urn7p6CJn5ti0AN1mOIhizHad2L0Jr9Yu8+W3q5X9nxF7+Oqg5keHJ2VAu+eTnk+2N\n\tHku4706svWVKXiZ+q1ZMo5tGcWSydV1jPqnzGXnJ7kzRpUCgzB2nK0DcU6xAOj0PG070\n\tvppR2B9VjmIf+BI7AmGUldeNrQGXEwOmaczmRfJIgjyr7lEj2YD3J/HnnUx3ypK1lqqJ\n\tfx13+ksrPPxmGh2McphQzggI92Cu+FFBhgJJhff0MnmZiskWbs/qB54XCZjdlhRzS9zK\n\t3T4+98qo9ByJx3XbjbLAHws+edOl6w7S6GxNugIOae6FseTY6Issdp9LC05uZVkAM2YF\n\tYrCQ==",
        "List-Archive": "<>",
        "Date": "Wed,  4 Jul 2018 00:14:43 +0200",
        "Sender": "\"dev\" <>",
        "Errors-To": "",
        "List-Subscribe": "<>,\n\t<>",
        "X-Google-Smtp-Source": "AAOMgpcGzdpGwbLEKC4LbHQ6wNowwQKfIg8xp3VpagAbyhF7wbHCB41xGci2kgCCQMHwzidwKC75zA==",
        "Cc": "Gaetan Rivet <>,\n\tNeil Horman <>, \n\tKeith Wiles <>, Matan Azrad <>,\n\tShreyansh Jain <>",
        "List-Id": "DPDK patches and discussions <>",
        "Delivered-To": "",
        "In-Reply-To": "<>",
        "List-Unsubscribe": "<>,\n\t<>",
        "To": ""
    "content": "This patchset introduces a new EAL API for querying devices,\nfiltered by arbitrary properties.\n\nThe following elements are introduced to this end:\n\n * A new object, \"rte_class\", is used to describe\n   the device class abstraction layer (eth, crypto, ...).\n\n * Both rte_bus and rte_class now offer a way to\n   list their devices and filter the result\n   using locally defined properties.\n\n * The rte_dev API now has an rte_dev_iterator, which\n   is the way for the user to define the device filter\n   and iterate upon the resulting set.\n\nAs an example, the \"eth\" device class is implemented.\n\nAdditionally, the device filters for\n\n  + rte_bus_pci\n  + rte_bus_vdev\n  + rte_class_eth\n\nare implemented and can be used with some\nproperties each, to show how to extend those.\n\nSome example of filters:\n\n  \"bus=pci/class=eth\"\n  \"bus=pci\"\n  \"class=eth\"\n  \"class=eth,name=net_ring0\"\n  \"bus=pci,id=00:00.0\"\n  \"bus=vdev,driver=net_ring\"\n\n---\n\nv2:\n\n  * Reworked the dev_iterate callback to simplify\n    its implementation.\n\n    Now dev_iterate implementation do not need to learn\n    about the intricacies of the rte_dev_iterator.\n    The rte_dev_iterator is managed purely by the\n    rte_dev_iterator_next function. Buses and classes then\n    do not have to care about settings things right.\n\n    Additionally, dev_iterate implementations do not\n    have to sanitize their dev string anymore, they\n    are prepared by the rte_dev layer prior, which also\n    reduces the number of dynamic allocations.\n\nv3:\n\n  * Introduced central constructor priority list.\n  * Removed lightweight kvarg parsing utility,\n    using librte_kvargs instead.\n  * Reversed dependencies of librte_kvargs and\n    librte_eal.\n  * Fixed a few bugs.\n  * @Bruce: I have noted the request for meson support.\n    I will install it and attempt it once the bulk of the work is done.\n\nv4:\n\n  * Fixed a few bugs, added relevant acks,\n    fixed some typos.\n  * Made each matching functions actually check for a proper\n    list of accepted properties.\n  * rte_kvargs now includes rte_eal directly and keeps rte_log.\n  * added generic string comparison function to rte_kvargs,\n    as some kind of comparison should probably be shared by many layers.\n\nv5:\n\n  * Rebased on master\n  * Use strcspn instead of custom function.\n  * Introduce private generic rte_eth_dev iterator.\n    This could be generalized to other iterators\n    (port_next, owner_id-aware, etc).\n  * Attempted to support\n    Got lost in the implicit variables declared\n    when inversing dependencies between kvargs and EAL.\n    Removed anything related to meson.\n  * Postponed genericization of work from\n    device query to device declaration.\n    Much bigger than anticipated, will let this\n    part get in first and iterate over it.\n\nv6:\n\n  * Rebased on master\n  * Introduce RTE_PRIORITY_LAST, to explicitly set\n    the lowest constructor priority.\n  * Fix copyright notice for eth_privage.* files.\n\nv7:\n\n  * Rebased on master\n  * Fix rte_kvargs_strcmp return value.\n  * Fix layer parsing error\n    devstr \"bus=pci/onemorelayer\" now tells\n    that the additional layer is not recognized.\n\nv8:\n\n  * Rebased on master\n  * Cleaned kvargs use: introduced\n    a new parser function, that simplifies\n    using the library for DPDK devargs.\n  * Refactored devargs parsing in a single\n    function within rte_devargs.\n    This function is useful both for rte_dev\n    parsing its iterator, and for rte_devargs\n    parsing --dev parameters (not yet implemented).\n  * A few small bugfixes.\n\nv9:\n\n  * Rebased on master\n  * Fixed cyclic dependency kvargs <-> eal\n  * Fixed a few checkpatch issues\n  * Added dynamic help to testpmd for new \"show device\" command\n  * Added devargs processing stubs to\n    primary buses / classes\n  * Added new --dev generic device declaration option\n\nGaetan Rivet (27):\n  devargs: add non-variadic parsing function\n  kvargs: remove error logs\n  kvargs: build before EAL\n  kvargs: introduce a more flexible parsing function\n  eal: introduce dtor macros\n  eal: introduce device class abstraction\n  eal/class: register destructor\n  devargs: add function to parse device layers\n  eal/dev: add device iterator interface\n  eal/class: add device iteration\n  eal/bus: add device iteration\n  eal/dev: implement device iteration initialization\n  eal/dev: implement device iteration\n  kvargs: add generic string matching callback\n  bus/pci: implement device iteration and comparison\n  bus/pci: add device matching field id\n  bus/vdev: implement device iteration\n  bus/vdev: add device matching field driver\n  ethdev: add private generic device iterator\n  ethdev: register ether layer as a class\n  ethdev: add device matching field name\n  app/testpmd: add show device command\n  bus/pci: pre-process declarative PCI devargs\n  bus/vdev: pre-process declarative vdev devargs\n  bus/pci: process declarative PCI devargs\n  ethdev: process declarative eth devargs\n  eal: add generic dev parameter\n\n app/test-pmd/cmdline.c                      |  54 +++++++\n doc/guides/testpmd_app_ug/testpmd_funcs.rst |  24 +++\n drivers/bus/pci/Makefile                    |   3 +-\n drivers/bus/pci/bsd/pci.c                   |   5 +\n drivers/bus/pci/linux/pci.c                 |   5 +\n drivers/bus/pci/pci_common.c                |   4 +\n drivers/bus/pci/pci_params.c                | 143 ++++++++++++++++++\n drivers/bus/pci/private.h                   |  54 +++++++\n drivers/bus/vdev/Makefile                   |   3 +-\n drivers/bus/vdev/vdev.c                     |  20 ++-\n drivers/bus/vdev/vdev_params.c              | 112 ++++++++++++++\n drivers/bus/vdev/vdev_private.h             |  32 ++++\n drivers/net/failsafe/failsafe_args.c        |   2 +-\n drivers/net/failsafe/failsafe_eal.c         |   2 +-\n lib/Makefile                                |   5 +-\n lib/librte_eal/bsdapp/eal/Makefile          |   2 +\n lib/librte_eal/common/Makefile              |   2 +-\n lib/librte_eal/common/eal_common_class.c    |  62 ++++++++\n lib/librte_eal/common/eal_common_dev.c      | 227 +++++++++++++++++++++++++++-\n lib/librte_eal/common/eal_common_devargs.c  | 190 +++++++++++++++++++++--\n lib/librte_eal/common/eal_common_options.c  |  36 ++++-\n lib/librte_eal/common/eal_options.h         |   2 +\n lib/librte_eal/common/eal_private.h         |  27 ++++\n lib/librte_eal/common/include/rte_bus.h     |   1 +\n lib/librte_eal/common/include/rte_class.h   | 127 ++++++++++++++++\n lib/librte_eal/common/include/rte_common.h  |  24 +++\n lib/librte_eal/common/include/rte_dev.h     |  97 ++++++++++++\n lib/librte_eal/common/include/rte_devargs.h |  53 ++++++-\n lib/librte_eal/linuxapp/eal/Makefile        |   2 +\n lib/librte_eal/          |   5 +\n lib/librte_ethdev/Makefile                  |   4 +-\n lib/librte_ethdev/eth_private.c             |  31 ++++\n lib/librte_ethdev/eth_private.h             |  31 ++++\n lib/librte_ethdev/rte_class_eth.c           | 147 ++++++++++++++++++\n lib/librte_ethdev/rte_ethdev.c              |   9 +-\n lib/librte_kvargs/Makefile                  |   2 +-\n lib/librte_kvargs/rte_kvargs.c              |  57 ++++---\n lib/librte_kvargs/rte_kvargs.h              |  58 +++++++\n lib/librte_kvargs/    |   8 +\n 39 files changed, 1615 insertions(+), 57 deletions(-)\n create mode 100644 drivers/bus/pci/pci_params.c\n create mode 100644 drivers/bus/vdev/vdev_params.c\n create mode 100644 drivers/bus/vdev/vdev_private.h\n create mode 100644 lib/librte_eal/common/eal_common_class.c\n create mode 100644 lib/librte_eal/common/include/rte_class.h\n create mode 100644 lib/librte_ethdev/eth_private.c\n create mode 100644 lib/librte_ethdev/eth_private.h\n create mode 100644 lib/librte_ethdev/rte_class_eth.c"