From patchwork Tue Mar 8 12:34:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xuan Zhuo X-Patchwork-Id: 1602956 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=jxs5ZWSa; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-um-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KCZYT41wDz9sG9 for ; Tue, 8 Mar 2022 23:35:41 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=ZzVXfsUsWLadRl1mhFqtyiruwU/H3ztNYsPUPv52HtA=; b=jxs5ZWSaahzi8C qDNK0elNVImSZgBexP6OKGhiyC4eRboDXUN+cQ4fQ8w74BFsFYue72MnP9UCX5WEo+05RP0N6w2K+ WYHOk8/Jiosb2l3MIOOmryTOBCtiUvbjUCMnRGddmAYCH7DxybcJyAAEB5R1B3jl2q1FlNQABJWcF XH3rU4w0asQQNgOJZ7qn+KzMImaQ8HTkJGzsl26mk8J4VJik2BCNEs/o4WluAcGwkp3ORy7SA2BvY tH5c92LD8JZ1In11eEQb2OmbqHwGNUeXgMI8vtUGLR6UOj8XJ+8bKpPO0fhfA9qpEOMu1DlxA1GXL diX1QsXpd3DCmaiSyXWw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nRZ3q-004N5L-VQ; Tue, 08 Mar 2022 12:35:30 +0000 Received: from out30-44.freemail.mail.aliyun.com ([115.124.30.44]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nRZ3m-004N4C-K0 for linux-um@lists.infradead.org; Tue, 08 Mar 2022 12:35:29 +0000 X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R241e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=e01e04395; MF=xuanzhuo@linux.alibaba.com; NM=1; PH=DS; RN=34; SR=0; TI=SMTPD_---0V6efcTq_1646742918; Received: from localhost(mailfrom:xuanzhuo@linux.alibaba.com fp:SMTPD_---0V6efcTq_1646742918) by smtp.aliyun-inc.com(127.0.0.1); Tue, 08 Mar 2022 20:35:19 +0800 From: Xuan Zhuo To: virtualization@lists.linux-foundation.org, netdev@vger.kernel.org Cc: Jeff Dike , Richard Weinberger , Anton Ivanov , "Michael S. Tsirkin" , Jason Wang , "David S. Miller" , Jakub Kicinski , Hans de Goede , Mark Gross , Vadim Pasternak , Bjorn Andersson , Mathieu Poirier , Cornelia Huck , Halil Pasic , Heiko Carstens , Vasily Gorbik , Christian Borntraeger , Alexander Gordeev , Sven Schnelle , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Johannes Berg , Vincent Whitchurch , Xuan Zhuo , linux-um@lists.infradead.org, platform-driver-x86@vger.kernel.org, linux-remoteproc@vger.kernel.org, linux-s390@vger.kernel.org, kvm@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH v7 00/26] virtio pci support VIRTIO_F_RING_RESET Date: Tue, 8 Mar 2022 20:34:52 +0800 Message-Id: <20220308123518.33800-1-xuanzhuo@linux.alibaba.com> X-Mailer: git-send-email 2.31.0 MIME-Version: 1.0 X-Git-Hash: f06b131dbfed X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220308_043527_023526_DE3FB866 X-CRM114-Status: GOOD ( 13.32 ) X-Spam-Score: -8.0 (--------) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: The virtio spec already supports the virtio queue reset function. This patch set is to add this function to the kernel. The relevant virtio spec information is here: https://github.com/oasis-tcs/virtio-spec/issues/124 Content analysis details: (-8.0 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [115.124.30.44 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -7.5 USER_IN_DEF_SPF_WL From: address is in the default SPF white-list -0.5 ENV_AND_HDR_SPF_MATCH Env and Hdr From used in default SPF WL Match 0.0 UNPARSEABLE_RELAY Informational: message has unparseable relay lines X-BeenThere: linux-um@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-um" Errors-To: linux-um-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org The virtio spec already supports the virtio queue reset function. This patch set is to add this function to the kernel. The relevant virtio spec information is here: https://github.com/oasis-tcs/virtio-spec/issues/124 Also regarding MMIO support for queue reset, I plan to support it after this patch is passed. Performing reset on a queue is divided into four steps: 1. virtio_reset_vq() - notify the device to reset the queue 2. virtqueue_detach_unused_buf() - recycle the buffer submitted 3. virtqueue_reset_vring() - reset the vring (may re-alloc) 4. virtio_enable_resetq() - mmap vring to device, and enable the queue The first part 1-17 of this patch set implements virtio pci's support and API for queue reset. The latter part is to make virtio-net support set_ringparam. Do these things for this feature: 1. virtio-net support rx,tx reset 2. find_vqs() support to special the max size of each vq 3. virtio-net support set_ringparam #1 -#3 : prepare #4 -#12: virtio ring support reset vring of the vq #13-#14: add helper #15-#17: virtio pci support reset queue and re-enable #18-#21: find_vqs() support sizes to special the max size of each vq #23-#24: virtio-net support rx, tx reset #22, #25, #26: virtio-net support set ringparam Test environment: Host: 4.19.91 Qemu: QEMU emulator version 6.2.50 (with vq reset support) Test Cmd: ethtool -G eth1 rx $1 tx $2; ethtool -g eth1 The default is split mode, modify Qemu virtio-net to add PACKED feature to test packed mode. Please review. Thanks. v7: 1. fix #6 subject typo 2. fix #6 ring_size_in_bytes is uninitialized 3. check by: make W=12 v6: 1. virtio_pci: use synchronize_irq(irq) to sync the irq callbacks 2. Introduce virtqueue_reset_vring() to implement the reset of vring during the reset process. May use the old vring if num of the vq not change. 3. find_vqs() support sizes to special the max size of each vq v5: 1. add virtio-net support set_ringparam v4: 1. just the code of virtio, without virtio-net 2. Performing reset on a queue is divided into these steps: 1. reset_vq: reset one vq 2. recycle the buffer from vq by virtqueue_detach_unused_buf() 3. release the ring of the vq by vring_release_virtqueue() 4. enable_reset_vq: re-enable the reset queue 3. Simplify the parameters of enable_reset_vq() 4. add container structures for virtio_pci_common_cfg v3: 1. keep vq, irq unreleased *** BLURB HERE *** Xuan Zhuo (26): virtio_pci: struct virtio_pci_common_cfg add queue_notify_data virtio: queue_reset: add VIRTIO_F_RING_RESET virtio: add helper virtqueue_get_vring_max_size() virtio_ring: split: extract the logic of creating vring virtio_ring: split: extract the logic of init vq and attach vring virtio_ring: packed: extract the logic of creating vring virtio_ring: packed: extract the logic of init vq and attach vring virtio_ring: extract the logic of freeing vring virtio_ring: split: implement virtqueue_reset_vring_split() virtio_ring: packed: implement virtqueue_reset_vring_packed() virtio_ring: introduce virtqueue_reset_vring() virtio_ring: update the document of the virtqueue_detach_unused_buf for queue reset virtio: queue_reset: struct virtio_config_ops add callbacks for queue_reset virtio: add helper for queue reset virtio_pci: queue_reset: update struct virtio_pci_common_cfg and option functions virtio_pci: queue_reset: extract the logic of active vq for modern pci virtio_pci: queue_reset: support VIRTIO_F_RING_RESET virtio: find_vqs() add arg sizes virtio_pci: support the arg sizes of find_vqs() virtio_mmio: support the arg sizes of find_vqs() virtio: add helper virtio_find_vqs_ctx_size() virtio_net: get ringparam by virtqueue_get_vring_max_size() virtio_net: split free_unused_bufs() virtio_net: support rx/tx queue reset virtio_net: set the default max ring size by find_vqs() virtio_net: support set_ringparam arch/um/drivers/virtio_uml.c | 2 +- drivers/net/virtio_net.c | 257 ++++++++-- drivers/platform/mellanox/mlxbf-tmfifo.c | 3 +- drivers/remoteproc/remoteproc_virtio.c | 2 +- drivers/s390/virtio/virtio_ccw.c | 2 +- drivers/virtio/virtio_mmio.c | 12 +- drivers/virtio/virtio_pci_common.c | 28 +- drivers/virtio/virtio_pci_common.h | 3 +- drivers/virtio/virtio_pci_legacy.c | 8 +- drivers/virtio/virtio_pci_modern.c | 146 +++++- drivers/virtio/virtio_pci_modern_dev.c | 36 ++ drivers/virtio/virtio_ring.c | 584 +++++++++++++++++------ drivers/virtio/virtio_vdpa.c | 2 +- include/linux/virtio.h | 12 + include/linux/virtio_config.h | 74 ++- include/linux/virtio_pci_modern.h | 2 + include/uapi/linux/virtio_config.h | 7 +- include/uapi/linux/virtio_pci.h | 14 + 18 files changed, 979 insertions(+), 215 deletions(-) --- 2.31.0