get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 49553,
    "url": "https://patches.dpdk.org/api/patches/49553/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20190109165941.26622-1-jfreimann@redhat.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20190109165941.26622-1-jfreimann@redhat.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20190109165941.26622-1-jfreimann@redhat.com",
    "date": "2019-01-09T16:59:41",
    "name": "virtio-user: ctrl vq support for packed",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "668af0e14ae66e52be11bf488a703bdd12bb9e59",
    "submitter": {
        "id": 745,
        "url": "https://patches.dpdk.org/api/people/745/?format=api",
        "name": "Jens Freimann",
        "email": "jfreimann@redhat.com"
    },
    "delegate": {
        "id": 2642,
        "url": "https://patches.dpdk.org/api/users/2642/?format=api",
        "username": "mcoquelin",
        "first_name": "Maxime",
        "last_name": "Coquelin",
        "email": "maxime.coquelin@redhat.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20190109165941.26622-1-jfreimann@redhat.com/mbox/",
    "series": [
        {
            "id": 3077,
            "url": "https://patches.dpdk.org/api/series/3077/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=3077",
            "date": "2019-01-09T16:59:41",
            "name": "virtio-user: ctrl vq support for packed",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/3077/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/49553/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/49553/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 1DBFE1B5A6;\n\tWed,  9 Jan 2019 17:59:52 +0100 (CET)",
            "from mx1.redhat.com (mx1.redhat.com [209.132.183.28])\n\tby dpdk.org (Postfix) with ESMTP id 802D61B5A4\n\tfor <dev@dpdk.org>; Wed,  9 Jan 2019 17:59:50 +0100 (CET)",
            "from smtp.corp.redhat.com\n\t(int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id C63A746291;\n\tWed,  9 Jan 2019 16:59:49 +0000 (UTC)",
            "from localhost (ovpn-117-128.ams2.redhat.com [10.36.117.128])\n\tby smtp.corp.redhat.com (Postfix) with ESMTPS id 7FAB36013A;\n\tWed,  9 Jan 2019 16:59:42 +0000 (UTC)"
        ],
        "From": "Jens Freimann <jfreimann@redhat.com>",
        "To": "dev@dpdk.org",
        "Cc": "tiwei.bie@intel.com,\n\tmaxime.coquelin@redhat.com",
        "Date": "Wed,  9 Jan 2019 17:59:41 +0100",
        "Message-Id": "<20190109165941.26622-1-jfreimann@redhat.com>",
        "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.11",
        "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.29]); Wed, 09 Jan 2019 16:59:49 +0000 (UTC)",
        "Subject": "[dpdk-dev] [PATCH] virtio-user: ctrl vq support for packed",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Add support to virtio-user for control virtqueues\nand reverts commit \"5e4e7a752 net/virtio-user: fail if\ncq used with packed vq\".\n\nSigned-off-by: Jens Freimann <jfreimann@redhat.com>\n---\n .../net/virtio/virtio_user/virtio_user_dev.c  | 111 ++++++++++++++++--\n .../net/virtio/virtio_user/virtio_user_dev.h  |   8 +-\n drivers/net/virtio/virtio_user_ethdev.c       |  49 +++++++-\n 3 files changed, 151 insertions(+), 17 deletions(-)",
    "diff": "diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c\nindex b9044faff..95f66d5b4 100644\n--- a/drivers/net/virtio/virtio_user/virtio_user_dev.c\n+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c\n@@ -43,15 +43,26 @@ virtio_user_kick_queue(struct virtio_user_dev *dev, uint32_t queue_sel)\n \tstruct vhost_vring_file file;\n \tstruct vhost_vring_state state;\n \tstruct vring *vring = &dev->vrings[queue_sel];\n+\tstruct vring_packed *pq_vring = &dev->packed_vrings[queue_sel];\n \tstruct vhost_vring_addr addr = {\n \t\t.index = queue_sel,\n-\t\t.desc_user_addr = (uint64_t)(uintptr_t)vring->desc,\n-\t\t.avail_user_addr = (uint64_t)(uintptr_t)vring->avail,\n-\t\t.used_user_addr = (uint64_t)(uintptr_t)vring->used,\n \t\t.log_guest_addr = 0,\n \t\t.flags = 0, /* disable log */\n \t};\n \n+\tif (dev->features & (1ULL << VIRTIO_F_RING_PACKED)) {\n+\t\taddr.desc_user_addr =\n+\t\t\t(uint64_t)(uintptr_t)pq_vring->desc_packed;\n+\t\taddr.avail_user_addr =\n+\t\t\t(uint64_t)(uintptr_t)pq_vring->driver_event;\n+\t\taddr.used_user_addr =\n+\t\t\t(uint64_t)(uintptr_t)pq_vring->device_event;\n+\t} else {\n+\t\taddr.desc_user_addr = (uint64_t)(uintptr_t)vring->desc;\n+\t\taddr.avail_user_addr = (uint64_t)(uintptr_t)vring->avail;\n+\t\taddr.used_user_addr = (uint64_t)(uintptr_t)vring->used;\n+\t}\n+\n \tstate.index = queue_sel;\n \tstate.num = vring->num;\n \tdev->ops->send_request(dev, VHOST_USER_SET_VRING_NUM, &state);\n@@ -467,15 +478,10 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,\n \tif (!in_order)\n \t\tdev->unsupported_features |= (1ull << VIRTIO_F_IN_ORDER);\n \n-\tif (packed_vq) {\n-\t\tif (cq) {\n-\t\t\tPMD_INIT_LOG(ERR, \"control vq not supported yet with \"\n-\t\t\t\t\t  \"packed virtqueues\\n\");\n-\t\t\treturn -1;\n-\t\t}\n-\t} else {\n-\t\tdev->unsupported_features |= (1ull << VIRTIO_F_RING_PACKED);\n-\t}\n+\tif (packed_vq)\n+\t\tdev->device_features |= (1ull << VIRTIO_F_RING_PACKED);\n+\telse\n+\t\tdev->device_features &= ~(1ull << VIRTIO_F_RING_PACKED);\n \n \tif (dev->mac_specified)\n \t\tdev->frontend_features |= (1ull << VIRTIO_NET_F_MAC);\n@@ -620,6 +626,87 @@ virtio_user_handle_ctrl_msg(struct virtio_user_dev *dev, struct vring *vring,\n \treturn n_descs;\n }\n \n+static inline int\n+desc_is_avail(struct vring_packed_desc *desc, bool wrap_counter)\n+{\n+\treturn wrap_counter == !!(desc->flags & VRING_DESC_F_AVAIL(1)) &&\n+\t\twrap_counter != !!(desc->flags & VRING_DESC_F_USED(1));\n+}\n+\n+static uint32_t\n+virtio_user_handle_ctrl_msg_pq(struct virtio_user_dev *dev,\n+\t\t\t    struct vring_packed *vring,\n+\t\t\t    uint16_t idx_hdr)\n+{\n+\tstruct virtio_net_ctrl_hdr *hdr;\n+\tvirtio_net_ctrl_ack status = ~0;\n+\tuint16_t i, idx_data, idx_status;\n+\tuint32_t n_descs = 0;\n+\n+\t/* locate desc for header, data, and status */\n+\tidx_data = idx_hdr + 1;\n+\tn_descs++;\n+\n+\ti = idx_data;\n+\twhile (vring->desc_packed[i].flags & VRING_DESC_F_NEXT) {\n+\t\ti++;\n+\t\tn_descs++;\n+\t}\n+\n+\t/* locate desc for status */\n+\tidx_status = i;\n+\tn_descs++;\n+\n+\thdr = (void *)(uintptr_t)vring->desc_packed[idx_hdr].addr;\n+\tif (hdr->class == VIRTIO_NET_CTRL_MQ &&\n+\t    hdr->cmd == VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET) {\n+\t\tuint16_t queues;\n+\n+\t\tqueues = *(uint16_t *)(uintptr_t)\n+\t\t\t\tvring->desc_packed[idx_data].addr;\n+\t\tstatus = virtio_user_handle_mq(dev, queues);\n+\t}\n+\n+\t/* Update status */\n+\t*(virtio_net_ctrl_ack *)(uintptr_t)\n+\t\tvring->desc_packed[idx_status].addr = status;\n+\n+\treturn n_descs;\n+}\n+\n+void\n+virtio_user_handle_cq_packed(struct virtio_user_dev *dev, uint16_t queue_idx,\n+\t\t\t     struct virtqueue *vq)\n+{\n+\tstruct vring_packed *vring = &dev->packed_vrings[queue_idx];\n+\tuint16_t id, n_descs;\n+\tint16_t n;\n+\tbool wrap_counter = vq->used_wrap_counter;\n+\n+\twhile (desc_is_avail(&vring->desc_packed[vq->vq_used_cons_idx],\n+\t\t\t     vq->avail_wrap_counter)) {\n+\t\tid = vring->desc_packed[vq->vq_used_cons_idx].id;\n+\n+\t\tn_descs = virtio_user_handle_ctrl_msg_pq(dev, vring, id);\n+\n+\t\tvring->desc_packed[vq->vq_used_cons_idx].len = n_descs;\n+\t\tvring->desc_packed[vq->vq_used_cons_idx].id =\n+\t\t\tvq->vq_used_cons_idx;\n+\t\tn = vq->vq_used_cons_idx + n_descs - 1;\n+\t\twhile (n >= vq->vq_used_cons_idx) {\n+\t\t\tvring->desc_packed[n].flags |=\n+\t\t\t\tVRING_DESC_F_AVAIL(wrap_counter) |\n+\t\t\t\tVRING_DESC_F_USED(wrap_counter);\n+\t\t\tn--;\n+\t\t}\n+\t\tvq->vq_used_cons_idx += n_descs;\n+\t\tif (vq->vq_used_cons_idx >= dev->queue_size) {\n+\t\t\tvq->vq_used_cons_idx -= dev->queue_size;\n+\t\t\tvq->used_wrap_counter ^= 1;\n+\t\t}\n+\t}\n+}\n+\n void\n virtio_user_handle_cq(struct virtio_user_dev *dev, uint16_t queue_idx)\n {\ndiff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h\nindex 672a8161a..8be8ca622 100644\n--- a/drivers/net/virtio/virtio_user/virtio_user_dev.h\n+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h\n@@ -39,7 +39,11 @@ struct virtio_user_dev {\n \tuint16_t\tport_id;\n \tuint8_t\t\tmac_addr[ETHER_ADDR_LEN];\n \tchar\t\tpath[PATH_MAX];\n-\tstruct vring\tvrings[VIRTIO_MAX_VIRTQUEUES];\n+\tunion {\n+\t\tstruct vring\t\tvrings[VIRTIO_MAX_VIRTQUEUES];\n+\t\tstruct vring_packed\tpacked_vrings[VIRTIO_MAX_VIRTQUEUES];\n+\t};\n+\n \tstruct virtio_user_backend_ops *ops;\n \tpthread_mutex_t\tmutex;\n \tbool\t\tstarted;\n@@ -53,5 +57,7 @@ int virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,\n \t\t\t int mrg_rxbuf, int in_order, int packed_vq);\n void virtio_user_dev_uninit(struct virtio_user_dev *dev);\n void virtio_user_handle_cq(struct virtio_user_dev *dev, uint16_t queue_idx);\n+void virtio_user_handle_cq_packed(struct virtio_user_dev *dev,\n+\t\tuint16_t queue_idx, struct virtqueue *vq);\n uint8_t virtio_user_handle_mq(struct virtio_user_dev *dev, uint16_t q_pairs);\n #endif\ndiff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c\nindex 2df6eb695..efc375cd7 100644\n--- a/drivers/net/virtio/virtio_user_ethdev.c\n+++ b/drivers/net/virtio/virtio_user_ethdev.c\n@@ -271,10 +271,36 @@ virtio_user_get_queue_num(struct virtio_hw *hw, uint16_t queue_id __rte_unused)\n \treturn dev->queue_size;\n }\n \n-static int\n-virtio_user_setup_queue(struct virtio_hw *hw, struct virtqueue *vq)\n+static void\n+virtio_user_setup_queue_packed(struct virtqueue *vq,\n+\t\t\t       struct virtio_user_dev *dev)\n+\n+{\n+\tuint16_t queue_idx = vq->vq_queue_index;\n+\tuint64_t desc_addr;\n+\tuint64_t avail_addr;\n+\tuint64_t used_addr;\n+\n+\tdesc_addr = (uintptr_t)vq->vq_ring_virt_mem;\n+\tavail_addr = desc_addr + vq->vq_nentries *\n+\t\tsizeof(struct vring_packed_desc);\n+\tused_addr = RTE_ALIGN_CEIL(avail_addr +\n+\t\t\t   sizeof(struct vring_packed_desc_event),\n+\t\t\t   VIRTIO_PCI_VRING_ALIGN);\n+\tdev->packed_vrings[queue_idx].num = vq->vq_nentries;\n+\tdev->packed_vrings[queue_idx].desc_packed =\n+\t\t(void *)(uintptr_t)desc_addr;\n+\tdev->packed_vrings[queue_idx].driver_event =\n+\t\t(void *)(uintptr_t)avail_addr;\n+\tdev->packed_vrings[queue_idx].device_event =\n+\t\t(void *)(uintptr_t)used_addr;\n+\tvq->avail_wrap_counter = true;\n+\tvq->used_wrap_counter = true;\n+}\n+\n+static void\n+virtio_user_setup_queue_split(struct virtqueue *vq, struct virtio_user_dev *dev)\n {\n-\tstruct virtio_user_dev *dev = virtio_user_get_dev(hw);\n \tuint16_t queue_idx = vq->vq_queue_index;\n \tuint64_t desc_addr, avail_addr, used_addr;\n \n@@ -288,6 +314,17 @@ virtio_user_setup_queue(struct virtio_hw *hw, struct virtqueue *vq)\n \tdev->vrings[queue_idx].desc = (void *)(uintptr_t)desc_addr;\n \tdev->vrings[queue_idx].avail = (void *)(uintptr_t)avail_addr;\n \tdev->vrings[queue_idx].used = (void *)(uintptr_t)used_addr;\n+}\n+\n+static int\n+virtio_user_setup_queue(struct virtio_hw *hw, struct virtqueue *vq)\n+{\n+\tstruct virtio_user_dev *dev = virtio_user_get_dev(hw);\n+\n+\tif (vtpci_packed_queue(hw))\n+\t\tvirtio_user_setup_queue_packed(vq, dev);\n+\telse\n+\t\tvirtio_user_setup_queue_split(vq, dev);\n \n \treturn 0;\n }\n@@ -317,7 +354,11 @@ virtio_user_notify_queue(struct virtio_hw *hw, struct virtqueue *vq)\n \tstruct virtio_user_dev *dev = virtio_user_get_dev(hw);\n \n \tif (hw->cvq && (hw->cvq->vq == vq)) {\n-\t\tvirtio_user_handle_cq(dev, vq->vq_queue_index);\n+\t\tif (vtpci_packed_queue(vq->hw))\n+\t\t\tvirtio_user_handle_cq_packed(dev, vq->vq_queue_index,\n+\t\t\t\t\t\t     vq);\n+\t\telse\n+\t\t\tvirtio_user_handle_cq(dev, vq->vq_queue_index);\n \t\treturn;\n \t}\n \n",
    "prefixes": []
}