From patchwork Mon Dec 3 14:15:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Freimann X-Patchwork-Id: 48496 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id EE85E5F44; Mon, 3 Dec 2018 15:15:52 +0100 (CET) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id EA7A15F22 for ; Mon, 3 Dec 2018 15:15:50 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 40D7D87628; Mon, 3 Dec 2018 14:15:50 +0000 (UTC) Received: from localhost (dhcp-192-205.str.redhat.com [10.33.192.205]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CBBBD6295B; Mon, 3 Dec 2018 14:15:16 +0000 (UTC) From: Jens Freimann To: dev@dpdk.org Cc: tiwei.bie@intel.com, maxime.coquelin@redhat.com, Gavin.Hu@arm.com Date: Mon, 3 Dec 2018 15:15:06 +0100 Message-Id: <20181203141515.28368-1-jfreimann@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 03 Dec 2018 14:15:50 +0000 (UTC) Subject: [dpdk-dev] [PATCH v11 0/9] implement packed virtqueues X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This is a basic implementation of packed virtqueues as specified in the Virtio 1.1 draft. A compiled version of the current draft is available at https://github.com/oasis-tcs/virtio-docs.git (or as .pdf at https://github.com/oasis-tcs/virtio-docs/blob/master/virtio-v1.1-packed-wd10.pdf A packed virtqueue is different from a split virtqueue in that it consists of only a single descriptor ring that replaces available and used ring, index and descriptor pointers. Each descriptor is readable and writable and has a flags field. These flags will mark if a descriptor is available or used. To detect new available descriptors even after the ring has wrapped, device and driver each have a single-bit wrap counter that is flipped from 0 to 1 and vice versa every time the last descriptor in the ring is used/made available. With this patch set I see a slight performance drop compared to split virtqueues. I tested according to http://doc.dpdk.org/guides/howto/pvp_reference_benchmark.html and I see a small performance drop of 3-4 percent in PVP and and similar numbers when doing txonly tests. I tested with DPDK v18.11 in the host and Wei's v3 QEMU series for packed ring [1]. The root cause of this is still under investigation and will hopefully be fixed in the next version of this patch set. I'm posting this in the current state so people can review and possibly do their own tests. regards, Jens [1] https://github.com/jensfr/qemu/tree/wexu-packed-ring-v3 v10-v11: * this version includes some fixes from Tiwei, so I added his Signed-off-by to some of the patches * fix hang with mergable rx buffers (Tiwei) * clean-up code and simplify buffer handling (Tiwei) * rebase to current virtio-next master branch v9-v10: * don't mix index into buffer list and descriptors * whitespace and formatting issues * remove "VQ:" in dump virtqueue patch * add extra packed vring struct to virtqueue and change function prototypes and code accordingly * move wrap_counters to virtqueue * make if-conditions for packed and !packed more clear in set_rxtx_funcs() * initialize wrap counters in first patch, instead of rx and tx implementation patch * make virtio-user not supported with packed virtqueues, to be fixed in other patch set? v8-v9: * fix virtio_ring_free_chain_packed() to handle descriptors correctly in case of out-of-order * fix check in virtqueue_xmit_cleanup_packed() to improve performance v7->v8: * move desc_is_used change to correct patch * remove trailing newline * correct xmit code, flags update and memory barrier * move packed desc init to dedicated function, split and packed variant Jens Freimann (8): net/virtio: vring init for packed queues net/virtio: add packed virtqueue defines net/virtio: add packed virtqueue helpers net/virtio: dump packed virtqueue data net/virtio: implement transmit path for packed queues net/virtio: implement receive path for packed queues net/virtio: add virtio send command packed queue support net/virtio: enable packed virtqueues by default Yuanhan Liu (1): net/virtio-user: add option to use packed queues drivers/net/virtio/virtio_ethdev.c | 227 +++++-- drivers/net/virtio/virtio_ethdev.h | 8 + drivers/net/virtio/virtio_pci.h | 7 + drivers/net/virtio/virtio_ring.h | 64 +- drivers/net/virtio/virtio_rxtx.c | 604 +++++++++++++++++- .../net/virtio/virtio_user/virtio_user_dev.c | 19 +- .../net/virtio/virtio_user/virtio_user_dev.h | 2 +- drivers/net/virtio/virtio_user_ethdev.c | 14 +- drivers/net/virtio/virtqueue.c | 22 + drivers/net/virtio/virtqueue.h | 122 +++- 10 files changed, 1014 insertions(+), 75 deletions(-)