From nobody Mon May 6 05:19:37 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634705893005834.6130461453951; Tue, 19 Oct 2021 21:58:13 -0700 (PDT) Received: from localhost ([::1]:60574 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1md3g3-0004V3-UO for importer@patchew.org; Wed, 20 Oct 2021 00:58:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33414) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3eO-0001rP-FZ for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:56:28 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:59574) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3eM-0007Ru-1J for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:56:28 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-390-GMnhz-u1N52SmOLG7PfLWQ-1; Wed, 20 Oct 2021 00:56:21 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 3DF1D802575; Wed, 20 Oct 2021 04:56:20 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-13.pek2.redhat.com [10.72.13.13]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1E43660BF1; Wed, 20 Oct 2021 04:56:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634705784; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WBQBajUdM73RJjB3oYvYfkGOBCrxjtTCtVu42+syCSM=; b=D4KOVWqumAOPxqEkZuFu1fk61l6jGA4pgKE8TB7xJgW/um22GN+TIurmGqLL3mdEeSBOCq Wikh9OfJ6A2IE5FLtIMNWT0bPF9FldAP3U0OqI8p00ZKpMFZHSbjmVv9TIrNZ5EUUUJh/o gQvbsWEwfcy/b2Cl+thINnBgG5ugWU0= X-MC-Unique: GMnhz-u1N52SmOLG7PfLWQ-1 From: Jason Wang To: qemu-devel@nongnu.org, mst@redhat.com, jasowang@redhat.com Subject: [PATCH V5 01/10] vhost-vdpa: open device fd in net_init_vhost_vdpa() Date: Wed, 20 Oct 2021 12:55:51 +0800 Message-Id: <20211020045600.16082-2-jasowang@redhat.com> In-Reply-To: <20211020045600.16082-1-jasowang@redhat.com> References: <20211020045600.16082-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=jasowang@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lulu@redhat.com, gdawar@xilinx.com, eperezma@redhat.com, elic@nvidia.com, lingshan.zhu@intel.com, Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1634705895136100003 Content-Type: text/plain; charset="utf-8" This patch switches to open device fd in net_init_vhost_vpda(). This is used to prepare for the multiqueue support. Reviewed-by: Stefano Garzarella Signed-off-by: Jason Wang --- net/vhost-vdpa.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c index 6dc68d8677..fd4ff5a0fb 100644 --- a/net/vhost-vdpa.c +++ b/net/vhost-vdpa.c @@ -170,24 +170,19 @@ static NetClientInfo net_vhost_vdpa_info =3D { }; =20 static int net_vhost_vdpa_init(NetClientState *peer, const char *device, - const char *name, const char *vhostdev) + const char *name, int vdpa_device_fd) { NetClientState *nc =3D NULL; VhostVDPAState *s; - int vdpa_device_fd =3D -1; int ret =3D 0; assert(name); nc =3D qemu_new_net_client(&net_vhost_vdpa_info, peer, device, name); snprintf(nc->info_str, sizeof(nc->info_str), TYPE_VHOST_VDPA); s =3D DO_UPCAST(VhostVDPAState, nc, nc); - vdpa_device_fd =3D qemu_open_old(vhostdev, O_RDWR); - if (vdpa_device_fd =3D=3D -1) { - return -errno; - } + s->vhost_vdpa.device_fd =3D vdpa_device_fd; ret =3D vhost_vdpa_add(nc, (void *)&s->vhost_vdpa); if (ret) { - qemu_close(vdpa_device_fd); qemu_del_net_client(nc); } return ret; @@ -197,8 +192,20 @@ int net_init_vhost_vdpa(const Netdev *netdev, const ch= ar *name, NetClientState *peer, Error **errp) { const NetdevVhostVDPAOptions *opts; + int vdpa_device_fd, ret; =20 assert(netdev->type =3D=3D NET_CLIENT_DRIVER_VHOST_VDPA); opts =3D &netdev->u.vhost_vdpa; - return net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name, opts->vhostdev= ); + + vdpa_device_fd =3D qemu_open_old(opts->vhostdev, O_RDWR); + if (vdpa_device_fd =3D=3D -1) { + return -errno; + } + + ret =3D net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name, vdpa_device_f= d); + if (ret) { + qemu_close(vdpa_device_fd); + } + + return ret; } --=20 2.25.1 From nobody Mon May 6 05:19:37 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634705896165791.8470141557159; Tue, 19 Oct 2021 21:58:16 -0700 (PDT) Received: from localhost ([::1]:60850 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1md3g6-0004fx-Sr for importer@patchew.org; Wed, 20 Oct 2021 00:58:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33434) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3eV-0001wo-09 for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:56:36 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:30080) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3eT-0007ah-5N for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:56:34 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-385-X9j2iDdLM9-h-YXiZnSbvA-1; Wed, 20 Oct 2021 00:56:26 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C83E210B3940; Wed, 20 Oct 2021 04:56:25 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-13.pek2.redhat.com [10.72.13.13]) by smtp.corp.redhat.com (Postfix) with ESMTP id D680460BF1; Wed, 20 Oct 2021 04:56:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634705792; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4LXPUZxL6P/g2NeNcBm6VG8v/KK8X2q8b2zJxLm7OnE=; b=Bp7vbsReAZhZPEtRI/dmd0TeQ2soOg0vH6sLx02H2UJV23XjxtvdEQNSonCUf0CkAwptX2 YG7ynHUaxIitMpjl32gnphg2ezYgEGojiuzT59Hlwp6wGGqR4MMNWCjLqPGHfgN3ZnxxDE f0+OK/ywchZTsDiy1bE8nqpjrm3y0KY= X-MC-Unique: X9j2iDdLM9-h-YXiZnSbvA-1 From: Jason Wang To: qemu-devel@nongnu.org, mst@redhat.com, jasowang@redhat.com Subject: [PATCH V5 02/10] vhost-vdpa: classify one time request Date: Wed, 20 Oct 2021 12:55:52 +0800 Message-Id: <20211020045600.16082-3-jasowang@redhat.com> In-Reply-To: <20211020045600.16082-1-jasowang@redhat.com> References: <20211020045600.16082-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=jasowang@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: eperezma@redhat.com, elic@nvidia.com, gdawar@xilinx.com, lingshan.zhu@intel.com, lulu@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1634705897455100001 Content-Type: text/plain; charset="utf-8" Vhost-vdpa uses one device multiqueue queue (pairs) model. So we need to classify the one time request (e.g SET_OWNER) and make sure those request were only called once per device. This is used for multiqueue support. Signed-off-by: Jason Wang --- hw/virtio/vhost-vdpa.c | 53 ++++++++++++++++++++++++++++++---- include/hw/virtio/vhost-vdpa.h | 1 + 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c index 7691e904ac..67a3dcf6a5 100644 --- a/hw/virtio/vhost-vdpa.c +++ b/hw/virtio/vhost-vdpa.c @@ -317,6 +317,13 @@ static void vhost_vdpa_get_iova_range(struct vhost_vdp= a *v) v->iova_range.last); } =20 +static bool vhost_vdpa_one_time_request(struct vhost_dev *dev) +{ + struct vhost_vdpa *v =3D dev->opaque; + + return v->index !=3D 0; +} + static int vhost_vdpa_init(struct vhost_dev *dev, void *opaque, Error **er= rp) { struct vhost_vdpa *v; @@ -330,6 +337,11 @@ static int vhost_vdpa_init(struct vhost_dev *dev, void= *opaque, Error **errp) v->msg_type =3D VHOST_IOTLB_MSG_V2; =20 vhost_vdpa_get_iova_range(v); + + if (vhost_vdpa_one_time_request(dev)) { + return 0; + } + vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE | VIRTIO_CONFIG_S_DRIVER); =20 @@ -440,6 +452,10 @@ static int vhost_vdpa_memslots_limit(struct vhost_dev = *dev) static int vhost_vdpa_set_mem_table(struct vhost_dev *dev, struct vhost_memory *mem) { + if (vhost_vdpa_one_time_request(dev)) { + return 0; + } + trace_vhost_vdpa_set_mem_table(dev, mem->nregions, mem->padding); if (trace_event_get_state_backends(TRACE_VHOST_VDPA_SET_MEM_TABLE) && trace_event_get_state_backends(TRACE_VHOST_VDPA_DUMP_REGIONS)) { @@ -463,6 +479,11 @@ static int vhost_vdpa_set_features(struct vhost_dev *d= ev, uint64_t features) { int ret; + + if (vhost_vdpa_one_time_request(dev)) { + return 0; + } + trace_vhost_vdpa_set_features(dev, features); ret =3D vhost_vdpa_call(dev, VHOST_SET_FEATURES, &features); uint8_t status =3D 0; @@ -487,9 +508,12 @@ static int vhost_vdpa_set_backend_cap(struct vhost_dev= *dev) } =20 features &=3D f; - r =3D vhost_vdpa_call(dev, VHOST_SET_BACKEND_FEATURES, &features); - if (r) { - return -EFAULT; + + if (vhost_vdpa_one_time_request(dev)) { + r =3D vhost_vdpa_call(dev, VHOST_SET_BACKEND_FEATURES, &features); + if (r) { + return -EFAULT; + } } =20 dev->backend_cap =3D features; @@ -598,11 +622,21 @@ static int vhost_vdpa_dev_start(struct vhost_dev *dev= , bool started) { struct vhost_vdpa *v =3D dev->opaque; trace_vhost_vdpa_dev_start(dev, started); + if (started) { - uint8_t status =3D 0; - memory_listener_register(&v->listener, &address_space_memory); vhost_vdpa_host_notifiers_init(dev); vhost_vdpa_set_vring_ready(dev); + } else { + vhost_vdpa_host_notifiers_uninit(dev, dev->nvqs); + } + + if (vhost_vdpa_one_time_request(dev)) { + return 0; + } + + if (started) { + uint8_t status =3D 0; + memory_listener_register(&v->listener, &address_space_memory); vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK); vhost_vdpa_call(dev, VHOST_VDPA_GET_STATUS, &status); =20 @@ -611,7 +645,6 @@ static int vhost_vdpa_dev_start(struct vhost_dev *dev, = bool started) vhost_vdpa_reset_device(dev); vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE | VIRTIO_CONFIG_S_DRIVER); - vhost_vdpa_host_notifiers_uninit(dev, dev->nvqs); memory_listener_unregister(&v->listener); =20 return 0; @@ -621,6 +654,10 @@ static int vhost_vdpa_dev_start(struct vhost_dev *dev,= bool started) static int vhost_vdpa_set_log_base(struct vhost_dev *dev, uint64_t base, struct vhost_log *log) { + if (vhost_vdpa_one_time_request(dev)) { + return 0; + } + trace_vhost_vdpa_set_log_base(dev, base, log->size, log->refcnt, log->= fd, log->log); return vhost_vdpa_call(dev, VHOST_SET_LOG_BASE, &base); @@ -686,6 +723,10 @@ static int vhost_vdpa_get_features(struct vhost_dev *d= ev, =20 static int vhost_vdpa_set_owner(struct vhost_dev *dev) { + if (vhost_vdpa_one_time_request(dev)) { + return 0; + } + trace_vhost_vdpa_set_owner(dev); return vhost_vdpa_call(dev, VHOST_SET_OWNER, NULL); } diff --git a/include/hw/virtio/vhost-vdpa.h b/include/hw/virtio/vhost-vdpa.h index c288cf7ecb..3ce79a646d 100644 --- a/include/hw/virtio/vhost-vdpa.h +++ b/include/hw/virtio/vhost-vdpa.h @@ -22,6 +22,7 @@ typedef struct VhostVDPAHostNotifier { =20 typedef struct vhost_vdpa { int device_fd; + int index; uint32_t msg_type; bool iotlb_batch_begin_sent; MemoryListener listener; --=20 2.25.1 From nobody Mon May 6 05:19:37 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 163470589794860.78349802122807; Tue, 19 Oct 2021 21:58:17 -0700 (PDT) Received: from localhost ([::1]:32878 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1md3g8-0004qX-Ui for importer@patchew.org; Wed, 20 Oct 2021 00:58:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33450) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3ec-000220-FR for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:56:42 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:37243) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3ea-0007jB-TN for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:56:42 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-518-aSEJhLsiM-OAmimBYMwJ8A-1; Wed, 20 Oct 2021 00:56:39 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2A984806689; Wed, 20 Oct 2021 04:56:38 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-13.pek2.redhat.com [10.72.13.13]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5B19060BF1; Wed, 20 Oct 2021 04:56:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634705800; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6OuBEil5mGm0bOGex9y7DhiVr0xXclwj8RVIwQw1DAc=; b=J8F/1Z+VXlmz9T1tYffOthNpomo8/A2JOFqIbQQ0t8VVGKKFQ4sVYg8w/86/9fRtqU5Drc Uhi/i61u5uYuRnDiECknwhPxD4Qlibdf4yo1Snm2Q6xFr7TpBWr3QrCTxD7VHvOPgC+1/R 39l6lpQR/GedrK+kRzmR9qfnIY7hjiQ= X-MC-Unique: aSEJhLsiM-OAmimBYMwJ8A-1 From: Jason Wang To: qemu-devel@nongnu.org, mst@redhat.com, jasowang@redhat.com Subject: [PATCH V5 03/10] vhost-vdpa: prepare for the multiqueue support Date: Wed, 20 Oct 2021 12:55:53 +0800 Message-Id: <20211020045600.16082-4-jasowang@redhat.com> In-Reply-To: <20211020045600.16082-1-jasowang@redhat.com> References: <20211020045600.16082-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=jasowang@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: eperezma@redhat.com, elic@nvidia.com, gdawar@xilinx.com, lingshan.zhu@intel.com, lulu@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1634705899453100003 Content-Type: text/plain; charset="utf-8" Unlike vhost-kernel, vhost-vdpa adapts a single device multiqueue model. So we need to simply use virtqueue index as the vhost virtqueue index. This is a must for multiqueue to work for vhost-vdpa. Signed-off-by: Jason Wang --- hw/virtio/vhost-vdpa.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c index 67a3dcf6a5..40987188cf 100644 --- a/hw/virtio/vhost-vdpa.c +++ b/hw/virtio/vhost-vdpa.c @@ -544,8 +544,8 @@ static int vhost_vdpa_get_vq_index(struct vhost_dev *de= v, int idx) { assert(idx >=3D dev->vq_index && idx < dev->vq_index + dev->nvqs); =20 - trace_vhost_vdpa_get_vq_index(dev, idx, idx - dev->vq_index); - return idx - dev->vq_index; + trace_vhost_vdpa_get_vq_index(dev, idx, idx); + return idx; } =20 static int vhost_vdpa_set_vring_ready(struct vhost_dev *dev) --=20 2.25.1 From nobody Mon May 6 05:19:37 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634706082617449.29987922887403; Tue, 19 Oct 2021 22:01:22 -0700 (PDT) Received: from localhost ([::1]:40664 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1md3j7-0001Zk-Hf for importer@patchew.org; Wed, 20 Oct 2021 01:01:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33470) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3eh-0002Kj-NN for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:56:47 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:28241) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3ef-0007rW-Vm for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:56:47 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-563-lnsopeTBMwyS2JjMI2PGhw-1; Wed, 20 Oct 2021 00:56:42 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 65E58806688; Wed, 20 Oct 2021 04:56:41 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-13.pek2.redhat.com [10.72.13.13]) by smtp.corp.redhat.com (Postfix) with ESMTP id A956A60BF1; Wed, 20 Oct 2021 04:56:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634705805; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zCGdI+T0gT+l8KWgZC0lw8Tma6FcejZ/06nwvfIJxfc=; b=WxomeZCeE8RuSuodqXC9a6ukUAdM8b0ussx7k1sLCT/11I3uGG1iXyj3HV9OLtww+PGjds W26l0FWj4HIWCjsDCbnJ1pGZ7yQ+CcFPBpGxiUa5G9UNyWkf15dYivxKy1zIHMMaqHcCfG i1riWgeSNeVuURAU2IWM4mVuuDFQTXI= X-MC-Unique: lnsopeTBMwyS2JjMI2PGhw-1 From: Jason Wang To: qemu-devel@nongnu.org, mst@redhat.com, jasowang@redhat.com Subject: [PATCH V5 04/10] vhost-vdpa: let net_vhost_vdpa_init() returns NetClientState * Date: Wed, 20 Oct 2021 12:55:54 +0800 Message-Id: <20211020045600.16082-5-jasowang@redhat.com> In-Reply-To: <20211020045600.16082-1-jasowang@redhat.com> References: <20211020045600.16082-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=jasowang@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: eperezma@redhat.com, elic@nvidia.com, gdawar@xilinx.com, lingshan.zhu@intel.com, lulu@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1634706083186100003 Content-Type: text/plain; charset="utf-8" This patch switches to let net_vhost_vdpa_init() to return NetClientState *. This is used for the callers to allocate multiqueue NetClientState for multiqueue support. Signed-off-by: Jason Wang --- net/vhost-vdpa.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c index fd4ff5a0fb..151f60184d 100644 --- a/net/vhost-vdpa.c +++ b/net/vhost-vdpa.c @@ -169,8 +169,10 @@ static NetClientInfo net_vhost_vdpa_info =3D { .check_peer_type =3D vhost_vdpa_check_peer_type, }; =20 -static int net_vhost_vdpa_init(NetClientState *peer, const char *device, - const char *name, int vdpa_device_fd) +static NetClientState *net_vhost_vdpa_init(NetClientState *peer, + const char *device, + const char *name, + int vdpa_device_fd) { NetClientState *nc =3D NULL; VhostVDPAState *s; @@ -184,15 +186,17 @@ static int net_vhost_vdpa_init(NetClientState *peer, = const char *device, ret =3D vhost_vdpa_add(nc, (void *)&s->vhost_vdpa); if (ret) { qemu_del_net_client(nc); + return NULL; } - return ret; + return nc; } =20 int net_init_vhost_vdpa(const Netdev *netdev, const char *name, NetClientState *peer, Error **errp) { const NetdevVhostVDPAOptions *opts; - int vdpa_device_fd, ret; + int vdpa_device_fd; + NetClientState *nc; =20 assert(netdev->type =3D=3D NET_CLIENT_DRIVER_VHOST_VDPA); opts =3D &netdev->u.vhost_vdpa; @@ -202,10 +206,11 @@ int net_init_vhost_vdpa(const Netdev *netdev, const c= har *name, return -errno; } =20 - ret =3D net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name, vdpa_device_f= d); - if (ret) { + nc =3D net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name, vdpa_device_fd= ); + if (!nc) { qemu_close(vdpa_device_fd); + return -1; } =20 - return ret; + return 0; } --=20 2.25.1 From nobody Mon May 6 05:19:37 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634706081104755.5369882686547; Tue, 19 Oct 2021 22:01:21 -0700 (PDT) Received: from localhost ([::1]:40678 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1md3j5-0001aA-WD for importer@patchew.org; Wed, 20 Oct 2021 01:01:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33488) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3el-0002Ur-BJ for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:56:51 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:30519) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3ei-0007ue-Do for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:56:51 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-223-aDOHtTbkMzuUEBq-qJw5Vw-1; Wed, 20 Oct 2021 00:56:46 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id F26CF806668; Wed, 20 Oct 2021 04:56:44 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-13.pek2.redhat.com [10.72.13.13]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0B7E060BF1; Wed, 20 Oct 2021 04:56:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634705807; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WSWaikBtEkDK03QNZqJnrrpvFAGpr1zZ2PG0UTL58B0=; b=APDttkhOBBXD7ZEikIPkBUgKwTwRhWYXaSvvJakAAZy7SKCr8xMmf8Hv1cotOSVXHVP9+n ePIypcblwo5uWst7ss9Nxg6zy7tEcE8u3I6ZZvcLpShj6yV085WXqcEs6h2uq90IQGvPOC saKv8s+KTafLNnYB7JWP5VsUCp2r8vY= X-MC-Unique: aDOHtTbkMzuUEBq-qJw5Vw-1 From: Jason Wang To: qemu-devel@nongnu.org, mst@redhat.com, jasowang@redhat.com Subject: [PATCH V5 05/10] net: introduce control client Date: Wed, 20 Oct 2021 12:55:55 +0800 Message-Id: <20211020045600.16082-6-jasowang@redhat.com> In-Reply-To: <20211020045600.16082-1-jasowang@redhat.com> References: <20211020045600.16082-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=jasowang@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: eperezma@redhat.com, elic@nvidia.com, gdawar@xilinx.com, lingshan.zhu@intel.com, lulu@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1634706082949100001 Content-Type: text/plain; charset="utf-8" This patch introduces a boolean for the device has control queue which can accepts control command via network queue. The first user would be the control virtqueue support for vhost. Signed-off-by: Jason Wang --- include/net/net.h | 5 +++++ net/net.c | 24 +++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/include/net/net.h b/include/net/net.h index 986288eb07..523136c7ac 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -105,6 +105,7 @@ struct NetClientState { int vnet_hdr_len; bool is_netdev; bool do_not_pad; /* do not pad to the minimum ethernet frame length */ + bool is_datapath; QTAILQ_HEAD(, NetFilterState) filters; }; =20 @@ -136,6 +137,10 @@ NetClientState *qemu_new_net_client(NetClientInfo *inf= o, NetClientState *peer, const char *model, const char *name); +NetClientState *qemu_new_net_control_client(NetClientInfo *info, + NetClientState *peer, + const char *model, + const char *name); NICState *qemu_new_nic(NetClientInfo *info, NICConf *conf, const char *model, diff --git a/net/net.c b/net/net.c index 52c99196c6..f0d14dbfc1 100644 --- a/net/net.c +++ b/net/net.c @@ -239,7 +239,8 @@ static void qemu_net_client_setup(NetClientState *nc, NetClientState *peer, const char *model, const char *name, - NetClientDestructor *destructor) + NetClientDestructor *destructor, + bool is_datapath) { nc->info =3D info; nc->model =3D g_strdup(model); @@ -258,6 +259,7 @@ static void qemu_net_client_setup(NetClientState *nc, =20 nc->incoming_queue =3D qemu_new_net_queue(qemu_deliver_packet_iov, nc); nc->destructor =3D destructor; + nc->is_datapath =3D is_datapath; QTAILQ_INIT(&nc->filters); } =20 @@ -272,7 +274,23 @@ NetClientState *qemu_new_net_client(NetClientInfo *inf= o, =20 nc =3D g_malloc0(info->size); qemu_net_client_setup(nc, info, peer, model, name, - qemu_net_client_destructor); + qemu_net_client_destructor, true); + + return nc; +} + +NetClientState *qemu_new_net_control_client(NetClientInfo *info, + NetClientState *peer, + const char *model, + const char *name) +{ + NetClientState *nc; + + assert(info->size >=3D sizeof(NetClientState)); + + nc =3D g_malloc0(info->size); + qemu_net_client_setup(nc, info, peer, model, name, + qemu_net_client_destructor, false); =20 return nc; } @@ -297,7 +315,7 @@ NICState *qemu_new_nic(NetClientInfo *info, =20 for (i =3D 0; i < queues; i++) { qemu_net_client_setup(&nic->ncs[i], info, peers[i], model, name, - NULL); + NULL, true); nic->ncs[i].queue_index =3D i; } =20 --=20 2.25.1 From nobody Mon May 6 05:19:37 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634706086327797.3615333307845; Tue, 19 Oct 2021 22:01:26 -0700 (PDT) Received: from localhost ([::1]:40952 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1md3jB-0001l5-CW for importer@patchew.org; Wed, 20 Oct 2021 01:01:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33520) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3ep-0002gx-HN for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:56:55 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:51973) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3en-0007yQ-LK for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:56:55 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-239-XE2k1iIKOhygODiHCy4Isg-1; Wed, 20 Oct 2021 00:56:49 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 4896F79EDC; Wed, 20 Oct 2021 04:56:48 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-13.pek2.redhat.com [10.72.13.13]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7E44D60BF1; Wed, 20 Oct 2021 04:56:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634705812; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DLHSi7KdPLzc5LSVPHuG8iIPm5hirTsrp1HnElydUy0=; b=WeQWAS++aC2ja02xie6c8DjoorQTsU55en6kVv3Plwl/s0SC7SzP1vbCE5EJLG5lPGHn8X ptFjsf8c9tWpSLY6UOm8Vhr0PmnB3rLKoa7DLJrkiGCnsjMPI2D2nEjgpdVNoEsLcrWww9 xdOR60ABmuI3zPIkc1CWTPigaf6IXzo= X-MC-Unique: XE2k1iIKOhygODiHCy4Isg-1 From: Jason Wang To: qemu-devel@nongnu.org, mst@redhat.com, jasowang@redhat.com Subject: [PATCH V5 06/10] vhost-net: control virtqueue support Date: Wed, 20 Oct 2021 12:55:56 +0800 Message-Id: <20211020045600.16082-7-jasowang@redhat.com> In-Reply-To: <20211020045600.16082-1-jasowang@redhat.com> References: <20211020045600.16082-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=jasowang@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: eperezma@redhat.com, elic@nvidia.com, gdawar@xilinx.com, lingshan.zhu@intel.com, lulu@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1634706088459100001 Content-Type: text/plain; charset="utf-8" We assume there's no cvq in the past, this is not true when we need control virtqueue support for vhost-user backends. So this patch implements the control virtqueue support for vhost-net. As datapath, the control virtqueue is also required to be coupled with the NetClientState. The vhost_net_start/stop() are tweaked to accept the number of datapath queue pairs plus the the number of control virtqueue for us to start and stop the vhost device. Signed-off-by: Jason Wang --- hw/net/vhost_net-stub.c | 4 ++-- hw/net/vhost_net.c | 43 ++++++++++++++++++++++++++++++----------- hw/net/virtio-net.c | 4 ++-- include/net/vhost_net.h | 6 ++++-- 4 files changed, 40 insertions(+), 17 deletions(-) diff --git a/hw/net/vhost_net-stub.c b/hw/net/vhost_net-stub.c index a7f4252630..89d71cfb8e 100644 --- a/hw/net/vhost_net-stub.c +++ b/hw/net/vhost_net-stub.c @@ -33,13 +33,13 @@ struct vhost_net *vhost_net_init(VhostNetOptions *optio= ns) =20 int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, - int total_queues) + int data_queue_pairs, int cvq) { return -ENOSYS; } void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs, - int total_queues) + int data_queue_pairs, int cvq) { } =20 diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index 386ec2eaa2..e1e9d1ec89 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -315,11 +315,14 @@ static void vhost_net_stop_one(struct vhost_net *net, } =20 int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, - int total_queues) + int data_queue_pairs, int cvq) { BusState *qbus =3D BUS(qdev_get_parent_bus(DEVICE(dev))); VirtioBusState *vbus =3D VIRTIO_BUS(qbus); VirtioBusClass *k =3D VIRTIO_BUS_GET_CLASS(vbus); + int total_notifiers =3D data_queue_pairs * 2 + cvq; + VirtIONet *n =3D VIRTIO_NET(dev); + int nvhosts =3D data_queue_pairs + cvq; struct vhost_net *net; int r, e, i; NetClientState *peer; @@ -329,9 +332,14 @@ int vhost_net_start(VirtIODevice *dev, NetClientState = *ncs, return -ENOSYS; } =20 - for (i =3D 0; i < total_queues; i++) { + for (i =3D 0; i < nvhosts; i++) { + + if (i < data_queue_pairs) { + peer =3D qemu_get_peer(ncs, i); + } else { /* Control Virtqueue */ + peer =3D qemu_get_peer(ncs, n->max_queues); + } =20 - peer =3D qemu_get_peer(ncs, i); net =3D get_vhost_net(peer); vhost_net_set_vq_index(net, i * 2); =20 @@ -344,14 +352,18 @@ int vhost_net_start(VirtIODevice *dev, NetClientState= *ncs, } } =20 - r =3D k->set_guest_notifiers(qbus->parent, total_queues * 2, true); + r =3D k->set_guest_notifiers(qbus->parent, total_notifiers, true); if (r < 0) { error_report("Error binding guest notifier: %d", -r); goto err; } =20 - for (i =3D 0; i < total_queues; i++) { - peer =3D qemu_get_peer(ncs, i); + for (i =3D 0; i < nvhosts; i++) { + if (i < data_queue_pairs) { + peer =3D qemu_get_peer(ncs, i); + } else { + peer =3D qemu_get_peer(ncs, n->max_queues); + } r =3D vhost_net_start_one(get_vhost_net(peer), dev); =20 if (r < 0) { @@ -375,7 +387,7 @@ err_start: peer =3D qemu_get_peer(ncs , i); vhost_net_stop_one(get_vhost_net(peer), dev); } - e =3D k->set_guest_notifiers(qbus->parent, total_queues * 2, false); + e =3D k->set_guest_notifiers(qbus->parent, total_notifiers, false); if (e < 0) { fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", e); fflush(stderr); @@ -385,18 +397,27 @@ err: } =20 void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs, - int total_queues) + int data_queue_pairs, int cvq) { BusState *qbus =3D BUS(qdev_get_parent_bus(DEVICE(dev))); VirtioBusState *vbus =3D VIRTIO_BUS(qbus); VirtioBusClass *k =3D VIRTIO_BUS_GET_CLASS(vbus); + VirtIONet *n =3D VIRTIO_NET(dev); + NetClientState *peer; + int total_notifiers =3D data_queue_pairs * 2 + cvq; + int nvhosts =3D data_queue_pairs + cvq; int i, r; =20 - for (i =3D 0; i < total_queues; i++) { - vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev); + for (i =3D 0; i < nvhosts; i++) { + if (i < data_queue_pairs) { + peer =3D qemu_get_peer(ncs, i); + } else { + peer =3D qemu_get_peer(ncs, n->max_queues); + } + vhost_net_stop_one(get_vhost_net(peer), dev); } =20 - r =3D k->set_guest_notifiers(qbus->parent, total_queues * 2, false); + r =3D k->set_guest_notifiers(qbus->parent, total_notifiers, false); if (r < 0) { fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", r); fflush(stderr); diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 3dd2896ff9..5ee6729662 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -285,14 +285,14 @@ static void virtio_net_vhost_status(VirtIONet *n, uin= t8_t status) } =20 n->vhost_started =3D 1; - r =3D vhost_net_start(vdev, n->nic->ncs, queues); + r =3D vhost_net_start(vdev, n->nic->ncs, queues, 0); if (r < 0) { error_report("unable to start vhost net: %d: " "falling back on userspace virtio", -r); n->vhost_started =3D 0; } } else { - vhost_net_stop(vdev, n->nic->ncs, queues); + vhost_net_stop(vdev, n->nic->ncs, queues, 0); n->vhost_started =3D 0; } } diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h index fba40cf695..387e913e4e 100644 --- a/include/net/vhost_net.h +++ b/include/net/vhost_net.h @@ -21,8 +21,10 @@ typedef struct VhostNetOptions { uint64_t vhost_net_get_max_queues(VHostNetState *net); struct vhost_net *vhost_net_init(VhostNetOptions *options); =20 -int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, int total_queu= es); -void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs, int total_queu= es); +int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, + int data_queue_pairs, int cvq); +void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs, + int data_queue_pairs, int cvq); =20 void vhost_net_cleanup(VHostNetState *net); =20 --=20 2.25.1 From nobody Mon May 6 05:19:37 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634706210158144.39239289745285; Tue, 19 Oct 2021 22:03:30 -0700 (PDT) Received: from localhost ([::1]:47454 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1md3lA-0006Aq-Qo for importer@patchew.org; Wed, 20 Oct 2021 01:03:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33532) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3eu-0002rC-KX for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:57:02 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:40621) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3eq-00082T-TF for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:57:00 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-428-Eoef8gfNPTeTew4Pz3khRQ-1; Wed, 20 Oct 2021 00:56:52 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C3A76802575; Wed, 20 Oct 2021 04:56:51 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-13.pek2.redhat.com [10.72.13.13]) by smtp.corp.redhat.com (Postfix) with ESMTP id CD1BD60BF1; Wed, 20 Oct 2021 04:56:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634705816; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XgHcIlPaj3uKfOfQ8u6frlL7YAsoHFE9zxln5kRKGIQ=; b=FFgd3UX9sYQUl8Vw9cKUhkIsD9CGpMWK7MRkM2hbqTsSExTSSBqob2ExuqxMtitukX4BZi BswvOk3AhTNXpko6ZlHjBdX47WqOEhrOdIPtvyfXQ2Nll6C6JC3+hH4Q0VU+vk0GKkcSDx uKlUyZUmvmWZ1SkQztVAt9k1jdQl3Xc= X-MC-Unique: Eoef8gfNPTeTew4Pz3khRQ-1 From: Jason Wang To: qemu-devel@nongnu.org, mst@redhat.com, jasowang@redhat.com Subject: [PATCH V5 07/10] virtio-net: use "queue_pairs" instead of "queues" when possible Date: Wed, 20 Oct 2021 12:55:57 +0800 Message-Id: <20211020045600.16082-8-jasowang@redhat.com> In-Reply-To: <20211020045600.16082-1-jasowang@redhat.com> References: <20211020045600.16082-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=jasowang@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: eperezma@redhat.com, elic@nvidia.com, gdawar@xilinx.com, lingshan.zhu@intel.com, lulu@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1634706211355100001 Content-Type: text/plain; charset="utf-8" Most of the time, "queues" really means queue pairs. So this patch switch to use "queue_pairs" to avoid confusion. Signed-off-by: Jason Wang --- hw/net/vhost_net.c | 6 +- hw/net/virtio-net.c | 150 ++++++++++++++++----------------- include/hw/virtio/virtio-net.h | 4 +- 3 files changed, 80 insertions(+), 80 deletions(-) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index e1e9d1ec89..2b594b4642 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -337,7 +337,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *= ncs, if (i < data_queue_pairs) { peer =3D qemu_get_peer(ncs, i); } else { /* Control Virtqueue */ - peer =3D qemu_get_peer(ncs, n->max_queues); + peer =3D qemu_get_peer(ncs, n->max_queue_pairs); } =20 net =3D get_vhost_net(peer); @@ -362,7 +362,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *= ncs, if (i < data_queue_pairs) { peer =3D qemu_get_peer(ncs, i); } else { - peer =3D qemu_get_peer(ncs, n->max_queues); + peer =3D qemu_get_peer(ncs, n->max_queue_pairs); } r =3D vhost_net_start_one(get_vhost_net(peer), dev); =20 @@ -412,7 +412,7 @@ void vhost_net_stop(VirtIODevice *dev, NetClientState *= ncs, if (i < data_queue_pairs) { peer =3D qemu_get_peer(ncs, i); } else { - peer =3D qemu_get_peer(ncs, n->max_queues); + peer =3D qemu_get_peer(ncs, n->max_queue_pairs); } vhost_net_stop_one(get_vhost_net(peer), dev); } diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 5ee6729662..7594f7ea92 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -54,7 +54,7 @@ #define VIRTIO_NET_RX_QUEUE_DEFAULT_SIZE 256 #define VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE 256 =20 -/* for now, only allow larger queues; with virtio-1, guest can downsize */ +/* for now, only allow larger queue_pairs; with virtio-1, guest can downsi= ze */ #define VIRTIO_NET_RX_QUEUE_MIN_SIZE VIRTIO_NET_RX_QUEUE_DEFAULT_SIZE #define VIRTIO_NET_TX_QUEUE_MIN_SIZE VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE =20 @@ -131,7 +131,7 @@ static void virtio_net_get_config(VirtIODevice *vdev, u= int8_t *config) int ret =3D 0; memset(&netcfg, 0 , sizeof(struct virtio_net_config)); virtio_stw_p(vdev, &netcfg.status, n->status); - virtio_stw_p(vdev, &netcfg.max_virtqueue_pairs, n->max_queues); + virtio_stw_p(vdev, &netcfg.max_virtqueue_pairs, n->max_queue_pairs); virtio_stw_p(vdev, &netcfg.mtu, n->net_conf.mtu); memcpy(netcfg.mac, n->mac, ETH_ALEN); virtio_stl_p(vdev, &netcfg.speed, n->net_conf.speed); @@ -243,7 +243,7 @@ static void virtio_net_vhost_status(VirtIONet *n, uint8= _t status) { VirtIODevice *vdev =3D VIRTIO_DEVICE(n); NetClientState *nc =3D qemu_get_queue(n->nic); - int queues =3D n->multiqueue ? n->max_queues : 1; + int queue_pairs =3D n->multiqueue ? n->max_queue_pairs : 1; =20 if (!get_vhost_net(nc->peer)) { return; @@ -266,7 +266,7 @@ static void virtio_net_vhost_status(VirtIONet *n, uint8= _t status) /* Any packets outstanding? Purge them to avoid touching rings * when vhost is running. */ - for (i =3D 0; i < queues; i++) { + for (i =3D 0; i < queue_pairs; i++) { NetClientState *qnc =3D qemu_get_subqueue(n->nic, i); =20 /* Purge both directions: TX and RX. */ @@ -285,14 +285,14 @@ static void virtio_net_vhost_status(VirtIONet *n, uin= t8_t status) } =20 n->vhost_started =3D 1; - r =3D vhost_net_start(vdev, n->nic->ncs, queues, 0); + r =3D vhost_net_start(vdev, n->nic->ncs, queue_pairs, 0); if (r < 0) { error_report("unable to start vhost net: %d: " "falling back on userspace virtio", -r); n->vhost_started =3D 0; } } else { - vhost_net_stop(vdev, n->nic->ncs, queues, 0); + vhost_net_stop(vdev, n->nic->ncs, queue_pairs, 0); n->vhost_started =3D 0; } } @@ -309,11 +309,11 @@ static int virtio_net_set_vnet_endian_one(VirtIODevic= e *vdev, } =20 static bool virtio_net_set_vnet_endian(VirtIODevice *vdev, NetClientState = *ncs, - int queues, bool enable) + int queue_pairs, bool enable) { int i; =20 - for (i =3D 0; i < queues; i++) { + for (i =3D 0; i < queue_pairs; i++) { if (virtio_net_set_vnet_endian_one(vdev, ncs[i].peer, enable) < 0 = && enable) { while (--i >=3D 0) { @@ -330,7 +330,7 @@ static bool virtio_net_set_vnet_endian(VirtIODevice *vd= ev, NetClientState *ncs, static void virtio_net_vnet_endian_status(VirtIONet *n, uint8_t status) { VirtIODevice *vdev =3D VIRTIO_DEVICE(n); - int queues =3D n->multiqueue ? n->max_queues : 1; + int queue_pairs =3D n->multiqueue ? n->max_queue_pairs : 1; =20 if (virtio_net_started(n, status)) { /* Before using the device, we tell the network backend about the @@ -339,14 +339,14 @@ static void virtio_net_vnet_endian_status(VirtIONet *= n, uint8_t status) * virtio-net code. */ n->needs_vnet_hdr_swap =3D virtio_net_set_vnet_endian(vdev, n->nic= ->ncs, - queues, true); + queue_pairs, t= rue); } else if (virtio_net_started(n, vdev->status)) { /* After using the device, we need to reset the network backend to * the default (guest native endianness), otherwise the guest may * lose network connectivity if it is rebooted into a different * endianness. */ - virtio_net_set_vnet_endian(vdev, n->nic->ncs, queues, false); + virtio_net_set_vnet_endian(vdev, n->nic->ncs, queue_pairs, false); } } =20 @@ -368,12 +368,12 @@ static void virtio_net_set_status(struct VirtIODevice= *vdev, uint8_t status) virtio_net_vnet_endian_status(n, status); virtio_net_vhost_status(n, status); =20 - for (i =3D 0; i < n->max_queues; i++) { + for (i =3D 0; i < n->max_queue_pairs; i++) { NetClientState *ncs =3D qemu_get_subqueue(n->nic, i); bool queue_started; q =3D &n->vqs[i]; =20 - if ((!n->multiqueue && i !=3D 0) || i >=3D n->curr_queues) { + if ((!n->multiqueue && i !=3D 0) || i >=3D n->curr_queue_pairs) { queue_status =3D 0; } else { queue_status =3D status; @@ -540,7 +540,7 @@ static void virtio_net_reset(VirtIODevice *vdev) n->nouni =3D 0; n->nobcast =3D 0; /* multiqueue is disabled by default */ - n->curr_queues =3D 1; + n->curr_queue_pairs =3D 1; timer_del(n->announce_timer.tm); n->announce_timer.round =3D 0; n->status &=3D ~VIRTIO_NET_S_ANNOUNCE; @@ -556,7 +556,7 @@ static void virtio_net_reset(VirtIODevice *vdev) memset(n->vlans, 0, MAX_VLAN >> 3); =20 /* Flush any async TX */ - for (i =3D 0; i < n->max_queues; i++) { + for (i =3D 0; i < n->max_queue_pairs; i++) { NetClientState *nc =3D qemu_get_subqueue(n->nic, i); =20 if (nc->peer) { @@ -610,7 +610,7 @@ static void virtio_net_set_mrg_rx_bufs(VirtIONet *n, in= t mergeable_rx_bufs, sizeof(struct virtio_net_hdr); } =20 - for (i =3D 0; i < n->max_queues; i++) { + for (i =3D 0; i < n->max_queue_pairs; i++) { nc =3D qemu_get_subqueue(n->nic, i); =20 if (peer_has_vnet_hdr(n) && @@ -655,7 +655,7 @@ static int peer_attach(VirtIONet *n, int index) return 0; } =20 - if (n->max_queues =3D=3D 1) { + if (n->max_queue_pairs =3D=3D 1) { return 0; } =20 @@ -681,7 +681,7 @@ static int peer_detach(VirtIONet *n, int index) return tap_disable(nc->peer); } =20 -static void virtio_net_set_queues(VirtIONet *n) +static void virtio_net_set_queue_pairs(VirtIONet *n) { int i; int r; @@ -690,8 +690,8 @@ static void virtio_net_set_queues(VirtIONet *n) return; } =20 - for (i =3D 0; i < n->max_queues; i++) { - if (i < n->curr_queues) { + for (i =3D 0; i < n->max_queue_pairs; i++) { + if (i < n->curr_queue_pairs) { r =3D peer_attach(n, i); assert(!r); } else { @@ -905,7 +905,7 @@ static void virtio_net_set_features(VirtIODevice *vdev,= uint64_t features) virtio_net_apply_guest_offloads(n); } =20 - for (i =3D 0; i < n->max_queues; i++) { + for (i =3D 0; i < n->max_queue_pairs; i++) { NetClientState *nc =3D qemu_get_subqueue(n->nic, i); =20 if (!get_vhost_net(nc->peer)) { @@ -1232,7 +1232,7 @@ static uint16_t virtio_net_handle_rss(VirtIONet *n, VirtIODevice *vdev =3D VIRTIO_DEVICE(n); struct virtio_net_rss_config cfg; size_t s, offset =3D 0, size_get; - uint16_t queues, i; + uint16_t queue_pairs, i; struct { uint16_t us; uint8_t b; @@ -1274,7 +1274,7 @@ static uint16_t virtio_net_handle_rss(VirtIONet *n, } n->rss_data.default_queue =3D do_rss ? virtio_lduw_p(vdev, &cfg.unclassified_queue) : 0; - if (n->rss_data.default_queue >=3D n->max_queues) { + if (n->rss_data.default_queue >=3D n->max_queue_pairs) { err_msg =3D "Invalid default queue"; err_value =3D n->rss_data.default_queue; goto error; @@ -1303,14 +1303,14 @@ static uint16_t virtio_net_handle_rss(VirtIONet *n, size_get =3D sizeof(temp); s =3D iov_to_buf(iov, iov_cnt, offset, &temp, size_get); if (s !=3D size_get) { - err_msg =3D "Can't get queues"; + err_msg =3D "Can't get queue_pairs"; err_value =3D (uint32_t)s; goto error; } - queues =3D do_rss ? virtio_lduw_p(vdev, &temp.us) : n->curr_queues; - if (queues =3D=3D 0 || queues > n->max_queues) { - err_msg =3D "Invalid number of queues"; - err_value =3D queues; + queue_pairs =3D do_rss ? virtio_lduw_p(vdev, &temp.us) : n->curr_queue= _pairs; + if (queue_pairs =3D=3D 0 || queue_pairs > n->max_queue_pairs) { + err_msg =3D "Invalid number of queue_pairs"; + err_value =3D queue_pairs; goto error; } if (temp.b > VIRTIO_NET_RSS_MAX_KEY_SIZE) { @@ -1325,7 +1325,7 @@ static uint16_t virtio_net_handle_rss(VirtIONet *n, } if (!temp.b && !n->rss_data.hash_types) { virtio_net_disable_rss(n); - return queues; + return queue_pairs; } offset +=3D size_get; size_get =3D temp.b; @@ -1358,7 +1358,7 @@ static uint16_t virtio_net_handle_rss(VirtIONet *n, trace_virtio_net_rss_enable(n->rss_data.hash_types, n->rss_data.indirections_len, temp.b); - return queues; + return queue_pairs; error: trace_virtio_net_rss_error(err_msg, err_value); virtio_net_disable_rss(n); @@ -1369,15 +1369,15 @@ static int virtio_net_handle_mq(VirtIONet *n, uint8= _t cmd, struct iovec *iov, unsigned int iov_cnt) { VirtIODevice *vdev =3D VIRTIO_DEVICE(n); - uint16_t queues; + uint16_t queue_pairs; =20 virtio_net_disable_rss(n); if (cmd =3D=3D VIRTIO_NET_CTRL_MQ_HASH_CONFIG) { - queues =3D virtio_net_handle_rss(n, iov, iov_cnt, false); - return queues ? VIRTIO_NET_OK : VIRTIO_NET_ERR; + queue_pairs =3D virtio_net_handle_rss(n, iov, iov_cnt, false); + return queue_pairs ? VIRTIO_NET_OK : VIRTIO_NET_ERR; } if (cmd =3D=3D VIRTIO_NET_CTRL_MQ_RSS_CONFIG) { - queues =3D virtio_net_handle_rss(n, iov, iov_cnt, true); + queue_pairs =3D virtio_net_handle_rss(n, iov, iov_cnt, true); } else if (cmd =3D=3D VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET) { struct virtio_net_ctrl_mq mq; size_t s; @@ -1388,24 +1388,24 @@ static int virtio_net_handle_mq(VirtIONet *n, uint8= _t cmd, if (s !=3D sizeof(mq)) { return VIRTIO_NET_ERR; } - queues =3D virtio_lduw_p(vdev, &mq.virtqueue_pairs); + queue_pairs =3D virtio_lduw_p(vdev, &mq.virtqueue_pairs); =20 } else { return VIRTIO_NET_ERR; } =20 - if (queues < VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN || - queues > VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX || - queues > n->max_queues || + if (queue_pairs < VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN || + queue_pairs > VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX || + queue_pairs > n->max_queue_pairs || !n->multiqueue) { return VIRTIO_NET_ERR; } =20 - n->curr_queues =3D queues; - /* stop the backend before changing the number of queues to avoid hand= ling a + n->curr_queue_pairs =3D queue_pairs; + /* stop the backend before changing the number of queue_pairs to avoid= handling a * disabled queue */ virtio_net_set_status(vdev, vdev->status); - virtio_net_set_queues(n); + virtio_net_set_queue_pairs(n); =20 return VIRTIO_NET_OK; } @@ -1483,7 +1483,7 @@ static bool virtio_net_can_receive(NetClientState *nc) return false; } =20 - if (nc->queue_index >=3D n->curr_queues) { + if (nc->queue_index >=3D n->curr_queue_pairs) { return false; } =20 @@ -2763,11 +2763,11 @@ static void virtio_net_del_queue(VirtIONet *n, int = index) virtio_del_queue(vdev, index * 2 + 1); } =20 -static void virtio_net_change_num_queues(VirtIONet *n, int new_max_queues) +static void virtio_net_change_num_queue_pairs(VirtIONet *n, int new_max_qu= eue_pairs) { VirtIODevice *vdev =3D VIRTIO_DEVICE(n); int old_num_queues =3D virtio_get_num_queues(vdev); - int new_num_queues =3D new_max_queues * 2 + 1; + int new_num_queues =3D new_max_queue_pairs * 2 + 1; int i; =20 assert(old_num_queues >=3D 3); @@ -2800,12 +2800,12 @@ static void virtio_net_change_num_queues(VirtIONet = *n, int new_max_queues) =20 static void virtio_net_set_multiqueue(VirtIONet *n, int multiqueue) { - int max =3D multiqueue ? n->max_queues : 1; + int max =3D multiqueue ? n->max_queue_pairs : 1; =20 n->multiqueue =3D multiqueue; - virtio_net_change_num_queues(n, max); + virtio_net_change_num_queue_pairs(n, max); =20 - virtio_net_set_queues(n); + virtio_net_set_queue_pairs(n); } =20 static int virtio_net_post_load_device(void *opaque, int version_id) @@ -2838,7 +2838,7 @@ static int virtio_net_post_load_device(void *opaque, = int version_id) */ n->saved_guest_offloads =3D n->curr_guest_offloads; =20 - virtio_net_set_queues(n); + virtio_net_set_queue_pairs(n); =20 /* Find the first multicast entry in the saved MAC filter */ for (i =3D 0; i < n->mac_table.in_use; i++) { @@ -2851,7 +2851,7 @@ static int virtio_net_post_load_device(void *opaque, = int version_id) /* nc.link_down can't be migrated, so infer link_down according * to link status bit in n->status */ link_down =3D (n->status & VIRTIO_NET_S_LINK_UP) =3D=3D 0; - for (i =3D 0; i < n->max_queues; i++) { + for (i =3D 0; i < n->max_queue_pairs; i++) { qemu_get_subqueue(n->nic, i)->link_down =3D link_down; } =20 @@ -2916,9 +2916,9 @@ static const VMStateDescription vmstate_virtio_net_qu= eue_tx_waiting =3D { }, }; =20 -static bool max_queues_gt_1(void *opaque, int version_id) +static bool max_queue_pairs_gt_1(void *opaque, int version_id) { - return VIRTIO_NET(opaque)->max_queues > 1; + return VIRTIO_NET(opaque)->max_queue_pairs > 1; } =20 static bool has_ctrl_guest_offloads(void *opaque, int version_id) @@ -2943,13 +2943,13 @@ static bool mac_table_doesnt_fit(void *opaque, int = version_id) struct VirtIONetMigTmp { VirtIONet *parent; VirtIONetQueue *vqs_1; - uint16_t curr_queues_1; + uint16_t curr_queue_pairs_1; uint8_t has_ufo; uint32_t has_vnet_hdr; }; =20 /* The 2nd and subsequent tx_waiting flags are loaded later than - * the 1st entry in the queues and only if there's more than one + * the 1st entry in the queue_pairs and only if there's more than one * entry. We use the tmp mechanism to calculate a temporary * pointer and count and also validate the count. */ @@ -2959,9 +2959,9 @@ static int virtio_net_tx_waiting_pre_save(void *opaqu= e) struct VirtIONetMigTmp *tmp =3D opaque; =20 tmp->vqs_1 =3D tmp->parent->vqs + 1; - tmp->curr_queues_1 =3D tmp->parent->curr_queues - 1; - if (tmp->parent->curr_queues =3D=3D 0) { - tmp->curr_queues_1 =3D 0; + tmp->curr_queue_pairs_1 =3D tmp->parent->curr_queue_pairs - 1; + if (tmp->parent->curr_queue_pairs =3D=3D 0) { + tmp->curr_queue_pairs_1 =3D 0; } =20 return 0; @@ -2974,9 +2974,9 @@ static int virtio_net_tx_waiting_pre_load(void *opaqu= e) /* Reuse the pointer setup from save */ virtio_net_tx_waiting_pre_save(opaque); =20 - if (tmp->parent->curr_queues > tmp->parent->max_queues) { - error_report("virtio-net: curr_queues %x > max_queues %x", - tmp->parent->curr_queues, tmp->parent->max_queues); + if (tmp->parent->curr_queue_pairs > tmp->parent->max_queue_pairs) { + error_report("virtio-net: curr_queue_pairs %x > max_queue_pairs %x= ", + tmp->parent->curr_queue_pairs, tmp->parent->max_queue_pairs); =20 return -EINVAL; } @@ -2990,7 +2990,7 @@ static const VMStateDescription vmstate_virtio_net_tx= _waiting =3D { .pre_save =3D virtio_net_tx_waiting_pre_save, .fields =3D (VMStateField[]) { VMSTATE_STRUCT_VARRAY_POINTER_UINT16(vqs_1, struct VirtIONetMigTmp, - curr_queues_1, + curr_queue_pairs_1, vmstate_virtio_net_queue_tx_waiting, struct VirtIONetQueue), VMSTATE_END_OF_LIST() @@ -3132,9 +3132,9 @@ static const VMStateDescription vmstate_virtio_net_de= vice =3D { VMSTATE_UINT8(nobcast, VirtIONet), VMSTATE_WITH_TMP(VirtIONet, struct VirtIONetMigTmp, vmstate_virtio_net_has_ufo), - VMSTATE_SINGLE_TEST(max_queues, VirtIONet, max_queues_gt_1, 0, + VMSTATE_SINGLE_TEST(max_queue_pairs, VirtIONet, max_queue_pairs_gt= _1, 0, vmstate_info_uint16_equal, uint16_t), - VMSTATE_UINT16_TEST(curr_queues, VirtIONet, max_queues_gt_1), + VMSTATE_UINT16_TEST(curr_queue_pairs, VirtIONet, max_queue_pairs_g= t_1), VMSTATE_WITH_TMP(VirtIONet, struct VirtIONetMigTmp, vmstate_virtio_net_tx_waiting), VMSTATE_UINT64_TEST(curr_guest_offloads, VirtIONet, @@ -3411,16 +3411,16 @@ static void virtio_net_device_realize(DeviceState *= dev, Error **errp) return; } =20 - n->max_queues =3D MAX(n->nic_conf.peers.queues, 1); - if (n->max_queues * 2 + 1 > VIRTIO_QUEUE_MAX) { - error_setg(errp, "Invalid number of queues (=3D %" PRIu32 "), " + n->max_queue_pairs =3D MAX(n->nic_conf.peers.queues, 1); + if (n->max_queue_pairs * 2 + 1 > VIRTIO_QUEUE_MAX) { + error_setg(errp, "Invalid number of queue_pairs (=3D %" PRIu32 "),= " "must be a positive integer less than %d.", - n->max_queues, (VIRTIO_QUEUE_MAX - 1) / 2); + n->max_queue_pairs, (VIRTIO_QUEUE_MAX - 1) / 2); virtio_cleanup(vdev); return; } - n->vqs =3D g_malloc0(sizeof(VirtIONetQueue) * n->max_queues); - n->curr_queues =3D 1; + n->vqs =3D g_malloc0(sizeof(VirtIONetQueue) * n->max_queue_pairs); + n->curr_queue_pairs =3D 1; n->tx_timeout =3D n->net_conf.txtimer; =20 if (n->net_conf.tx && strcmp(n->net_conf.tx, "timer") @@ -3434,7 +3434,7 @@ static void virtio_net_device_realize(DeviceState *de= v, Error **errp) n->net_conf.tx_queue_size =3D MIN(virtio_net_max_tx_queue_size(n), n->net_conf.tx_queue_size); =20 - for (i =3D 0; i < n->max_queues; i++) { + for (i =3D 0; i < n->max_queue_pairs; i++) { virtio_net_add_queue(n, i); } =20 @@ -3458,13 +3458,13 @@ static void virtio_net_device_realize(DeviceState *= dev, Error **errp) object_get_typename(OBJECT(dev)), dev->id, n= ); } =20 - for (i =3D 0; i < n->max_queues; i++) { + for (i =3D 0; i < n->max_queue_pairs; i++) { n->nic->ncs[i].do_not_pad =3D true; } =20 peer_test_vnet_hdr(n); if (peer_has_vnet_hdr(n)) { - for (i =3D 0; i < n->max_queues; i++) { + for (i =3D 0; i < n->max_queue_pairs; i++) { qemu_using_vnet_hdr(qemu_get_subqueue(n->nic, i)->peer, true); } n->host_hdr_len =3D sizeof(struct virtio_net_hdr); @@ -3506,7 +3506,7 @@ static void virtio_net_device_unrealize(DeviceState *= dev) { VirtIODevice *vdev =3D VIRTIO_DEVICE(dev); VirtIONet *n =3D VIRTIO_NET(dev); - int i, max_queues; + int i, max_queue_pairs; =20 if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) { virtio_net_unload_ebpf(n); @@ -3531,12 +3531,12 @@ static void virtio_net_device_unrealize(DeviceState= *dev) assert(n->primary_opts =3D=3D NULL); } =20 - max_queues =3D n->multiqueue ? n->max_queues : 1; - for (i =3D 0; i < max_queues; i++) { + max_queue_pairs =3D n->multiqueue ? n->max_queue_pairs : 1; + for (i =3D 0; i < max_queue_pairs; i++) { virtio_net_del_queue(n, i); } /* delete also control vq */ - virtio_del_queue(vdev, max_queues * 2); + virtio_del_queue(vdev, max_queue_pairs * 2); qemu_announce_timer_del(&n->announce_timer, false); g_free(n->vqs); qemu_del_nic(n->nic); diff --git a/include/hw/virtio/virtio-net.h b/include/hw/virtio/virtio-net.h index 74a10ebe85..2903b79a92 100644 --- a/include/hw/virtio/virtio-net.h +++ b/include/hw/virtio/virtio-net.h @@ -194,8 +194,8 @@ struct VirtIONet { NICConf nic_conf; DeviceState *qdev; int multiqueue; - uint16_t max_queues; - uint16_t curr_queues; + uint16_t max_queue_pairs; + uint16_t curr_queue_pairs; size_t config_size; char *netclient_name; char *netclient_type; --=20 2.25.1 From nobody Mon May 6 05:19:37 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634706205728187.24527840155235; Tue, 19 Oct 2021 22:03:25 -0700 (PDT) Received: from localhost ([::1]:47130 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1md3l6-0005wv-KV for importer@patchew.org; Wed, 20 Oct 2021 01:03:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33552) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3ez-0002tQ-59 for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:57:06 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:29333) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3ex-00088m-Lg for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:57:04 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-290-AXUwgnZwNOGPRdsH9LvUrQ-1; Wed, 20 Oct 2021 00:56:59 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9FD01806694; Wed, 20 Oct 2021 04:56:58 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-13.pek2.redhat.com [10.72.13.13]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3209560BF1; Wed, 20 Oct 2021 04:56:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634705823; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0S08/s4PvwYBIXNIJQZrcl+7drWjd11Gf+x6eK6zE8k=; b=idpIeHKACr0Rp6Lt6g1fqM8NERDR+cGZqMoHO6JlZuOzGaQUulO96jylJh64UBZkoK+Fff lQzZRZJ231FgX7MS3tvzZjYokDilRWbepmExzToqRwSDvLgSvllWlG4MPHe3iq7Ct32PDk l34kX+v9UfQwRg0fMd9qXCpOrF8KqKM= X-MC-Unique: AXUwgnZwNOGPRdsH9LvUrQ-1 From: Jason Wang To: qemu-devel@nongnu.org, mst@redhat.com, jasowang@redhat.com Subject: [PATCH V5 08/10] vhost: record the last virtqueue index for the virtio device Date: Wed, 20 Oct 2021 12:55:58 +0800 Message-Id: <20211020045600.16082-9-jasowang@redhat.com> In-Reply-To: <20211020045600.16082-1-jasowang@redhat.com> References: <20211020045600.16082-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=jasowang@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: eperezma@redhat.com, elic@nvidia.com, gdawar@xilinx.com, lingshan.zhu@intel.com, lulu@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1634706207040100002 Content-Type: text/plain; charset="utf-8" This patch introduces a new field in the vhost_dev structure to record the last virtqueue index for the virtio device. This will be useful for the vhost backends with 1:N model to start or stop the device after all the vhost_dev structures were started or stopped. Signed-off-by: Jason Wang --- hw/net/vhost_net.c | 12 +++++++++--- include/hw/virtio/vhost.h | 2 ++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index 2b594b4642..3aabab06ea 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -231,9 +231,11 @@ fail: return NULL; } =20 -static void vhost_net_set_vq_index(struct vhost_net *net, int vq_index) +static void vhost_net_set_vq_index(struct vhost_net *net, int vq_index, + int last_index) { net->dev.vq_index =3D vq_index; + net->dev.last_index =3D last_index; } =20 static int vhost_net_start_one(struct vhost_net *net, @@ -324,9 +326,13 @@ int vhost_net_start(VirtIODevice *dev, NetClientState = *ncs, VirtIONet *n =3D VIRTIO_NET(dev); int nvhosts =3D data_queue_pairs + cvq; struct vhost_net *net; - int r, e, i; + int r, e, i, last_index =3D data_qps * 2; NetClientState *peer; =20 + if (!cvq) { + last_index -=3D 1; + } + if (!k->set_guest_notifiers) { error_report("binding does not support guest notifiers"); return -ENOSYS; @@ -341,7 +347,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *= ncs, } =20 net =3D get_vhost_net(peer); - vhost_net_set_vq_index(net, i * 2); + vhost_net_set_vq_index(net, i * 2, last_index); =20 /* Suppress the masking guest notifiers on vhost user * because vhost user doesn't interrupt masking/unmasking diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h index 1a9fc65089..3fa0b554ef 100644 --- a/include/hw/virtio/vhost.h +++ b/include/hw/virtio/vhost.h @@ -74,6 +74,8 @@ struct vhost_dev { unsigned int nvqs; /* the first virtqueue which would be used by this vhost dev */ int vq_index; + /* the last vq index for the virtio device (not vhost) */ + int last_index; /* if non-zero, minimum required value for max_queues */ int num_queues; uint64_t features; --=20 2.25.1 From nobody Mon May 6 05:19:37 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634706205208353.38666599202236; Tue, 19 Oct 2021 22:03:25 -0700 (PDT) Received: from localhost ([::1]:47028 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1md3l5-0005t2-Q3 for importer@patchew.org; Wed, 20 Oct 2021 01:03:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33564) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3f6-0002wC-9E for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:57:13 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:52601) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3f4-0008Fn-HV for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:57:11 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-489-S6ATq32MOwSGNW998VopGA-1; Wed, 20 Oct 2021 00:57:06 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 4E9DD189CD24; Wed, 20 Oct 2021 04:57:05 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-13.pek2.redhat.com [10.72.13.13]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2EBF160BF1; Wed, 20 Oct 2021 04:56:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634705830; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vyhwmtJBJ95uYZlCJKRnQNUPfDB/7pSjSyOdelmJhFk=; b=gqGp+X58bRtOPSnoLfeCrF1sQMn7QwSH++EjQyGD9hYI6znDNt/BjQdU3B8IgxoVWzVwD1 idzS9WBb89cRE0ntVGmpfPi6jdgEpOZ7CmsL054Ly22dEGYjBhYSXhJVoguLBgvO/8Yoq/ XqenRiBnLQivGtwX6AqG3zIKXuFhdhY= X-MC-Unique: S6ATq32MOwSGNW998VopGA-1 From: Jason Wang To: qemu-devel@nongnu.org, mst@redhat.com, jasowang@redhat.com Subject: [PATCH V5 09/10] virtio-net: vhost control virtqueue support Date: Wed, 20 Oct 2021 12:55:59 +0800 Message-Id: <20211020045600.16082-10-jasowang@redhat.com> In-Reply-To: <20211020045600.16082-1-jasowang@redhat.com> References: <20211020045600.16082-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=jasowang@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: eperezma@redhat.com, elic@nvidia.com, gdawar@xilinx.com, lingshan.zhu@intel.com, lulu@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1634706207031100001 Content-Type: text/plain; charset="utf-8" This patch implements the control virtqueue support for vhost. This requires virtio-net to figure out the datapath queue pairs and control virtqueue via is_datapath and pass the number of those two types of virtqueues to vhost_net_start()/vhost_net_stop(). Signed-off-by: Jason Wang --- hw/net/vhost_net.c | 2 +- hw/net/virtio-net.c | 23 +++++++++++++++++++---- include/hw/virtio/virtio-net.h | 1 + 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index 3aabab06ea..0d888f29a6 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -326,7 +326,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *= ncs, VirtIONet *n =3D VIRTIO_NET(dev); int nvhosts =3D data_queue_pairs + cvq; struct vhost_net *net; - int r, e, i, last_index =3D data_qps * 2; + int r, e, i, last_index =3D data_queue_pairs * 2; NetClientState *peer; =20 if (!cvq) { diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 7594f7ea92..f2014d5ea0 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -244,6 +244,7 @@ static void virtio_net_vhost_status(VirtIONet *n, uint8= _t status) VirtIODevice *vdev =3D VIRTIO_DEVICE(n); NetClientState *nc =3D qemu_get_queue(n->nic); int queue_pairs =3D n->multiqueue ? n->max_queue_pairs : 1; + int cvq =3D n->max_ncs - n->max_queue_pairs; =20 if (!get_vhost_net(nc->peer)) { return; @@ -285,14 +286,14 @@ static void virtio_net_vhost_status(VirtIONet *n, uin= t8_t status) } =20 n->vhost_started =3D 1; - r =3D vhost_net_start(vdev, n->nic->ncs, queue_pairs, 0); + r =3D vhost_net_start(vdev, n->nic->ncs, queue_pairs, cvq); if (r < 0) { error_report("unable to start vhost net: %d: " "falling back on userspace virtio", -r); n->vhost_started =3D 0; } } else { - vhost_net_stop(vdev, n->nic->ncs, queue_pairs, 0); + vhost_net_stop(vdev, n->nic->ncs, queue_pairs, cvq); n->vhost_started =3D 0; } } @@ -3411,9 +3412,23 @@ static void virtio_net_device_realize(DeviceState *d= ev, Error **errp) return; } =20 - n->max_queue_pairs =3D MAX(n->nic_conf.peers.queues, 1); + n->max_ncs =3D MAX(n->nic_conf.peers.queues, 1); + + /* + * Figure out the datapath queue pairs since the backend could + * provide control queue via peers as well. + */ + if (n->nic_conf.peers.queues) { + for (i =3D 0; i < n->max_ncs; i++) { + if (n->nic_conf.peers.ncs[i]->is_datapath) { + ++n->max_queue_pairs; + } + } + } + n->max_queue_pairs =3D MAX(n->max_queue_pairs, 1); + if (n->max_queue_pairs * 2 + 1 > VIRTIO_QUEUE_MAX) { - error_setg(errp, "Invalid number of queue_pairs (=3D %" PRIu32 "),= " + error_setg(errp, "Invalid number of queue pairs (=3D %" PRIu32 "),= " "must be a positive integer less than %d.", n->max_queue_pairs, (VIRTIO_QUEUE_MAX - 1) / 2); virtio_cleanup(vdev); diff --git a/include/hw/virtio/virtio-net.h b/include/hw/virtio/virtio-net.h index 2903b79a92..eb87032627 100644 --- a/include/hw/virtio/virtio-net.h +++ b/include/hw/virtio/virtio-net.h @@ -196,6 +196,7 @@ struct VirtIONet { int multiqueue; uint16_t max_queue_pairs; uint16_t curr_queue_pairs; + uint16_t max_ncs; size_t config_size; char *netclient_name; char *netclient_type; --=20 2.25.1 From nobody Mon May 6 05:19:37 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1634706439938909.3519878314049; Tue, 19 Oct 2021 22:07:19 -0700 (PDT) Received: from localhost ([::1]:54342 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1md3os-0002T7-SX for importer@patchew.org; Wed, 20 Oct 2021 01:07:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33576) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3fA-00032T-FP for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:57:16 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:29330) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1md3f8-0008JC-OE for qemu-devel@nongnu.org; Wed, 20 Oct 2021 00:57:16 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-340-7dbN4Z9nNSCaJuZ4nvcB0g-1; Wed, 20 Oct 2021 00:57:11 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id EC6FC802575; Wed, 20 Oct 2021 04:57:09 +0000 (UTC) Received: from localhost.localdomain (ovpn-13-13.pek2.redhat.com [10.72.13.13]) by smtp.corp.redhat.com (Postfix) with ESMTP id B245760BF1; Wed, 20 Oct 2021 04:57:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634705834; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=43Jm9K450mbhD0UtrD3UtteVJ6ijXYwDTlgFb2IXOpo=; b=eihidJkskdVSbM177U/z89u2hCIx2iyXVNdUkRNst+vX25LJjjkWwK1UVFGMwRgLaaqHbS DiiQqmjJ0H5AOE7rQprVSiMXFXxnCQ+pTruTYHyUZrevmIVML7kEKpSrVbSYctNusfcRWD x4egWdBm4/zq3s7co+5SJbf2DSrpMfk= X-MC-Unique: 7dbN4Z9nNSCaJuZ4nvcB0g-1 From: Jason Wang To: qemu-devel@nongnu.org, mst@redhat.com, jasowang@redhat.com Subject: [PATCH V5 10/10] vhost-vdpa: multiqueue support Date: Wed, 20 Oct 2021 12:56:00 +0800 Message-Id: <20211020045600.16082-11-jasowang@redhat.com> In-Reply-To: <20211020045600.16082-1-jasowang@redhat.com> References: <20211020045600.16082-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=jasowang@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: eperezma@redhat.com, elic@nvidia.com, gdawar@xilinx.com, lingshan.zhu@intel.com, lulu@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1634706441092100001 Content-Type: text/plain; charset="utf-8" This patch implements the multiqueue support for vhost-vdpa. This is done simply by reading the number of queue pairs from the config space and initialize the datapath and control path net client. Signed-off-by: Jason Wang --- hw/virtio/vhost-vdpa.c | 2 +- net/vhost-vdpa.c | 105 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 97 insertions(+), 10 deletions(-) diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c index 40987188cf..ce0a297481 100644 --- a/hw/virtio/vhost-vdpa.c +++ b/hw/virtio/vhost-vdpa.c @@ -630,7 +630,7 @@ static int vhost_vdpa_dev_start(struct vhost_dev *dev, = bool started) vhost_vdpa_host_notifiers_uninit(dev, dev->nvqs); } =20 - if (vhost_vdpa_one_time_request(dev)) { + if (dev->vq_index + dev->nvqs !=3D dev->last_index) { return 0; } =20 diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c index 151f60184d..49ab322511 100644 --- a/net/vhost-vdpa.c +++ b/net/vhost-vdpa.c @@ -18,6 +18,7 @@ #include "qemu/error-report.h" #include "qemu/option.h" #include "qapi/error.h" +#include #include #include #include "standard-headers/linux/virtio_net.h" @@ -51,6 +52,14 @@ const int vdpa_feature_bits[] =3D { VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_MTU, + VIRTIO_NET_F_CTRL_RX, + VIRTIO_NET_F_CTRL_RX_EXTRA, + VIRTIO_NET_F_CTRL_VLAN, + VIRTIO_NET_F_GUEST_ANNOUNCE, + VIRTIO_NET_F_CTRL_MAC_ADDR, + VIRTIO_NET_F_RSS, + VIRTIO_NET_F_MQ, + VIRTIO_NET_F_CTRL_VQ, VIRTIO_F_IOMMU_PLATFORM, VIRTIO_F_RING_PACKED, VIRTIO_NET_F_RSS, @@ -81,7 +90,8 @@ static int vhost_vdpa_net_check_device_id(struct vhost_ne= t *net) return ret; } =20 -static int vhost_vdpa_add(NetClientState *ncs, void *be) +static int vhost_vdpa_add(NetClientState *ncs, void *be, + int queue_pair_index, int nvqs) { VhostNetOptions options; struct vhost_net *net =3D NULL; @@ -94,7 +104,7 @@ static int vhost_vdpa_add(NetClientState *ncs, void *be) options.net_backend =3D ncs; options.opaque =3D be; options.busyloop_timeout =3D 0; - options.nvqs =3D 2; + options.nvqs =3D nvqs; =20 net =3D vhost_net_init(&options); if (!net) { @@ -172,18 +182,28 @@ static NetClientInfo net_vhost_vdpa_info =3D { static NetClientState *net_vhost_vdpa_init(NetClientState *peer, const char *device, const char *name, - int vdpa_device_fd) + int vdpa_device_fd, + int queue_pair_index, + int nvqs, + bool is_datapath) { NetClientState *nc =3D NULL; VhostVDPAState *s; int ret =3D 0; assert(name); - nc =3D qemu_new_net_client(&net_vhost_vdpa_info, peer, device, name); + if (is_datapath) { + nc =3D qemu_new_net_client(&net_vhost_vdpa_info, peer, device, + name); + } else { + nc =3D qemu_new_net_control_client(&net_vhost_vdpa_info, peer, + device, name); + } snprintf(nc->info_str, sizeof(nc->info_str), TYPE_VHOST_VDPA); s =3D DO_UPCAST(VhostVDPAState, nc, nc); =20 s->vhost_vdpa.device_fd =3D vdpa_device_fd; - ret =3D vhost_vdpa_add(nc, (void *)&s->vhost_vdpa); + s->vhost_vdpa.index =3D queue_pair_index; + ret =3D vhost_vdpa_add(nc, (void *)&s->vhost_vdpa, queue_pair_index, n= vqs); if (ret) { qemu_del_net_client(nc); return NULL; @@ -191,12 +211,52 @@ static NetClientState *net_vhost_vdpa_init(NetClientS= tate *peer, return nc; } =20 +static int vhost_vdpa_get_max_queue_pairs(int fd, int *has_cvq, Error **er= rp) +{ + unsigned long config_size =3D offsetof(struct vhost_vdpa_config, buf); + struct vhost_vdpa_config *config; + __virtio16 *max_queue_pairs; + uint64_t features; + int ret; + + ret =3D ioctl(fd, VHOST_GET_FEATURES, &features); + if (ret) { + error_setg(errp, "Fail to query features from vhost-vDPA device"); + return ret; + } + + if (features & (1 << VIRTIO_NET_F_CTRL_VQ)) { + *has_cvq =3D 1; + } else { + *has_cvq =3D 0; + } + + if (features & (1 << VIRTIO_NET_F_MQ)) { + config =3D g_malloc0(config_size + sizeof(*max_queue_pairs)); + config->off =3D offsetof(struct virtio_net_config, max_virtqueue_p= airs); + config->len =3D sizeof(*max_queue_pairs); + + ret =3D ioctl(fd, VHOST_VDPA_GET_CONFIG, config); + if (ret) { + error_setg(errp, "Fail to get config from vhost-vDPA device"); + return -ret; + } + + max_queue_pairs =3D (__virtio16 *)&config->buf; + + return lduw_le_p(max_queue_pairs); + } + + return 1; +} + int net_init_vhost_vdpa(const Netdev *netdev, const char *name, NetClientState *peer, Error **errp) { const NetdevVhostVDPAOptions *opts; int vdpa_device_fd; - NetClientState *nc; + NetClientState **ncs, *nc; + int queue_pairs, i, has_cvq =3D 0; =20 assert(netdev->type =3D=3D NET_CLIENT_DRIVER_VHOST_VDPA); opts =3D &netdev->u.vhost_vdpa; @@ -206,11 +266,38 @@ int net_init_vhost_vdpa(const Netdev *netdev, const c= har *name, return -errno; } =20 - nc =3D net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name, vdpa_device_fd= ); - if (!nc) { + queue_pairs =3D vhost_vdpa_get_max_queue_pairs(vdpa_device_fd, + &has_cvq, errp); + if (queue_pairs < 0) { qemu_close(vdpa_device_fd); - return -1; + return queue_pairs; + } + + ncs =3D g_malloc0(sizeof(*ncs) * queue_pairs); + + for (i =3D 0; i < queue_pairs; i++) { + ncs[i] =3D net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name, + vdpa_device_fd, i, 2, true); + if (!ncs[i]) + goto err; } =20 + if (has_cvq) { + nc =3D net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name, + vdpa_device_fd, i, 1, false); + if (!nc) + goto err; + } + + g_free(ncs); return 0; + +err: + if (i) { + qemu_del_net_client(ncs[0]); + } + qemu_close(vdpa_device_fd); + g_free(ncs); + + return -1; } --=20 2.25.1