From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 28D63EFCE23 for ; Wed, 4 Mar 2026 17:36:27 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vxq8i-0003CN-9u; Wed, 04 Mar 2026 12:36:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vxq8g-0003By-F3 for qemu-devel@nongnu.org; Wed, 04 Mar 2026 12:36:02 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vxq8d-0004sC-5K for qemu-devel@nongnu.org; Wed, 04 Mar 2026 12:36:01 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772645755; 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=pJcBbWgk55Xy56aKGdb0PF2VLcZ2WdttuXvg1P3uOiQ=; b=B8e3STCCN8iVohedm3InJp5cMDC6IqmGiil/sUuw+q0iu+LPJmj4eDKM2a7Rx5IXFFZ5Jt BcMYFSu6Ao3BL//cRsWv9E1sP+5rDfmttHZkYE/h/xPkEdaTkPa9fSy5q+ZRMGs+fER2S5 OvhCU9BXESv9UOqUy4r4I0IsFOMM99I= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-648-HKQLJMZtOHyBGUPV9aGh8A-1; Wed, 04 Mar 2026 12:35:51 -0500 X-MC-Unique: HKQLJMZtOHyBGUPV9aGh8A-1 X-Mimecast-MFC-AGG-ID: HKQLJMZtOHyBGUPV9aGh8A_1772645750 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id C80F7195609D; Wed, 4 Mar 2026 17:35:50 +0000 (UTC) Received: from fedora.redhat.com (unknown [10.45.224.212]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id BB7BF1958DC5; Wed, 4 Mar 2026 17:35:46 +0000 (UTC) From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= To: qemu-devel@nongnu.org Cc: Laurent Vivier , Jason Wang , Dragos Tatulea DE , Jonah Palmer , "Michael S. Tsirkin" , =?UTF-8?q?Eugenio=20P=C3=A9rez?= , Lei Yang , Koushik Dutta , Stefano Garzarella , qemu-stable@nongnu.org, Cindy Lu , Maxime Coquelin Subject: [PATCH 2/7] vhost: move svq next desc array to descs state struct Date: Wed, 4 Mar 2026 18:35:30 +0100 Message-ID: <20260304173535.2702587-3-eperezma@redhat.com> In-Reply-To: <20260304173535.2702587-1-eperezma@redhat.com> References: <20260304173535.2702587-1-eperezma@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 Received-SPF: pass client-ip=170.10.133.124; envelope-from=eperezma@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 33 X-Spam_score: 3.3 X-Spam_bar: +++ X-Spam_report: (3.3 / 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_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.703, RCVD_IN_VALIDITY_SAFE_BLOCKED=1.386, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org It's the right place for it as it is part of the descriptor state. We save the memory management of the array, and make the code changes of the next patches easier. Signed-off-by: Eugenio Pérez --- hw/virtio/vhost-shadow-virtqueue.c | 14 ++++++-------- hw/virtio/vhost-shadow-virtqueue.h | 12 ++++++------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c index 6242aeb69c1a..901253d06e50 100644 --- a/hw/virtio/vhost-shadow-virtqueue.c +++ b/hw/virtio/vhost-shadow-virtqueue.c @@ -175,7 +175,7 @@ static bool vhost_svq_vring_write_descs(VhostShadowVirtqueue *svq, hwaddr *sg, for (n = 0; n < num; n++) { if (more_descs || (n + 1 < num)) { descs[i].flags = flags | cpu_to_le16(VRING_DESC_F_NEXT); - descs[i].next = cpu_to_le16(svq->desc_next[i]); + descs[i].next = cpu_to_le16(svq->desc_state[i].next); } else { descs[i].flags = flags; } @@ -183,10 +183,10 @@ static bool vhost_svq_vring_write_descs(VhostShadowVirtqueue *svq, hwaddr *sg, descs[i].len = cpu_to_le32(iovec[n].iov_len); last = i; - i = svq->desc_next[i]; + i = svq->desc_state[i].next; } - svq->free_head = svq->desc_next[last]; + svq->free_head = svq->desc_state[last].next; return true; } @@ -432,7 +432,7 @@ static uint16_t vhost_svq_last_desc_of_chain(const VhostShadowVirtqueue *svq, uint16_t num, uint16_t i) { for (uint16_t j = 0; j < (num - 1); ++j) { - i = svq->desc_next[i]; + i = svq->desc_state[i].next; } return i; @@ -473,7 +473,7 @@ static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq, num = svq->desc_state[used_elem.id].ndescs; svq->desc_state[used_elem.id].ndescs = 0; last_used_chain = vhost_svq_last_desc_of_chain(svq, num, used_elem.id); - svq->desc_next[last_used_chain] = svq->free_head; + svq->desc_state[last_used_chain].next = svq->free_head; svq->free_head = used_elem.id; svq->num_free += num; @@ -705,9 +705,8 @@ void vhost_svq_start(VhostShadowVirtqueue *svq, VirtIODevice *vdev, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); svq->desc_state = g_new0(SVQDescState, svq->vring.num); - svq->desc_next = g_new0(uint16_t, svq->vring.num); for (unsigned i = 0; i < svq->vring.num - 1; i++) { - svq->desc_next[i] = i + 1; + svq->desc_state[i].next = i + 1; } } @@ -744,7 +743,6 @@ void vhost_svq_stop(VhostShadowVirtqueue *svq) virtqueue_unpop(svq->vq, next_avail_elem, 0); } svq->vq = NULL; - g_free(svq->desc_next); g_free(svq->desc_state); munmap(svq->vring.desc, vhost_svq_driver_area_size(svq)); munmap(svq->vring.used, vhost_svq_device_area_size(svq)); diff --git a/hw/virtio/vhost-shadow-virtqueue.h b/hw/virtio/vhost-shadow-virtqueue.h index 9c273739d6df..f52c33e65046 100644 --- a/hw/virtio/vhost-shadow-virtqueue.h +++ b/hw/virtio/vhost-shadow-virtqueue.h @@ -23,6 +23,12 @@ typedef struct SVQDescState { * guest's */ unsigned int ndescs; + + /* + * Backup next field for each descriptor so we can recover securely, not + * needing to trust the device access. + */ + uint16_t next; } SVQDescState; typedef struct VhostShadowVirtqueue VhostShadowVirtqueue; @@ -84,12 +90,6 @@ typedef struct VhostShadowVirtqueue { /* Next VirtQueue element that guest made available */ VirtQueueElement *next_guest_avail_elem; - /* - * Backup next field for each descriptor so we can recover securely, not - * needing to trust the device access. - */ - uint16_t *desc_next; - /* Caller callbacks */ const VhostShadowVirtqueueOps *ops; -- 2.53.0