Show a cover letter.

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

    "id": 42893,
    "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-11T21:44:50",
    "name": "[v11,00/25] Device querying",
    "submitter": {
        "id": 269,
        "url": "",
        "name": "Gaëtan Rivet",
        "email": ""
    "mbox": "",
    "series": [
            "id": 533,
            "url": "",
            "web_url": "",
            "date": "2018-07-11T21:44:50",
            "name": "Device querying",
            "version": 11,
            "mbox": ""
    "comments": "",
    "headers": {
        "List-Subscribe": "<>,\n\t<>",
        "Cc": "Gaetan Rivet <>,\n\tNeil Horman <>, \n\tShreyansh Jain <>,\n\tBruce Richardson <>,\n\tAndrew Rybchenko <>",
        "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=XR7YVfCjsHv8No0ExFZzCCfZLE5BEoBKNAwpKEjgSro=;\n\tb=B3d73GFDOBxH3hJmlmOlM9U0lCkJeBppIIXYZ9tp0Yi2k6D0S1TLvotUmu7ucUidHx\n\t7GPbZOvv2Nl38dVHloiwlKTI+/OgdMEf9lgDH76z2XtXubyOik53CjVwcGOrpUCGA/XC\n\te9y8DBTmOoHlbGN/J/oX433qHx3IKor680ycyJzVbYFKpFE+xcGmEFYm4hjo1J8jxVff\n\tXo4AMRrYYRGNBMoj//WYhnI/YA45UCGemTA56pcdIN+VshmkoSCUfig5EEwrjB9F9Hiu\n\tzJjJqiXZa67efviXJqQdD69+dyAK8hAvR+dOL6GbJZLiFh3MJVyIgqI/aWS1Yv4bFYno\n\t7S3w==",
        "In-Reply-To": "<>",
        "Precedence": "list",
        "Date": "Wed, 11 Jul 2018 23:44:50 +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=XR7YVfCjsHv8No0ExFZzCCfZLE5BEoBKNAwpKEjgSro=;\n\tb=xnNMXA9o/Il3RDXN5DILujtD0J7hZ3VIiRpPcFRh9KHQbt0XJsYqit+GnNmPaYy+F7\n\tR61PeGGVf1R6d2hyCpaBOIe8fRjJ+ONcw6XbPpQXwcyEYK3FriTlLEfYaFgud+GWhgNi\n\tbATWjSnP+NATMKm4x+9RMp4t6XWGWKALPH2ZRRmrDRV+r78ZsCChoPZAloN14TCSpBt0\n\tBcNd7yx+j1k0ztcHWEKLvUSDvYUT4gDFAbFMvUOrFC/aY2gw1C+mN5OijYWS7z71BfGJ\n\tLbnl6oyWikIbQcG9hhS7UXf9rDvQ+axuFwI0NcxRgpm9mpoZV1il9dSZDOOBOcYV/0iD\n\tf+yQ==",
        "List-Unsubscribe": "<>,\n\t<>",
        "References": "<>",
        "X-Mailer": "git-send-email 2.18.0",
        "X-Gm-Message-State": "AOUpUlG1tKJ+DeP+Yu5nwCL7fIzCcoxLZpiB9e3j8+CQETw+cFQky/oL\n\tH4m6XvIqmwY8T07Ku4UaqynlmGDf",
        "List-Archive": "<>",
        "To": "",
        "Errors-To": "",
        "X-Google-Smtp-Source": "AAOMgpcITOVMhU+2HmNzbaCvsrpRu1Dqt9FSvjG9ZRIAzmUHWzHZRaYxgNEkyJUqfuzWRUFDLQHBug==",
        "Received": [
            "from [] (localhost [])\n\tby (Postfix) with ESMTP id 84F6E1B462;\n\tWed, 11 Jul 2018 23:45:39 +0200 (CEST)",
            "from (\n\t[]) by (Postfix) with ESMTP id 9A7531B449\n\tfor <>; Wed, 11 Jul 2018 23:45:38 +0200 (CEST)",
            "by with SMTP id e7-v6so34182wrs.9\n\tfor <>; Wed, 11 Jul 2018 14:45:38 -0700 (PDT)",
            "from (\n\t[]) by with ESMTPSA id\n\th5-v6sm10550936wrr.19.2018.\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tWed, 11 Jul 2018 14:45:36 -0700 (PDT)"
        "From": "Gaetan Rivet <>",
        "List-Help": "<>",
        "List-Post": "<>",
        "Message-Id": "<>",
        "Sender": "\"dev\" <>",
        "List-Id": "DPDK patches and discussions <>",
        "Subject": "[dpdk-dev] [PATCH v11 00/25] Device querying",
        "X-BeenThere": "",
        "Return-Path": "<>",
        "Delivered-To": "",
        "X-Received": "by 2002:adf:cd82:: with SMTP id\n\tq2-v6mr236419wrj.118.1531345537602; \n\tWed, 11 Jul 2018 14:45:37 -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\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\nv10:\n\n  * Support meson build\n\nv11:\n\n  * Some cleanup, rewriting of comments\n    and commit logs.\n  * New fields in devargs and dev_it renamed.\n\nGaetan Rivet (25):\n  devargs: use rte-log functions\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  devargs: add function to parse device layers\n  eal/dev: add device iterator interface\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/                 |   6 +-\n drivers/bus/pci/pci_common.c                |   6 +-\n drivers/bus/pci/pci_params.c                | 139 ++++++++++++\n drivers/bus/pci/private.h                   |  54 +++++\n drivers/bus/vdev/Makefile                   |   3 +-\n drivers/bus/vdev/                |   5 +-\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  | 197 +++++++++++++++--\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         |  34 +++\n lib/librte_eal/common/include/rte_bus.h     |   1 +\n lib/librte_eal/common/include/rte_class.h   | 132 ++++++++++++\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/common/           |   2 +\n lib/librte_eal/linuxapp/eal/Makefile        |   2 +\n lib/librte_eal/                  |   1 +\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/               |   4 +-\n lib/librte_ethdev/rte_class_eth.c           | 148 +++++++++++++\n lib/librte_ethdev/rte_ethdev.c              |   9 +-\n lib/librte_kvargs/Makefile                  |   2 +-\n lib/librte_kvargs/               |   5 +\n lib/librte_kvargs/rte_kvargs.c              |  57 +++--\n lib/librte_kvargs/rte_kvargs.h              |  58 +++++\n lib/librte_kvargs/    |   8 +\n lib/                             |   8 +-\n 46 files changed, 1654 insertions(+), 67 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"