Show a cover letter.

GET /api/covers/41586/
Content-Type: application/json
Vary: Accept

    "id": 41586,
    "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-06-26T16:56:03",
    "name": "[v8,00/21] Device querying",
    "submitter": {
        "id": 269,
        "url": "",
        "name": "Gaëtan Rivet",
        "email": ""
    "mbox": "",
    "series": [
            "id": 249,
            "url": "",
            "web_url": "",
            "date": "2018-06-26T16:56:03",
            "name": "Device querying",
            "version": 8,
            "mbox": ""
    "comments": "",
    "headers": {
        "List-Subscribe": "<>,\n\t<>",
        "Cc": "Gaetan Rivet <>,\n\tNeil Horman <>, \n\tKeith Wiles <>, Matan Azrad <>,\n\tShreyansh Jain <>",
        "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=n81ySnrENv3bBVJgCIv8h3DnTXL+P+NJKQQ+oTJclaU=;\n\tb=gKb+LonTFh6KaLPMhw2gEXRoNGBvRZ5qxbsQZoXhLIf0Tx1Zj5gCSq+rsWFs/0zRpA\n\t6URMijFY9rf5DS0zKh8ualc8YfWOrSN99DYAR4xwDNEvY0xDrq8IT3niSkkmFJ+Rn1m4\n\tdZ09QcaYhK2D/i5UDsDUjAwEvDcJs/G91rE4ssskkk7Gu+kvH+ndkbrgvCES/YMix7g1\n\t99y5B7krJeQT2/rHA1Afil1+P6dlfTgtWmgtrgp++aN6BIs9xHiEJj8RSM972eXS/nRf\n\tqBQNMUlOb0LCTwx4gWOVre7U0Zfcskxuj6gMkVPIsCR2h5UgUux3eWrH3rv0lXsITtlg\n\twlwQ==",
        "In-Reply-To": "<>",
        "Precedence": "list",
        "Date": "Tue, 26 Jun 2018 18:56:03 +0200",
        "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=n81ySnrENv3bBVJgCIv8h3DnTXL+P+NJKQQ+oTJclaU=;\n\tb=ZdWgXXPOzmALqvaTMofJRoQXZHCRPdr3IQCPJrwpuhNfFwPsIeCw44jpe//dt5qJlY\n\tNVpf1QHnErMmwiquowPamFED6MwgqporlfYAyugsyBevOFwQbpoIaQJPVDTC5ZmKxxEo\n\t4mg5OZeNrnwx7C53uH8bmfljjzXauRmCP09GJ+H6cwMNGA8rmGLTOI6tZCGo2aZHiRrw\n\tJQBPNJSvqBmROM/4007mEfCOepum5s+ro1bPjc0P1akDueiuFr8Jsa/G1S+dhVn0UcpA\n\tSked+vH4auqVgsYnet3tks+Sk1TDCQJ7ORJODW/oBsdI7oh1mplpl7xLmkXyrvCQ4bMb\n\tlWTw==",
        "List-Unsubscribe": "<>,\n\t<>",
        "References": "<>",
        "X-Mailer": "git-send-email 2.11.0",
        "X-Gm-Message-State": "APt69E0zWC95rU4MmGYZe/l35jAsCV/DEgTgjc0rdU+dcr2g3OmccTcT\n\t1exigA/eYVcKMb0AVuhIPlhyWcC1",
        "List-Archive": "<>",
        "To": "",
        "Errors-To": "",
        "X-Google-Smtp-Source": "AAOMgpegI+iQyHPo9qWLkn+LcS03ecDAxKc9ut0WhJ/Fk09BqA5BtIKdU46AmdHANg3QQaJ4gyEGGQ==",
        "Received": [
            "from [] (localhost [])\n\tby (Postfix) with ESMTP id 96C911BDE0;\n\tTue, 26 Jun 2018 18:56:48 +0200 (CEST)",
            "from (\n\t[]) by (Postfix) with ESMTP id 5BCB91BDDE\n\tfor <>; Tue, 26 Jun 2018 18:56:47 +0200 (CEST)",
            "by with SMTP id c13-v6so8019867wrq.2\n\tfor <>; Tue, 26 Jun 2018 09:56:47 -0700 (PDT)",
            "from (\n\t[]) by with ESMTPSA id\n\tp5-v6sm2680880wre.83.2018.\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tTue, 26 Jun 2018 09:56:45 -0700 (PDT)"
        "From": "Gaetan Rivet <>",
        "List-Help": "<>",
        "List-Post": "<>",
        "Message-Id": "<>",
        "Sender": "\"dev\" <>",
        "List-Id": "DPDK patches and discussions <>",
        "Subject": "[dpdk-dev] [PATCH v8 00/21] Device querying",
        "X-BeenThere": "",
        "Return-Path": "<>",
        "Delivered-To": "",
        "X-Received": "by 2002:adf:bd89:: with SMTP id\n\tl9-v6mr2228519wrh.266.1530032206490; \n\tTue, 26 Jun 2018 09:56:46 -0700 (PDT)",
        "X-Mailman-Version": "2.1.15"
    "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\nGaetan Rivet (21):\n  devargs: add non-variadic parsing function\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\n app/test-pmd/cmdline.c                      |  51 +++++++\n doc/guides/testpmd_app_ug/testpmd_funcs.rst |  24 +++\n drivers/bus/pci/Makefile                    |   3 +-\n drivers/bus/pci/pci_common.c                |   3 +-\n drivers/bus/pci/pci_params.c                |  78 ++++++++++\n drivers/bus/pci/private.h                   |  25 +++\n drivers/bus/vdev/Makefile                   |   3 +-\n drivers/bus/vdev/vdev.c                     |  10 +-\n drivers/bus/vdev/vdev_params.c              |  62 ++++++++\n drivers/bus/vdev/vdev_private.h             |  26 ++++\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  | 186 +++++++++++++++++++++--\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             |  26 ++++\n lib/librte_ethdev/rte_class_eth.c           |  86 +++++++++++\n lib/librte_ethdev/rte_ethdev.c              |   2 +-\n lib/librte_kvargs/Makefile                  |   2 +-\n lib/librte_kvargs/rte_kvargs.c              |  35 +++++\n lib/librte_kvargs/rte_kvargs.h              |  58 +++++++\n lib/librte_kvargs/    |   8 +\n 35 files changed, 1328 insertions(+), 33 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"