Show a cover letter.

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

    "id": 45067,
    "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-09-21T10:32:57",
    "name": "[v6,00/11] implement packed virtqueues",
    "submitter": {
        "id": 745,
        "url": "",
        "name": "Jens Freimann",
        "email": ""
    "mbox": "",
    "series": [
            "id": 1435,
            "url": "",
            "web_url": "",
            "date": "2018-09-21T10:32:57",
            "name": "implement packed virtqueues",
            "version": 6,
            "mbox": ""
    "comments": "",
    "headers": {
        "Return-Path": "<>",
        "X-BeenThere": "",
        "X-Mailman-Version": "2.1.15",
        "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t( []); Fri, 21 Sep 2018 10:33:16 +0000 (UTC)",
        "Date": "Fri, 21 Sep 2018 12:32:57 +0200",
        "Delivered-To": "",
        "Message-Id": "<>",
        "X-Original-To": "",
        "X-Scanned-By": "MIMEDefang 2.84 on",
        "Received": [
            "from [] (localhost [])\n\tby (Postfix) with ESMTP id DB9932BA3;\n\tFri, 21 Sep 2018 12:33:17 +0200 (CEST)",
            "from ( [])\n\tby (Postfix) with ESMTP id D80EC1DA4\n\tfor <>; Fri, 21 Sep 2018 12:33:16 +0200 (CEST)",
            "from\n\t( [])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby (Postfix) with ESMTPS id 1985588E56;\n\tFri, 21 Sep 2018 10:33:16 +0000 (UTC)",
            "from localhost ( [])\n\tby (Postfix) with ESMTPS id 03D102015AD1;\n\tFri, 21 Sep 2018 10:33:09 +0000 (UTC)"
        "List-Post": "<>",
        "List-Help": "<>",
        "Sender": "\"dev\" <>",
        "Subject": "[dpdk-dev] [PATCH v6 00/11] implement packed virtqueues",
        "Precedence": "list",
        "From": "Jens Freimann <>",
        "List-Archive": "<>",
        "Errors-To": "",
        "List-Subscribe": "<>,\n\t<>",
        "Cc": ",\n\,\n\",
        "List-Id": "DPDK patches and discussions <>",
        "List-Unsubscribe": "<>,\n\t<>",
        "To": ""
    "content": "This is a basic implementation of packed virtqueues as specified in the\nVirtio 1.1 draft. A compiled version of the current draft is available\nat (or as .pdf at\n\n\nA packed virtqueue is different from a split virtqueue in that it\nconsists of only a single descriptor ring that replaces available and\nused ring, index and descriptor buffer.\n\nEach descriptor is readable and writable and has a flags field. These flags\nwill mark if a descriptor is available or used.  To detect new available descriptors\neven after the ring has wrapped, device and driver each have a\nsingle-bit wrap counter that is flipped from 0 to 1 and vice versa every time\nthe last descriptor in the ring is used/made available.\n\nThe idea behind this is to 1. improve performance by avoiding cache misses\nand 2. be easier for devices to implement.\n\nRegarding performance: with these patches I get 21.13 Mpps on my system\nas compared to 18.8 Mpps with the virtio 1.0 code. Packet size was 64\nbytes, 0.05% acceptable loss.  Test setup is described as in\n\n\nPacket generator:\nMoonGen\nIntel(R) Xeon(R) CPU E5-2665 0 @ 2.40GHz\nIntel X710 NIC\nRHEL 7.4\n\nDevice under test:\nIntel(R) Xeon(R) CPU E5-2667 v4 @ 3.20GHz\nIntel X710 NIC\nRHEL 7.4\n\nVM on DuT: RHEL7.4\n\nI plan to do more performance test with bigger frame sizes.\n\nchanges from v5->v6:\n* fix VIRTQUEUE_DUMP macro\n* rework mergeable rx buffer path, support out of order (not sure if I\n  need a .next field to support chains) \n* move wmb in virtio_receive_pkts_packed() (Gavin)\n* rename to virtio_init_split/_packed (Maxime)\n* add support for ctrl virtqueues (Tiwei, thx Max for fixing)\n* rework tx path to support update_packet_stats and\n  virtqueue_xmit_offload, TODO: merge with split-ring code to\n  avoid a lot of duplicate code\n* remove unnecessary check for avoiding to call VIRTQUEUE_DUMP (Maxime)\n\nchanges from v4->v5:\n* fix VIRTQUEUE_DUMP macro\n* fix wrap counter logic in transmit and receive functions  \n\nchanges from v3->v4:\n* added helpers to increment index and set available/used flags\n* driver keeps track of number of descriptors used\n* change logic in set_rxtx_funcs()\n* add patch for ctrl virtqueue with support for packed virtqueues\n* rename virtio-1.1.h to virtio-packed.h\n* fix wrong sizeof() in \"vhost: vring address setup for packed queues\"\n* fix coding style of function definition in \"net/virtio: add packed\n  virtqueue helpers\"\n* fix padding in vring_size()\n* move patches to enable packed virtqueues end of series\n* v4 has two open problems: I'm sending it out anyway for feedback/help:\n * when VIRTIO_NET_F_MRG_RXBUF enabled only 128 packets are send in\n   guest, i.e. when ring is full for the first time. I suspect a bug in\n   setting the avail/used flags\n\nchanges from v2->v3:\n* implement event suppression\n* add code do dump packed virtqueues\n* don't use assert in vhost code\n* rename virtio-user parameter to packed-vq\n* support rxvf flush\n\nchanges from v1->v2:\n* don't use VIRTQ_DESC_F_NEXT in used descriptors (Jason)\n* no rte_panice() in guest triggerable code (Maxime)\n* use unlikely when checking for vq (Maxime)\n* rename everything from _1_1 to _packed  (Yuanhan)\n* add two more patches to implement mergeable receive buffers\n\n*** BLURB HERE ***\n\nJens Freimann (10):\n  net/virtio: vring init for packed queues\n  net/virtio: add packed virtqueue defines\n  net/virtio: add packed virtqueue helpers\n  net/virtio: flush packed receive virtqueues\n  net/virtio: dump packed virtqueue data\n  net/virtio: implement transmit path for packed queues\n  net/virtio: implement receive path for packed queues\n  net/virtio: add support for mergeable buffers with packed virtqueues\n  net/virtio: add virtio send command packed queue support\n  net/virtio: enable packed virtqueues by default\n\nYuanhan Liu (1):\n  net/virtio-user: add option to use packed queues\n\n drivers/net/virtio/virtio_ethdev.c            | 135 ++++-\n drivers/net/virtio/virtio_ethdev.h            |   5 +\n drivers/net/virtio/virtio_pci.h               |   8 +\n drivers/net/virtio/virtio_ring.h              |  96 +++-\n drivers/net/virtio/virtio_rxtx.c              | 490 +++++++++++++++++-\n .../net/virtio/virtio_user/virtio_user_dev.c  |  10 +-\n .../net/virtio/virtio_user/virtio_user_dev.h  |   2 +-\n drivers/net/virtio/virtio_user_ethdev.c       |  14 +-\n drivers/net/virtio/virtqueue.c                |  21 +\n drivers/net/virtio/virtqueue.h                |  50 +-\n 10 files changed, 796 insertions(+), 35 deletions(-)"