From nobody Tue Apr 1 07:46:25 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1742824841; cv=none; d=zohomail.com; s=zohoarc; b=K+iWLL4Hgt26QPowCZTT4iLONyDF3FkZGaMCRJGxqjDQi2/7dY1LwFOpj0pxDEyBPeL9IPNtJviqhdYpn8ITbo36WEde2ffhAgMUzeH1PnKE9BZ4a6Lh55TzkPqYmwQDCors1rYhXBRILh32RlSUYJ76roi8NpfL5nyJFPciTJk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1742824841; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=qxKEcv5S9QjMePEO14d+2fv4DpH3hNFE45wGwOXGF1U=; b=bF6vImNLb3q1fwl6r0OnUMBxIbyysnfrgP+DKZ8wSZC9475hsLEvgNGSH6329V61JAp9R0+GZv66Wzva4Y79I8V/6lGpFL60dhr+zEsJpfxAXb94/WPjllNchUBr8UDNgV/s2Hx4mvX7Ytj0Tze8zgrZkds2Fy2UZ1pflwSOqMs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1742824841613366.6642679481557; Mon, 24 Mar 2025 07:00:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1twiLo-0006vl-Qn; Mon, 24 Mar 2025 10:00:28 -0400 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 1twiLO-0006nN-DC for qemu-devel@nongnu.org; Mon, 24 Mar 2025 10:00:02 -0400 Received: from mail-pl1-x629.google.com ([2607:f8b0:4864:20::629]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1twiLJ-00043J-Q7 for qemu-devel@nongnu.org; Mon, 24 Mar 2025 09:59:56 -0400 Received: by mail-pl1-x629.google.com with SMTP id d9443c01a7336-22423adf751so79588155ad.2 for ; Mon, 24 Mar 2025 06:59:53 -0700 (PDT) Received: from valdaarhun.. ([2401:4900:1c7e:7fd6:5c7b:30a9:c6b6:f81d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7390614afb5sm7870544b3a.121.2025.03.24.06.59.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Mar 2025 06:59:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742824792; x=1743429592; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qxKEcv5S9QjMePEO14d+2fv4DpH3hNFE45wGwOXGF1U=; b=V9/rFuWjgelzmKc0yyP/MCwILwSOriExsp/gGE4q410VrVvE4SkcT2HZkJ36duhAQq 5HdxLeObwItNsHW/Z0Rck4lyERnZVxKH6q1SMoHMQ4Z/mmwf39/RkNquX6SDrTYKkh6s 2IzlbtkrOOe5lg7fR7glw5nJll8CwEnowTajWkufZkfvKHkfh1y+Jwt3J2lQHXr+g45/ EAXcUz0MK5CoWtf/wd5f2PaOBn0HgM2jR2cdQUfW7HgtZagqW/DnibrDurkwCeG0DKoP qznywBn4As09BlltJktbmjLnvMP86GTMKWhSPuorz+dTOgqSnpznRwBfl1ZFt6f+5y9G PvYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742824792; x=1743429592; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qxKEcv5S9QjMePEO14d+2fv4DpH3hNFE45wGwOXGF1U=; b=QJPO67DfCO0/dPjHll3CVOJxkKk3EMKKAlq4YcHAO70kws7otGFbaDLcfEEpHx+JzS K/8co9sjozB+2P1vPq7cHSxPICiwIvIaI6k6eqJu4bScrkZnSn+HobNxrqen8YqdDugi AjCPrhP8cI3KRRePNRw7P3Q27S0yey42LIGWvQfS51hPp5TXZKn0auZjFi0GpsMjv1Z8 CTN7I4E7B0/AUotsOFoMGNUQqsrHNaMgZk1qpdBoPfTmusfTi2iVrYyr5xcJylByN6ie +VAtSGHPOjXOF1lwqPow9tHBkKz2nfq3ofanEZHQFLfQOLG0YXRwf56I8f++S2YN2xH1 exrw== X-Forwarded-Encrypted: i=1; AJvYcCXgoALFOwRQxWJwdvDW1UCykwN/brdb1dcAANOp6brQkXdyCVYirnJwlwyTlqymu6wRWBZa2p2Oy44Q@nongnu.org X-Gm-Message-State: AOJu0YwfI7iYWzUmOosrsPFevCSKywNAjUVYC7zqnxi+/fQBaTQHrpL+ 4AITWS6gGWj4LZhIcGUx3Qfnms3a3r9rDD9mRakTKX+bXQqMXdq2o4/Fug== X-Gm-Gg: ASbGncsyAkJTRDEB9OXLa+sBfxpcE+c+ngzooDT/Wqh1GMuMRoufvloyeUEB1r8TJAN CqVpNXbU/3xfB8D1NoAQ2gf0cUFBl9jbX+X8glW95QZI7hm1tJKSVfZT1Q+xsFQWstCX+uZfJVZ OwfZssc7JQLuO3eLxsRBIDe9WKPE1H6A4MtHmsORZDA1Aqm15g82oXMHckAATW6AzplMP4dgHq6 a8r3/mzUM8oAJRfRwok7+Kh2rZ4uI1/fhzdaDKB6w39wjXG3r5RIGJWnpQH6CtvRWXG6HXylNdG 7sPQqAhIQMp7rnlXDrKKSmjqMUshM938sLPzkrpGm09YI7Ix5A== X-Google-Smtp-Source: AGHT+IHD5IHgRcPuKVkgD1wrHgYslu1D8Mcx6cy+9D3rGGYQlqCyP0T0HJANzsctUS0N3WsRPIAJWQ== X-Received: by 2002:a05:6a20:2585:b0:1f5:7eb5:72c7 with SMTP id adf61e73a8af0-1fe4300f7d1mr21318870637.29.1742824791641; Mon, 24 Mar 2025 06:59:51 -0700 (PDT) From: Sahil Siddiq X-Google-Original-From: Sahil Siddiq To: eperezma@redhat.com, sgarzare@redhat.com Cc: mst@redhat.com, qemu-devel@nongnu.org, sahilcdq@proton.me Subject: [RFC v5 1/7] vhost: Refactor vhost_svq_add_split Date: Mon, 24 Mar 2025 19:29:15 +0530 Message-ID: <20250324135929.74945-2-sahilcdq@proton.me> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250324135929.74945-1-sahilcdq@proton.me> References: <20250324135929.74945-1-sahilcdq@proton.me> MIME-Version: 1.0 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=2607:f8b0:4864:20::629; envelope-from=icegambit91@gmail.com; helo=mail-pl1-x629.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, 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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1742824842658019000 Content-Type: text/plain; charset="utf-8" This commit refactors vhost_svq_add_split and vhost_svq_add to simplify their implementation and prepare for the addition of packed vqs in the following commits. Signed-off-by: Sahil Siddiq Acked-by: Eugenio P=C3=A9rez --- No changes from v4 -> v5. hw/virtio/vhost-shadow-virtqueue.c | 107 +++++++++++------------------ 1 file changed, 41 insertions(+), 66 deletions(-) diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-vi= rtqueue.c index 2481d49345..4f74ad402a 100644 --- a/hw/virtio/vhost-shadow-virtqueue.c +++ b/hw/virtio/vhost-shadow-virtqueue.c @@ -139,87 +139,48 @@ static bool vhost_svq_translate_addr(const VhostShado= wVirtqueue *svq, } =20 /** - * Write descriptors to SVQ vring + * Write descriptors to SVQ split vring * * @svq: The shadow virtqueue - * @sg: Cache for hwaddr - * @iovec: The iovec from the guest - * @num: iovec length - * @addr: Descriptors' GPAs, if backed by guest memory - * @more_descs: True if more descriptors come in the chain - * @write: True if they are writeable descriptors - * - * Return true if success, false otherwise and print error. + * @out_sg: The iovec to the guest + * @out_num: Outgoing iovec length + * @in_sg: The iovec from the guest + * @in_num: Incoming iovec length + * @sgs: Cache for hwaddr + * @head: Saves current free_head */ -static bool vhost_svq_vring_write_descs(VhostShadowVirtqueue *svq, hwaddr = *sg, - const struct iovec *iovec, size_t = num, - const hwaddr *addr, bool more_desc= s, - bool write) +static void vhost_svq_add_split(VhostShadowVirtqueue *svq, + const struct iovec *out_sg, size_t out_num, + const struct iovec *in_sg, size_t in_num, + hwaddr *sgs, unsigned *head) { + unsigned avail_idx, n; uint16_t i =3D svq->free_head, last =3D svq->free_head; - unsigned n; - uint16_t flags =3D write ? cpu_to_le16(VRING_DESC_F_WRITE) : 0; + vring_avail_t *avail =3D svq->vring.avail; vring_desc_t *descs =3D svq->vring.desc; - bool ok; - - if (num =3D=3D 0) { - return true; - } + size_t num =3D in_num + out_num; =20 - ok =3D vhost_svq_translate_addr(svq, sg, iovec, num, addr); - if (unlikely(!ok)) { - return false; - } + *head =3D svq->free_head; =20 for (n =3D 0; n < num; n++) { - if (more_descs || (n + 1 < num)) { - descs[i].flags =3D flags | cpu_to_le16(VRING_DESC_F_NEXT); + descs[i].flags =3D cpu_to_le16(n < out_num ? 0 : VRING_DESC_F_WRIT= E); + if (n + 1 < num) { + descs[i].flags |=3D cpu_to_le16(VRING_DESC_F_NEXT); descs[i].next =3D cpu_to_le16(svq->desc_next[i]); + } + + descs[i].addr =3D cpu_to_le64(sgs[n]); + if (n < out_num) { + descs[i].len =3D cpu_to_le32(out_sg[n].iov_len); } else { - descs[i].flags =3D flags; + descs[i].len =3D cpu_to_le32(in_sg[n - out_num].iov_len); } - descs[i].addr =3D cpu_to_le64(sg[n]); - descs[i].len =3D cpu_to_le32(iovec[n].iov_len); =20 last =3D i; i =3D svq->desc_next[i]; } =20 svq->free_head =3D svq->desc_next[last]; - return true; -} - -static bool vhost_svq_add_split(VhostShadowVirtqueue *svq, - const struct iovec *out_sg, size_t out_num, - const hwaddr *out_addr, - const struct iovec *in_sg, size_t in_num, - const hwaddr *in_addr, unsigned *head) -{ - unsigned avail_idx; - vring_avail_t *avail =3D svq->vring.avail; - bool ok; - g_autofree hwaddr *sgs =3D g_new(hwaddr, MAX(out_num, in_num)); - - *head =3D svq->free_head; - - /* We need some descriptors here */ - if (unlikely(!out_num && !in_num)) { - qemu_log_mask(LOG_GUEST_ERROR, - "Guest provided element with no descriptors"); - return false; - } - - ok =3D vhost_svq_vring_write_descs(svq, sgs, out_sg, out_num, out_addr, - in_num > 0, false); - if (unlikely(!ok)) { - return false; - } - - ok =3D vhost_svq_vring_write_descs(svq, sgs, in_sg, in_num, in_addr, f= alse, - true); - if (unlikely(!ok)) { - return false; - } =20 /* * Put the entry in the available array (but don't update avail->idx u= ntil @@ -233,7 +194,6 @@ static bool vhost_svq_add_split(VhostShadowVirtqueue *s= vq, smp_wmb(); avail->idx =3D cpu_to_le16(svq->shadow_avail_idx); =20 - return true; } =20 static void vhost_svq_kick(VhostShadowVirtqueue *svq) @@ -276,16 +236,31 @@ int vhost_svq_add(VhostShadowVirtqueue *svq, const st= ruct iovec *out_sg, unsigned ndescs =3D in_num + out_num; bool ok; =20 + /* We need some descriptors here */ + if (unlikely(!ndescs)) { + qemu_log_mask(LOG_GUEST_ERROR, + "Guest provided element with no descriptors"); + return -EINVAL; + } + if (unlikely(ndescs > vhost_svq_available_slots(svq))) { return -ENOSPC; } =20 - ok =3D vhost_svq_add_split(svq, out_sg, out_num, out_addr, in_sg, in_n= um, - in_addr, &qemu_head); + g_autofree hwaddr *sgs =3D g_new(hwaddr, ndescs); + ok =3D vhost_svq_translate_addr(svq, sgs, out_sg, out_num, out_addr); if (unlikely(!ok)) { return -EINVAL; } =20 + ok =3D vhost_svq_translate_addr(svq, sgs + out_num, in_sg, in_num, in_= addr); + if (unlikely(!ok)) { + return -EINVAL; + } + + vhost_svq_add_split(svq, out_sg, out_num, in_sg, + in_num, sgs, &qemu_head); + svq->num_free -=3D ndescs; svq->desc_state[qemu_head].elem =3D elem; svq->desc_state[qemu_head].ndescs =3D ndescs; --=20 2.48.1 From nobody Tue Apr 1 07:46:25 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1742824840; cv=none; d=zohomail.com; s=zohoarc; b=MlRIEVyqT4wm+R0c7rqvRfwl5blqIXLVHqY1v8+Xz6IkYELArB8DqoOTpS3sUbRN35bu8aGF7nUNfenV48PB0M3rdndWVNc6hEM4sxwWBkGzbHJkmdIwe8NdKEhh4BmWZw8N5kLj2N94PR7GLoI3Bc8XSEqnmw3Cy7clKwJTb3g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1742824840; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=/q2t0q3qYb96coVx11NQT5PZmW6Rt7r2gudCW01h9tU=; b=TcLUmi7YEDwA3pez4T50IWoL5N1tE7jhjOe1nHPtHm4Fey7TUM6P+5IzNlGrRjdW9z1QY+wclSipTvauuwkrfTsG5WzF2re54fBxJXQLItKQ0HQG/OX/mblcLf8q4hcs//dX6aOgQCAKe8qkHYqD2VPw3Yc0rWVbhGkiALy/9lg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 174282484046091.09030038118794; Mon, 24 Mar 2025 07:00:40 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1twiLo-0006vw-Ry; Mon, 24 Mar 2025 10:00:28 -0400 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 1twiLQ-0006nQ-BK for qemu-devel@nongnu.org; Mon, 24 Mar 2025 10:00:02 -0400 Received: from mail-pl1-x634.google.com ([2607:f8b0:4864:20::634]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1twiLO-00043m-9X for qemu-devel@nongnu.org; Mon, 24 Mar 2025 09:59:59 -0400 Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-22401f4d35aso89555155ad.2 for ; Mon, 24 Mar 2025 06:59:57 -0700 (PDT) Received: from valdaarhun.. ([2401:4900:1c7e:7fd6:5c7b:30a9:c6b6:f81d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7390614afb5sm7870544b3a.121.2025.03.24.06.59.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Mar 2025 06:59:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742824797; x=1743429597; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/q2t0q3qYb96coVx11NQT5PZmW6Rt7r2gudCW01h9tU=; b=lNTomRT/YWFmNylLBuVJtoI696WznhT0x3WaVlX6g4NqOc0UMhPIpXGEOiDoTwMxAb Rs1dBm1mdZ7vIE8RGcQUM0wzHKdyJJLk4j7VjBFcgBraCZBjfNrtMy42YCcCtmFfVlAK KV4nRt0zVECGtvLeSYe5E2rCY+b5xE1dih8V3XjSiUzqVnz2YLsf9gPFMfkU6/zBh1Qg ZBG8bBABIHVTIR8XuW5j9tRGW9sBdNI+aT0GymXxcGYtfcomvEJxGGilnjBwv8lGJHXC vUiAtno0PtQn4Q7uaVFsLoXxBuuEEuyjlmGCOAquqbaYNOl6KuZ0EieUgNYJWo5sj4yg xSig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742824797; x=1743429597; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/q2t0q3qYb96coVx11NQT5PZmW6Rt7r2gudCW01h9tU=; b=fP9h84VluNpZ54Ph7Q1zVGqqtji1j9UoCiaoDM4PJ5DOJO24taWClUXtEoLGgoeB2O wszfsMQD/J5BhaapkG7IQ+ePWGjW5pD50SSl8w2BqlHIBnf9rWTo5XuqMqE/fjNxyffo +Q+0ClBysCdahd5/ShVBmN1OBsmmldhPCyvVQiAWP3+ij8ihCLqRcPO26I1N85uIhQOL JB0Dx7eIvGBVUsfZUd8aKnJHSq3imrlC5g0DbFlwVogMSl6n5OUZtrwkaiH8yg3Z5em9 8ZmN/6gEI0QEwuGCnT8GFrNOBsAp347GtFFajdtES3mFPsqlNf3d7L2uQRQCFSoYO/xA xktQ== X-Forwarded-Encrypted: i=1; AJvYcCXjHbDnuF8A7a1pycSfdcOCqNNmBYCvxGV6oAuF4uMBEQGAdAUKOu4GvCrOVl0wAVjKODvjviyyir77@nongnu.org X-Gm-Message-State: AOJu0Yx3LXJSXWLffPqODAUZwdcVY652auFOSJ7qHIAM4d5zCrn0Y9tC XM7EroKgHXZSuZRItwr546DGNi4vJDNOwmmdNbSy6yQw4DP8wkXY X-Gm-Gg: ASbGncsw9KZPVG3tsntgtDhfSZRV0FfRbEsRFJz8GHRK22fr3/cGDE6a+LUgP8qJBkA /7+DG2ZDUrmQNxoLTB3cKw3r1BkR8zw8wgyrzwqyrG+FFKwD5zxVe/6ph/bd7HfOtoCIQUDM506 jpMiLBNgmi97MlmwqHqNp9jCSZ4um8CicW7EhxCKxBa0NoTN0pX+1ahKMM3mGd59l7OHr6xBzrL ZeJZ62J5Us6yD+7E/tOkbleWjbXsQRs8xMSvjIAVophDUTtSm20m0cX4XdBkOTNnePUqXO86A34 kRRw67C3Eo2voT3YfBmE5XJOTzB+UTp9vySgq/A= X-Google-Smtp-Source: AGHT+IFAUWmVb4Sg/XdrS7vjTPznhWndku+QpaziXuGLgeBA9mkwp4ckoarDTW+XXVjWNtY6oM4VRQ== X-Received: by 2002:a05:6a20:2d23:b0:1f5:5aac:f345 with SMTP id adf61e73a8af0-1fe43435c0fmr25499185637.36.1742824796418; Mon, 24 Mar 2025 06:59:56 -0700 (PDT) From: Sahil Siddiq X-Google-Original-From: Sahil Siddiq To: eperezma@redhat.com, sgarzare@redhat.com Cc: mst@redhat.com, qemu-devel@nongnu.org, sahilcdq@proton.me Subject: [RFC v5 2/7] vhost: Data structure changes to support packed vqs Date: Mon, 24 Mar 2025 19:29:16 +0530 Message-ID: <20250324135929.74945-3-sahilcdq@proton.me> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250324135929.74945-1-sahilcdq@proton.me> References: <20250324135929.74945-1-sahilcdq@proton.me> MIME-Version: 1.0 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=2607:f8b0:4864:20::634; envelope-from=icegambit91@gmail.com; helo=mail-pl1-x634.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, 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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1742824842391019000 Content-Type: text/plain; charset="utf-8" Introduce "struct vring_packed". Modify VhostShadowVirtqueue so it can support split and packed virtqueue formats. Signed-off-by: Sahil Siddiq --- Changes from v4 -> v5: - This was commit #3 in v4. This has been reordered to commit #2 based on review comments. - Place shadow_avail_idx, shadow_used_idx, last_used_idx above the "shadow vring" union. hw/virtio/vhost-shadow-virtqueue.h | 87 +++++++++++++++++++----------- 1 file changed, 56 insertions(+), 31 deletions(-) diff --git a/hw/virtio/vhost-shadow-virtqueue.h b/hw/virtio/vhost-shadow-vi= rtqueue.h index 9c273739d6..5f7699da9d 100644 --- a/hw/virtio/vhost-shadow-virtqueue.h +++ b/hw/virtio/vhost-shadow-virtqueue.h @@ -46,10 +46,65 @@ typedef struct VhostShadowVirtqueueOps { VirtQueueAvailCallback avail_handler; } VhostShadowVirtqueueOps; =20 +struct vring_packed { + /* Actual memory layout for this queue. */ + struct { + unsigned int num; + struct vring_packed_desc *desc; + struct vring_packed_desc_event *driver; + struct vring_packed_desc_event *device; + } vring; + + /* Avail used flags. */ + uint16_t avail_used_flags; + + /* Index of the next avail descriptor. */ + uint16_t next_avail_idx; + + /* Driver ring wrap counter */ + bool avail_wrap_counter; +}; + /* Shadow virtqueue to relay notifications */ typedef struct VhostShadowVirtqueue { + /* True if packed virtqueue */ + bool is_packed; + + /* Virtio queue shadowing */ + VirtQueue *vq; + + /* Virtio device */ + VirtIODevice *vdev; + + /* SVQ vring descriptors state */ + SVQDescState *desc_state; + + /* + * Backup next field for each descriptor so we can recover securely, n= ot + * needing to trust the device access. + */ + uint16_t *desc_next; + + /* Next free descriptor */ + uint16_t free_head; + + /* Size of SVQ vring free descriptors */ + uint16_t num_free; + + /* Next head to expose to the device */ + uint16_t shadow_avail_idx; + + /* Last seen used idx */ + uint16_t shadow_used_idx; + + /* Next head to consume from the device */ + uint16_t last_used_idx; + /* Shadow vring */ - struct vring vring; + union { + struct vring vring; + struct vring_packed vring_packed; + }; =20 /* Shadow kick notifier, sent to vhost */ EventNotifier hdev_kick; @@ -69,47 +124,17 @@ typedef struct VhostShadowVirtqueue { /* Guest's call notifier, where the SVQ calls guest. */ EventNotifier svq_call; =20 - /* Virtio queue shadowing */ - VirtQueue *vq; - - /* Virtio device */ - VirtIODevice *vdev; - /* IOVA mapping */ VhostIOVATree *iova_tree; =20 - /* SVQ vring descriptors state */ - SVQDescState *desc_state; - /* Next VirtQueue element that guest made available */ VirtQueueElement *next_guest_avail_elem; =20 - /* - * Backup next field for each descriptor so we can recover securely, n= ot - * needing to trust the device access. - */ - uint16_t *desc_next; - /* Caller callbacks */ const VhostShadowVirtqueueOps *ops; =20 /* Caller callbacks opaque */ void *ops_opaque; - - /* Next head to expose to the device */ - uint16_t shadow_avail_idx; - - /* Next free descriptor */ - uint16_t free_head; - - /* Last seen used idx */ - uint16_t shadow_used_idx; - - /* Next head to consume from the device */ - uint16_t last_used_idx; - - /* Size of SVQ vring free descriptors */ - uint16_t num_free; } VhostShadowVirtqueue; =20 bool vhost_svq_valid_features(uint64_t features, Error **errp); --=20 2.48.1 From nobody Tue Apr 1 07:46:25 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1742824885; cv=none; d=zohomail.com; s=zohoarc; b=Rste/8Ux+H6wm8G2UPJoUrYlpV6gB38Tmi2FqWIfui7w8Y+oLQ+0ewK+4aoUqgejnvk0xZqQyYJZ4GAiyxqiUzYIuh2OzM7fpD2sC0wStdcKQvvh4ysMCCcf6mmA72iT8y3Njf94U/vF/yjtBg2nGms1a8Epiz5/86ZurzGMGEQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1742824885; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=BzcbUoou4CVLHbkouLzdDRuspui/6y1Jg7LHkEflb4I=; b=SRLgpyZh4FQSMr742OVXAuSq5JEDNk7euCcJGYXKr5G15CORxVOQgIcVcn63oG/tznoE44deNuaRcIH+ABLSC/DbY/IGlivLiVzFnf98P75+l1lsfJ1zMyjQ3UAKpRIYHMQe0pUQqOUg8sDBbwuNsf23b01UZwLCl3gdw3cQJaw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1742824885181352.1003531774195; Mon, 24 Mar 2025 07:01:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1twiMK-0007KW-Tw; Mon, 24 Mar 2025 10:01:01 -0400 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 1twiLW-0006qq-OG for qemu-devel@nongnu.org; Mon, 24 Mar 2025 10:00:07 -0400 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1twiLU-00044o-6S for qemu-devel@nongnu.org; Mon, 24 Mar 2025 10:00:06 -0400 Received: by mail-pl1-x62b.google.com with SMTP id d9443c01a7336-223fb0f619dso86567905ad.1 for ; Mon, 24 Mar 2025 07:00:03 -0700 (PDT) Received: from valdaarhun.. ([2401:4900:1c7e:7fd6:5c7b:30a9:c6b6:f81d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7390614afb5sm7870544b3a.121.2025.03.24.06.59.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Mar 2025 07:00:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742824802; x=1743429602; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BzcbUoou4CVLHbkouLzdDRuspui/6y1Jg7LHkEflb4I=; b=hslabvdAH7Ns6WZPZLGYQD9OKp4TNfCYD1mxhMvZ36MEU3MaGUabO5Obt7fTQcYgR+ o0TEV6qyQxI2T8jz6zwc6E78ArmZ+3B+U35Yjk7DZ2/wWEvQIqD2rxHb2jh2WwjmG0Pn H9T+C5vQqn1Zlq2NG1IgSjwcWB0/EDWQyHkFw8wr56ARSd33E7d8r5tvWolwTnbV/m6Z OYWe81d2HiKxqUOoEvPb6mj3ht89fdd3Bi6LEVsRZXZNlKATwHDwWyeqfeexCakuGr9E 7f+EGAOxoRJqOD0evf5rkc5cHX1l3gZCNJ5/H+rFoo5Z6AwWBmgnIxL7yY4774/zQMtm W74A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742824802; x=1743429602; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BzcbUoou4CVLHbkouLzdDRuspui/6y1Jg7LHkEflb4I=; b=lGn8SbyfzJfXhUJSoV/Q2doCBWzvQoYrfNhO1TWuxUPtySEMpn9rH1WwDFDbwATgOi oj0LN2P9qfAjvIvmsm/erlU8L2CxxH4bEotavwdsKF0y+2EYzFRkLPTEBJRcoy3gTNVN sbfn++HrKbO72BW+/fZyaSrMOqm535d5lftJ2mLQ031VPrR00agoTwQvMspeHaKroslq LBhF94l9mlHYvRqOGwyDVAjvsuJZNBO4EfNVbW+rhNLFEqy2207eLmelcdQGfVvlRxdQ HLaH3SzihZPlM60LjXTOvLD23nsqs4uE0a93D5ewmg/2rP1xbcrFOtuuo4KW1pEqL6hi JI4A== X-Forwarded-Encrypted: i=1; AJvYcCXLF7dl/e5HKylQtEFG5T6OHIl1ANlNCjQI1W5R/8EMtGFa11DYFLg3cCyk+iR16deP192BfyuNfaZp@nongnu.org X-Gm-Message-State: AOJu0YzB5z3J+vzO1sIG7N0Z2itdx7RPrQ+t9031dd3b60/jSnp1B2vy 1+qZjMVi/ThlEpVRxD/66XsL++f/2OVzDeaOC0bEfGwz4M7kJkzY7Z7SCQ== X-Gm-Gg: ASbGncs4vUoLF3OAwENrJEOmv33pnUBvVuy+3PKlSzesERP328RxHVcplQ5hxROM6Q/ A7fudIJRP+6R8Y8XlFy4pnGBYoGMDjFEdWfIPzszwG+11cwh4sXUmxRqSdZT3AfdSwC+8zNgKIZ hUWOUjyTcs4nmyOQT9myuZ6MIzp5UNfgi7mbCFETtkDhdjQvMNqdPosUTdcQuorSujdgPRLei3I 8tg1+Fp2S/9ukQZFVv2lC/NFnqUsn6UJO32n0NRPwtKIPg98GZtZCzutijhRsX2iIyVq2hsZJmc prM+0SJq3c228JsiPm3SS9MQP8VSy9wIahsZ/B8= X-Google-Smtp-Source: AGHT+IHVvyMoAJPrxMDcE9ef80YtffcNQ77CKqpnUQXXMq3Ad4WHllFadbSeey+xxPGTQsLvXEWTeA== X-Received: by 2002:a05:6a00:2288:b0:736:53bc:f1ab with SMTP id d2e1a72fcca58-7390599aa32mr20143425b3a.12.1742824801657; Mon, 24 Mar 2025 07:00:01 -0700 (PDT) From: Sahil Siddiq X-Google-Original-From: Sahil Siddiq To: eperezma@redhat.com, sgarzare@redhat.com Cc: mst@redhat.com, qemu-devel@nongnu.org, sahilcdq@proton.me Subject: [RFC v5 3/7] vhost: Forward descriptors to device via packed SVQ Date: Mon, 24 Mar 2025 19:29:17 +0530 Message-ID: <20250324135929.74945-4-sahilcdq@proton.me> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250324135929.74945-1-sahilcdq@proton.me> References: <20250324135929.74945-1-sahilcdq@proton.me> MIME-Version: 1.0 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=2607:f8b0:4864:20::62b; envelope-from=icegambit91@gmail.com; helo=mail-pl1-x62b.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, 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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1742824887102019100 Content-Type: text/plain; charset="utf-8" Implement the insertion of available buffers in the descriptor area of packed shadow virtqueues. It takes into account descriptor chains, but does not consider indirect descriptors. Enable the packed SVQ to forward the descriptors to the device. Signed-off-by: Sahil Siddiq --- Changes from v4 -> v5: - This was commit #2 in v4. This has been reordered to commit #3 based on review comments. - vhost-shadow-virtqueue.c: (vhost_svq_valid_features): Move addition of enums to commit #6 based on review comments. (vhost_svq_add_packed): Set head_idx to buffer id instead of vring's index. (vhost_svq_kick): Split into vhost_svq_kick_split and vhost_svq_kick_packed. (vhost_svq_add): Use new vhost_svq_kick_* functions. hw/virtio/vhost-shadow-virtqueue.c | 117 +++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 5 deletions(-) diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-vi= rtqueue.c index 4f74ad402a..6e16cd4bdf 100644 --- a/hw/virtio/vhost-shadow-virtqueue.c +++ b/hw/virtio/vhost-shadow-virtqueue.c @@ -193,10 +193,83 @@ static void vhost_svq_add_split(VhostShadowVirtqueue = *svq, /* Update the avail index after write the descriptor */ smp_wmb(); avail->idx =3D cpu_to_le16(svq->shadow_avail_idx); +} + +/** + * Write descriptors to SVQ packed vring + * + * @svq: The shadow virtqueue + * @out_sg: The iovec to the guest + * @out_num: Outgoing iovec length + * @in_sg: The iovec from the guest + * @in_num: Incoming iovec length + * @sgs: Cache for hwaddr + * @head: Saves current free_head + */ +static void vhost_svq_add_packed(VhostShadowVirtqueue *svq, + const struct iovec *out_sg, size_t out_nu= m, + const struct iovec *in_sg, size_t in_num, + hwaddr *sgs, unsigned *head) +{ + uint16_t id, curr, i, head_flags =3D 0, head_idx; + size_t num =3D out_num + in_num; + unsigned n; + + struct vring_packed_desc *descs =3D svq->vring_packed.vring.desc; + + head_idx =3D svq->vring_packed.next_avail_idx; + i =3D head_idx; + id =3D svq->free_head; + curr =3D id; + *head =3D id; + + /* Write descriptors to SVQ packed vring */ + for (n =3D 0; n < num; n++) { + uint16_t flags =3D cpu_to_le16(svq->vring_packed.avail_used_flags | + (n < out_num ? 0 : VRING_DESC_F_WRITE= ) | + (n + 1 =3D=3D num ? 0 : VRING_DESC_F_= NEXT)); + if (i =3D=3D head_idx) { + head_flags =3D flags; + } else { + descs[i].flags =3D flags; + } + + descs[i].addr =3D cpu_to_le64(sgs[n]); + descs[i].id =3D id; + if (n < out_num) { + descs[i].len =3D cpu_to_le32(out_sg[n].iov_len); + } else { + descs[i].len =3D cpu_to_le32(in_sg[n - out_num].iov_len); + } + + curr =3D cpu_to_le16(svq->desc_next[curr]); + + if (++i >=3D svq->vring_packed.vring.num) { + i =3D 0; + svq->vring_packed.avail_used_flags ^=3D + 1 << VRING_PACKED_DESC_F_AVAIL | + 1 << VRING_PACKED_DESC_F_USED; + } + } =20 + if (i <=3D head_idx) { + svq->vring_packed.avail_wrap_counter ^=3D 1; + } + + svq->vring_packed.next_avail_idx =3D i; + svq->shadow_avail_idx =3D i; + svq->free_head =3D curr; + + /* + * A driver MUST NOT make the first descriptor in the list + * available before all subsequent descriptors comprising + * the list are made available. + */ + smp_wmb(); + svq->vring_packed.vring.desc[head_idx].flags =3D head_flags; } =20 -static void vhost_svq_kick(VhostShadowVirtqueue *svq) +static void vhost_svq_kick_split(VhostShadowVirtqueue *svq) { bool needs_kick; =20 @@ -209,7 +282,8 @@ static void vhost_svq_kick(VhostShadowVirtqueue *svq) if (virtio_vdev_has_feature(svq->vdev, VIRTIO_RING_F_EVENT_IDX)) { uint16_t avail_event =3D le16_to_cpu( *(uint16_t *)(&svq->vring.used->ring[svq->vring.num])); - needs_kick =3D vring_need_event(avail_event, svq->shadow_avail_idx= , svq->shadow_avail_idx - 1); + needs_kick =3D vring_need_event(avail_event, svq->shadow_avail_idx, + svq->shadow_avail_idx - 1); } else { needs_kick =3D !(svq->vring.used->flags & cpu_to_le16(VRING_USED_F_NO_NOT= IFY)); @@ -222,6 +296,30 @@ static void vhost_svq_kick(VhostShadowVirtqueue *svq) event_notifier_set(&svq->hdev_kick); } =20 +static void vhost_svq_kick_packed(VhostShadowVirtqueue *svq) +{ + bool needs_kick; + + /* + * We need to expose the available array entries before checking + * notification suppressions. + */ + smp_mb(); + + if (virtio_vdev_has_feature(svq->vdev, VIRTIO_RING_F_EVENT_IDX)) { + return; + } else { + needs_kick =3D (svq->vring_packed.vring.device->flags !=3D + cpu_to_le16(VRING_PACKED_EVENT_FLAG_DISABLE)); + } + + if (!needs_kick) { + return; + } + + event_notifier_set(&svq->hdev_kick); +} + /** * Add an element to a SVQ. * @@ -258,13 +356,22 @@ int vhost_svq_add(VhostShadowVirtqueue *svq, const st= ruct iovec *out_sg, return -EINVAL; } =20 - vhost_svq_add_split(svq, out_sg, out_num, in_sg, - in_num, sgs, &qemu_head); + if (svq->is_packed) { + vhost_svq_add_packed(svq, out_sg, out_num, in_sg, + in_num, sgs, &qemu_head); + } else { + vhost_svq_add_split(svq, out_sg, out_num, in_sg, + in_num, sgs, &qemu_head); + } =20 svq->num_free -=3D ndescs; svq->desc_state[qemu_head].elem =3D elem; svq->desc_state[qemu_head].ndescs =3D ndescs; - vhost_svq_kick(svq); + if (svq->is_packed) { + vhost_svq_kick_packed(svq); + } else { + vhost_svq_kick_split(svq); + } return 0; } =20 --=20 2.48.1 From nobody Tue Apr 1 07:46:25 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1742825015; cv=none; d=zohomail.com; s=zohoarc; b=MwvRXGYZUChs55ILCUqqJHvrjoh+LOHM67dhqUZxzMiMoETWU03uX5P4kXOJ8DJBHH5ogH0Q2mJJFiT//itnM+fLFKYWq8SJcPMN+ZCW7cZwrUOUEKBBX6MJx1Ke49hDv+T5T+NAkY8HCQgBXulfLQGA7f5UVrwQ8cHoeYUJsHE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1742825015; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rSuhcobXqPF1Pt7G4Hh20PpkvZheRGH7hYC3WNW5UTs=; b=bDhu1DSz0dG78vztGxTtaOYB3JbaQ4aAjBsBUlcorE+ayVWn4msPoCYHRH/8axsqdfVvOh9F7+fhhLnMQw+ZDM3uPpHvqtdrvdX3kNh1BvLMIU7Zx6CPqFEMiMKeukSE1hxnZtjtQNcksg6+hxpIHYcDJL7Zhn1f/Sr634B8iiU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1742825015227915.2255007873283; Mon, 24 Mar 2025 07:03:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1twiOG-0008HY-2B; Mon, 24 Mar 2025 10:02:59 -0400 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 1twiLb-0006uD-1d for qemu-devel@nongnu.org; Mon, 24 Mar 2025 10:00:16 -0400 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1twiLY-0004Hl-6V for qemu-devel@nongnu.org; Mon, 24 Mar 2025 10:00:10 -0400 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-227a8cdd241so4892325ad.3 for ; Mon, 24 Mar 2025 07:00:07 -0700 (PDT) Received: from valdaarhun.. ([2401:4900:1c7e:7fd6:5c7b:30a9:c6b6:f81d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7390614afb5sm7870544b3a.121.2025.03.24.07.00.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Mar 2025 07:00:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742824806; x=1743429606; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rSuhcobXqPF1Pt7G4Hh20PpkvZheRGH7hYC3WNW5UTs=; b=ioW4VFXTl9k6FcyX+9QsBgRDn2JfRosc1jIybx063acXhy3Rztcx2ZkQUGHdYrRjYt bEvNkDQCY4mOEaY/x/LBJefwgvGy23wnRjTuacsWT4ZICZGv9BNhEm1QUfoeEjyZiSMl UKtOSmT8xaNRYYNGLN5DRI1KNaTlwsJDE1q5v5BvKApHyThIyGexu3EL2z8ALvA46+xp Zdgz1tQgsXsvKbzKAJhNsO/L6J9WP2ziicQNBc35vgw/4UDY2V5+QrZPhwEWMwhFhLhG m9mnBTIFzm64GOb/brCjm1HY21I7/dwygzH4njQNOU/3Wfkkx7sqb2TIbC6Emg9pUTPW SwlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742824806; x=1743429606; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rSuhcobXqPF1Pt7G4Hh20PpkvZheRGH7hYC3WNW5UTs=; b=k8Jo7/QZA8u9bh6UBYq15gYOBtNIfmiGSe50SeuzI2cRiskRebZjycT4LbOxrAuHDW DPtZBmX30ppB+qWtCtOxisY2XSN/VPMwjanElaucOnr2XASxJ1q3mcy8s3i5e3BeDG5d jTEtOU7E3RFmIKTXw3EzSaSZJG847lMA7cjWeFJSm5yezhp5oMMi/z04q1mUfBDmkSUo WNa1qUASuRHLN4yNZ7AvQ9oSy2IB8Jf0UAgqUOL2cWt1WK2PGvPzYaM0+D1Aa5is6+y6 2kc4g7pUJ1lcZKTe9d2mZiM8tviey+S/nl0sOoRns3PoCDs5FRwkcAfbq1dqdhUwJO9I k/WQ== X-Forwarded-Encrypted: i=1; AJvYcCX1kssHEpFmgbqKjXm+D1wfxw38dYBAe3/HEgCBD4+V4GQeeXSUtnK30zTCSqm2z0fppPxufE2JF8vh@nongnu.org X-Gm-Message-State: AOJu0Yy1hehQOSbFSianJGS6tUIjvv95YNuCKLW2U9oEjdBvbW1y/a6S Z4gjt4MyWCsRw1BK5lF/tS2Mx+yIj61Wq2gWhjGgNTb0ncqtOXtFxjbbVg== X-Gm-Gg: ASbGnctRjk4lvWjFeYQu5vbkLz7dV/V3pgSh20sI6xRzRNmXb5W8qh3IXnwdQO/wC6+ duMpepKbqQD1/lUgQALg2ZR9VQ7CduSN5gIbtEriMALrMeKrkDj5IT3bEvhda85TTVa3g6NfqKc /gC6rCUriyCYt5bsKuUqe7Z4ZRyU6W3Nj3Pcy5Jm2NQXYrFKFsaZE9ZEyyNDZzJpsd8KgCB0frc EqmgDRhxUJ5iN5k+vSjmKl154Jtna63bAS1FkTXHCVtlsZGSaJpfgvPdhAsPDlG0cNdcOPGOxcy RIXg/L7o/56gyH3bK2NNVLJZ4HuKsNEk4OObF8I= X-Google-Smtp-Source: AGHT+IEekDruNXqdXncn1P1P3XBll+iXRlgwpjMdQJoy43OxwketvkwdrMM6s7QD5ETYRunLFcnf9Q== X-Received: by 2002:a05:6a00:13a0:b0:736:ab48:18f0 with SMTP id d2e1a72fcca58-7390597ec9amr15762013b3a.1.1742824805815; Mon, 24 Mar 2025 07:00:05 -0700 (PDT) From: Sahil Siddiq X-Google-Original-From: Sahil Siddiq To: eperezma@redhat.com, sgarzare@redhat.com Cc: mst@redhat.com, qemu-devel@nongnu.org, sahilcdq@proton.me Subject: [RFC v5 4/7] vdpa: Allocate memory for SVQ and map them to vdpa Date: Mon, 24 Mar 2025 19:29:18 +0530 Message-ID: <20250324135929.74945-5-sahilcdq@proton.me> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250324135929.74945-1-sahilcdq@proton.me> References: <20250324135929.74945-1-sahilcdq@proton.me> MIME-Version: 1.0 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=2607:f8b0:4864:20::62d; envelope-from=icegambit91@gmail.com; helo=mail-pl1-x62d.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, 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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1742825017206019100 Content-Type: text/plain; charset="utf-8" Allocate memory for the packed vq format and map them to the vdpa device. Since "struct vring" and "struct vring_packed's vring" both have the same memory layout, the implementation in SVQ start and SVQ stop should not differ based on the vq's format. Also initialize flags, counters and indices for packed vqs before they are utilized. Signed-off-by: Sahil Siddiq Acked-by: Eugenio P=C3=A9rez --- Changes from v4 -> v5: - vhost-shadow-virtqueue.c: (vhost_svq_start): Initialize variables used by packed vring. hw/virtio/vhost-shadow-virtqueue.c | 52 +++++++++++++++++++++--------- hw/virtio/vhost-shadow-virtqueue.h | 1 + hw/virtio/vhost-vdpa.c | 37 +++++++++++++++++---- 3 files changed, 69 insertions(+), 21 deletions(-) diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-vi= rtqueue.c index 6e16cd4bdf..126957231d 100644 --- a/hw/virtio/vhost-shadow-virtqueue.c +++ b/hw/virtio/vhost-shadow-virtqueue.c @@ -707,19 +707,33 @@ void vhost_svq_get_vring_addr(const VhostShadowVirtqu= eue *svq, addr->used_user_addr =3D (uint64_t)(uintptr_t)svq->vring.used; } =20 -size_t vhost_svq_driver_area_size(const VhostShadowVirtqueue *svq) +size_t vhost_svq_descriptor_area_size(const VhostShadowVirtqueue *svq) { size_t desc_size =3D sizeof(vring_desc_t) * svq->vring.num; - size_t avail_size =3D offsetof(vring_avail_t, ring[svq->vring.num]) + - sizeof(uint1= 6_t); + return ROUND_UP(desc_size, qemu_real_host_page_size()); +} =20 - return ROUND_UP(desc_size + avail_size, qemu_real_host_page_size()); +size_t vhost_svq_driver_area_size(const VhostShadowVirtqueue *svq) +{ + size_t avail_size; + if (svq->is_packed) { + avail_size =3D sizeof(uint32_t); + } else { + avail_size =3D offsetof(vring_avail_t, ring[svq->vring.num]) + + sizeof(uint16= _t); + } + return ROUND_UP(avail_size, qemu_real_host_page_size()); } =20 size_t vhost_svq_device_area_size(const VhostShadowVirtqueue *svq) { - size_t used_size =3D offsetof(vring_used_t, ring[svq->vring.num]) + - sizeof(uint1= 6_t); + size_t used_size; + if (svq->is_packed) { + used_size =3D sizeof(uint32_t); + } else { + used_size =3D offsetof(vring_used_t, ring[svq->vring.num]) + + sizeof(uint16_t= ); + } return ROUND_UP(used_size, qemu_real_host_page_size()); } =20 @@ -764,8 +778,6 @@ void vhost_svq_set_svq_kick_fd(VhostShadowVirtqueue *sv= q, int svq_kick_fd) void vhost_svq_start(VhostShadowVirtqueue *svq, VirtIODevice *vdev, VirtQueue *vq, VhostIOVATree *iova_tree) { - size_t desc_size; - event_notifier_set_handler(&svq->hdev_call, vhost_svq_handle_call); svq->next_guest_avail_elem =3D NULL; svq->shadow_avail_idx =3D 0; @@ -774,20 +786,29 @@ void vhost_svq_start(VhostShadowVirtqueue *svq, VirtI= ODevice *vdev, svq->vdev =3D vdev; svq->vq =3D vq; svq->iova_tree =3D iova_tree; + svq->is_packed =3D virtio_vdev_has_feature(svq->vdev, VIRTIO_F_RING_PA= CKED); + + if (svq->is_packed) { + svq->vring_packed.avail_wrap_counter =3D 1; + svq->vring_packed.next_avail_idx =3D 0; + svq->vring_packed.avail_used_flags =3D 1 << VRING_PACKED_DESC_F_AV= AIL; + svq->last_used_idx =3D 0 | (1 << VRING_PACKED_EVENT_F_WRAP_CTR); + } =20 svq->vring.num =3D virtio_queue_get_num(vdev, virtio_get_queue_index(v= q)); svq->num_free =3D svq->vring.num; - svq->vring.desc =3D mmap(NULL, vhost_svq_driver_area_size(svq), + svq->vring.desc =3D mmap(NULL, vhost_svq_descriptor_area_size(svq), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYM= OUS, -1, 0); - desc_size =3D sizeof(vring_desc_t) * svq->vring.num; - svq->vring.avail =3D (void *)((char *)svq->vring.desc + desc_size); + svq->vring.avail =3D mmap(NULL, vhost_svq_driver_area_size(svq), + PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONY= MOUS, + -1, 0); svq->vring.used =3D mmap(NULL, vhost_svq_device_area_size(svq), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYM= OUS, -1, 0); - svq->desc_state =3D g_new0(SVQDescState, svq->vring.num); - svq->desc_next =3D g_new0(uint16_t, svq->vring.num); - for (unsigned i =3D 0; i < svq->vring.num - 1; i++) { + svq->desc_state =3D g_new0(SVQDescState, svq->num_free); + svq->desc_next =3D g_new0(uint16_t, svq->num_free); + for (unsigned i =3D 0; i < svq->num_free - 1; i++) { svq->desc_next[i] =3D i + 1; } } @@ -827,7 +848,8 @@ void vhost_svq_stop(VhostShadowVirtqueue *svq) svq->vq =3D NULL; g_free(svq->desc_next); g_free(svq->desc_state); - munmap(svq->vring.desc, vhost_svq_driver_area_size(svq)); + munmap(svq->vring.desc, vhost_svq_descriptor_area_size(svq)); + munmap(svq->vring.avail, vhost_svq_driver_area_size(svq)); munmap(svq->vring.used, vhost_svq_device_area_size(svq)); event_notifier_set_handler(&svq->hdev_call, NULL); } diff --git a/hw/virtio/vhost-shadow-virtqueue.h b/hw/virtio/vhost-shadow-vi= rtqueue.h index 5f7699da9d..12c6ea8be2 100644 --- a/hw/virtio/vhost-shadow-virtqueue.h +++ b/hw/virtio/vhost-shadow-virtqueue.h @@ -152,6 +152,7 @@ void vhost_svq_set_svq_kick_fd(VhostShadowVirtqueue *sv= q, int svq_kick_fd); void vhost_svq_set_svq_call_fd(VhostShadowVirtqueue *svq, int call_fd); void vhost_svq_get_vring_addr(const VhostShadowVirtqueue *svq, struct vhost_vring_addr *addr); +size_t vhost_svq_descriptor_area_size(const VhostShadowVirtqueue *svq); size_t vhost_svq_driver_area_size(const VhostShadowVirtqueue *svq); size_t vhost_svq_device_area_size(const VhostShadowVirtqueue *svq); =20 diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c index 7efbde3d4c..58c8931d89 100644 --- a/hw/virtio/vhost-vdpa.c +++ b/hw/virtio/vhost-vdpa.c @@ -1137,6 +1137,8 @@ static void vhost_vdpa_svq_unmap_rings(struct vhost_d= ev *dev, =20 vhost_vdpa_svq_unmap_ring(v, svq_addr.desc_user_addr); =20 + vhost_vdpa_svq_unmap_ring(v, svq_addr.avail_user_addr); + vhost_vdpa_svq_unmap_ring(v, svq_addr.used_user_addr); } =20 @@ -1191,38 +1193,61 @@ static bool vhost_vdpa_svq_map_rings(struct vhost_d= ev *dev, Error **errp) { ERRP_GUARD(); - DMAMap device_region, driver_region; + DMAMap descriptor_region, device_region, driver_region; struct vhost_vring_addr svq_addr; struct vhost_vdpa *v =3D dev->opaque; + size_t descriptor_size =3D vhost_svq_descriptor_area_size(svq); size_t device_size =3D vhost_svq_device_area_size(svq); size_t driver_size =3D vhost_svq_driver_area_size(svq); - size_t avail_offset; bool ok; =20 vhost_svq_get_vring_addr(svq, &svq_addr); =20 + descriptor_region =3D (DMAMap) { + .translated_addr =3D svq_addr.desc_user_addr, + .size =3D descriptor_size - 1, + .perm =3D IOMMU_RO, + }; + if (svq->is_packed) { + descriptor_region.perm =3D IOMMU_RW; + } + + ok =3D vhost_vdpa_svq_map_ring(v, &descriptor_region, svq_addr.desc_us= er_addr, + errp); + if (unlikely(!ok)) { + error_prepend(errp, "Cannot create vq descriptor region: "); + return false; + } + addr->desc_user_addr =3D descriptor_region.iova; + driver_region =3D (DMAMap) { + .translated_addr =3D svq_addr.avail_user_addr, .size =3D driver_size - 1, .perm =3D IOMMU_RO, }; - ok =3D vhost_vdpa_svq_map_ring(v, &driver_region, svq_addr.desc_user_a= ddr, + ok =3D vhost_vdpa_svq_map_ring(v, &driver_region, svq_addr.avail_user_= addr, errp); if (unlikely(!ok)) { error_prepend(errp, "Cannot create vq driver region: "); + vhost_vdpa_svq_unmap_ring(v, descriptor_region.translated_addr); return false; } - addr->desc_user_addr =3D driver_region.iova; - avail_offset =3D svq_addr.avail_user_addr - svq_addr.desc_user_addr; - addr->avail_user_addr =3D driver_region.iova + avail_offset; + addr->avail_user_addr =3D driver_region.iova; =20 device_region =3D (DMAMap) { + .translated_addr =3D svq_addr.used_user_addr, .size =3D device_size - 1, .perm =3D IOMMU_RW, }; + if (svq->is_packed) { + device_region.perm =3D IOMMU_WO; + } + ok =3D vhost_vdpa_svq_map_ring(v, &device_region, svq_addr.used_user_a= ddr, errp); if (unlikely(!ok)) { error_prepend(errp, "Cannot create vq device region: "); + vhost_vdpa_svq_unmap_ring(v, descriptor_region.translated_addr); vhost_vdpa_svq_unmap_ring(v, driver_region.translated_addr); } addr->used_user_addr =3D device_region.iova; --=20 2.48.1 From nobody Tue Apr 1 07:46:25 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1742824889; cv=none; d=zohomail.com; s=zohoarc; b=PPKHmM3niHXG0otbwmmpkrqsRbnr2lmu543VD8dh/Bui/UvOl1yBqfNNcwBMAVM3n2xR4c6QapEbJCmrAINnyxgi4Q+kQmkvpNNjC6oq9vEUthA+LUTiYFQ30ztucu6A05FYRP/oZhWHvVR0cpzKITU11e7K+mZwygKa2BC5ILw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1742824889; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=syGyxr2B/ai8s/rSZLKt/yNTwPgOQvFeWfVekUjCJzU=; b=HUToEObpFv2MVkeuvyb1NxFMNts56qd4lZ9ufW0Za/PcGaHtoyLiSyiHk8ALJKGfLjjOpw+KtjyGULFzFVxB/kT8kI0VBzd8d8VAbEgIUFgON2NMwEPuv65I/Tcawu/bjvSTBxBOEmDAEo5T89T5FKv+NwICiiUZ5ks6YlfheTM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1742824889381390.60349054191295; Mon, 24 Mar 2025 07:01:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1twiMN-0007L4-AL; Mon, 24 Mar 2025 10:01:04 -0400 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 1twiLe-0006vH-PQ for qemu-devel@nongnu.org; Mon, 24 Mar 2025 10:00:16 -0400 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1twiLc-0004J4-J0 for qemu-devel@nongnu.org; Mon, 24 Mar 2025 10:00:14 -0400 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-22548a28d0cso80708535ad.3 for ; Mon, 24 Mar 2025 07:00:12 -0700 (PDT) Received: from valdaarhun.. ([2401:4900:1c7e:7fd6:5c7b:30a9:c6b6:f81d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7390614afb5sm7870544b3a.121.2025.03.24.07.00.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Mar 2025 07:00:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742824811; x=1743429611; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=syGyxr2B/ai8s/rSZLKt/yNTwPgOQvFeWfVekUjCJzU=; b=YQO1tSYc+gTXy6/wvbU+31lYDR5ZcYNe0Po3iDNzaVhPj92zvW3F9e4mV5qngCYcdf 7g1+6yplHS+MIXayYBfoey8YOOUETXBC4LmKgGbG9HVI7+JpzGWoSDVLyeJeGOIZb5aL WuzT9z0sCKQi4LXrrMhqn4wGtxQH+pL/pgs8kjLWN3tENBbbRD9BOBc43qolV22+2tav XJdFCEFpK7H8y9ejbLb8H5eXIrEHIj9sUoOv5aDVjB2SX4t0WG1D9C2jgMamLQYtui52 zjeHTmHIir7+eLzETZO3yVhJNvtQWKKQr8OCMdPCSTSNYNdUGLaNDEp7AJ/Po27rifkC ltIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742824811; x=1743429611; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=syGyxr2B/ai8s/rSZLKt/yNTwPgOQvFeWfVekUjCJzU=; b=F1rrhtvq8OKSYLPtbkxh6DXkw2iA/brkh2xuhx0uuubJ1l5ZnpqL5fMbuV63NAFAKs Sz1Q9UxRu0pOkgSwooVV/QMbK8iPpyQDkVR92G4IVWmBL4sXh+hXBkz/sI+hJaqCw9wd dwijKwWBLH0JAO00v9M26dMqy7FMut9Ez/XjuC25WeEZe57LWcpelx+Jtt2UdaIHxJNq ZSFOPRBw1JtQPWhiPoSkUeZiFs5srWRiOzrWBjbMgCNUwLeSd/D0lfpP6IfsDox0o47X iAtrCIkSj/E59V7dZEQ8klZB5Q5ecYdYuLTMW6EFNOVU307+8s4AqLjJSF8EyKSXFgEN wrKA== X-Forwarded-Encrypted: i=1; AJvYcCVJGDYLmhiwwpjIrVRb4FrnfRYcIwU1S6CaGhCHUZg8FpJbuSs/AZnD2e7+DNj6ZENmMSBv9VBktK1Z@nongnu.org X-Gm-Message-State: AOJu0YxqIGS7953F92kgYjsF0BvmSBPqgVqAP0T5W/d7eR5NFy5HgI6h NDBlIijnjT97aZCiJW7Vw/MUYGltblcUJ5tWpKp/R6eTHujJFI39 X-Gm-Gg: ASbGnctkYhhkNBa+zLYdm1DrFekWvAgN+vVSo/8LdfmwjdCIJ64GRMlTvevsiziQJB2 gfNd/+Q4sMJMXUIcpjPbORlIZVb5HZvZAAXqrbRkNoH4wT9rO0FLO8AyFnEZtWzWRudmjcUygFD iwC2AGX20f+wTaV6zynFmvjsYCmppegHVvCbr9BWEpcoH0AaTj7jvb+lgJLH7XneLUtyZIwX0Oo fBxf1ZHcb8FMz4a0LUaJpDbnICj3eg1PeVBOp7MwkGasSVfo+6kfTCrgyxV9k1sqTrkG1HMulZB Li8LCN+zQULCRLT2cJsd2uXtsylvwZA23a9nv6c= X-Google-Smtp-Source: AGHT+IH9CNpxfurcSrOQzehqP7RHeS5Ueylqk+IO0a1WWxNg+24WoSMVp83h5sAlmTT9XeHjhBA9PQ== X-Received: by 2002:a05:6a00:3929:b0:736:ab21:8a69 with SMTP id d2e1a72fcca58-73905635469mr22933210b3a.0.1742824810601; Mon, 24 Mar 2025 07:00:10 -0700 (PDT) From: Sahil Siddiq X-Google-Original-From: Sahil Siddiq To: eperezma@redhat.com, sgarzare@redhat.com Cc: mst@redhat.com, qemu-devel@nongnu.org, sahilcdq@proton.me Subject: [RFC v5 5/7] vhost: Forward descriptors to guest via packed vqs Date: Mon, 24 Mar 2025 19:29:19 +0530 Message-ID: <20250324135929.74945-6-sahilcdq@proton.me> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250324135929.74945-1-sahilcdq@proton.me> References: <20250324135929.74945-1-sahilcdq@proton.me> MIME-Version: 1.0 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=2607:f8b0:4864:20::62f; envelope-from=icegambit91@gmail.com; helo=mail-pl1-x62f.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, 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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1742824890918019000 Content-Type: text/plain; charset="utf-8" Detect when used descriptors are ready for consumption by the guest via packed virtqueues and forward them from the device to the guest. Signed-off-by: Sahil Siddiq --- Changes from v4 -> v5: - New commit. - vhost-shadow-virtqueue.c: (vhost_svq_more_used): Split into vhost_svq_more_used_split and vhost_svq_more_used_packed. (vhost_svq_enable_notification): Handle split and packed vqs. (vhost_svq_disable_notification): Likewise. (vhost_svq_get_buf): Split into vhost_svq_get_buf_split and vhost_svq_get_buf_packed. (vhost_svq_poll): Use new functions. hw/virtio/vhost-shadow-virtqueue.c | 121 ++++++++++++++++++++++++++--- 1 file changed, 110 insertions(+), 11 deletions(-) diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-vi= rtqueue.c index 126957231d..8430b3c94a 100644 --- a/hw/virtio/vhost-shadow-virtqueue.c +++ b/hw/virtio/vhost-shadow-virtqueue.c @@ -463,7 +463,7 @@ static void vhost_handle_guest_kick_notifier(EventNotif= ier *n) vhost_handle_guest_kick(svq); } =20 -static bool vhost_svq_more_used(VhostShadowVirtqueue *svq) +static bool vhost_svq_more_used_split(VhostShadowVirtqueue *svq) { uint16_t *used_idx =3D &svq->vring.used->idx; if (svq->last_used_idx !=3D svq->shadow_used_idx) { @@ -475,6 +475,22 @@ static bool vhost_svq_more_used(VhostShadowVirtqueue *= svq) return svq->last_used_idx !=3D svq->shadow_used_idx; } =20 +static bool vhost_svq_more_used_packed(VhostShadowVirtqueue *svq) +{ + bool avail_flag, used_flag, used_wrap_counter; + uint16_t last_used_idx, last_used, flags; + + last_used_idx =3D svq->last_used_idx; + last_used =3D last_used_idx & ~(1 << VRING_PACKED_EVENT_F_WRAP_CTR); + used_wrap_counter =3D !!(last_used_idx & (1 << VRING_PACKED_EVENT_F_WR= AP_CTR)); + + flags =3D le16_to_cpu(svq->vring_packed.vring.desc[last_used].flags); + avail_flag =3D !!(flags & (1 << VRING_PACKED_DESC_F_AVAIL)); + used_flag =3D !!(flags & (1 << VRING_PACKED_DESC_F_USED)); + + return avail_flag =3D=3D used_flag && used_flag =3D=3D used_wrap_count= er; +} + /** * Enable vhost device calls after disable them. * @@ -486,16 +502,31 @@ static bool vhost_svq_more_used(VhostShadowVirtqueue = *svq) */ static bool vhost_svq_enable_notification(VhostShadowVirtqueue *svq) { + bool more_used; if (virtio_vdev_has_feature(svq->vdev, VIRTIO_RING_F_EVENT_IDX)) { - uint16_t *used_event =3D (uint16_t *)&svq->vring.avail->ring[svq->= vring.num]; - *used_event =3D cpu_to_le16(svq->shadow_used_idx); + if (!svq->is_packed) { + uint16_t *used_event =3D (uint16_t *)&svq->vring.avail->ring[s= vq->vring.num]; + *used_event =3D cpu_to_le16(svq->shadow_used_idx); + } } else { - svq->vring.avail->flags &=3D ~cpu_to_le16(VRING_AVAIL_F_NO_INTERRU= PT); + if (svq->is_packed) { + /* vq->vring_packed.vring.driver->off_wrap =3D cpu_to_le16(svq= ->last_used_idx); */ + svq->vring_packed.vring.driver->flags =3D + cpu_to_le16(VRING_PACKED_EVENT_FLAG_ENABLE); + } else { + svq->vring.avail->flags &=3D ~cpu_to_le16(VRING_AVAIL_F_NO_INT= ERRUPT); + } } =20 /* Make sure the event is enabled before the read of used_idx */ smp_mb(); - return !vhost_svq_more_used(svq); + if (svq->is_packed) { + more_used =3D !vhost_svq_more_used_packed(svq); + } else { + more_used =3D !vhost_svq_more_used_split(svq); + } + + return more_used; } =20 static void vhost_svq_disable_notification(VhostShadowVirtqueue *svq) @@ -505,7 +536,12 @@ static void vhost_svq_disable_notification(VhostShadow= Virtqueue *svq) * index is already an index too far away. */ if (!virtio_vdev_has_feature(svq->vdev, VIRTIO_RING_F_EVENT_IDX)) { - svq->vring.avail->flags |=3D cpu_to_le16(VRING_AVAIL_F_NO_INTERRUP= T); + if (svq->is_packed) { + svq->vring_packed.vring.driver->flags =3D + cpu_to_le16(VRING_PACKED_EVENT_FLAG_DISABLE); + } else { + svq->vring.avail->flags |=3D cpu_to_le16(VRING_AVAIL_F_NO_INTE= RRUPT); + } } } =20 @@ -519,15 +555,14 @@ static uint16_t vhost_svq_last_desc_of_chain(const Vh= ostShadowVirtqueue *svq, return i; } =20 -G_GNUC_WARN_UNUSED_RESULT -static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq, - uint32_t *len) +static VirtQueueElement *vhost_svq_get_buf_split(VhostShadowVirtqueue *svq, + uint32_t *len) { const vring_used_t *used =3D svq->vring.used; vring_used_elem_t used_elem; uint16_t last_used, last_used_chain, num; =20 - if (!vhost_svq_more_used(svq)) { + if (!vhost_svq_more_used_split(svq)) { return NULL; } =20 @@ -562,6 +597,66 @@ static VirtQueueElement *vhost_svq_get_buf(VhostShadow= Virtqueue *svq, return g_steal_pointer(&svq->desc_state[used_elem.id].elem); } =20 +static VirtQueueElement *vhost_svq_get_buf_packed(VhostShadowVirtqueue *sv= q, + uint32_t *len) +{ + bool used_wrap_counter; + uint16_t last_used_idx, last_used, id, num, last_used_chain; + + if (!vhost_svq_more_used_packed(svq)) { + return NULL; + } + + /* Only get used array entries after they have been exposed by dev */ + smp_rmb(); + last_used_idx =3D svq->last_used_idx; + last_used =3D last_used_idx & ~(1 << VRING_PACKED_EVENT_F_WRAP_CTR); + used_wrap_counter =3D !!(last_used_idx & (1 << VRING_PACKED_EVENT_F_WR= AP_CTR)); + id =3D le32_to_cpu(svq->vring_packed.vring.desc[last_used].id); + *len =3D le32_to_cpu(svq->vring_packed.vring.desc[last_used].len); + + if (unlikely(id >=3D svq->vring.num)) { + qemu_log_mask(LOG_GUEST_ERROR, "Device %s says index %u is used", + svq->vdev->name, id); + return NULL; + } + + if (unlikely(!svq->desc_state[id].ndescs)) { + qemu_log_mask(LOG_GUEST_ERROR, + "Device %s says index %u is used, but it was not available", + svq->vdev->name, id); + return NULL; + } + + num =3D svq->desc_state[id].ndescs; + svq->desc_state[id].ndescs =3D 0; + last_used_chain =3D vhost_svq_last_desc_of_chain(svq, num, id); + svq->desc_next[last_used_chain] =3D svq->free_head; + svq->free_head =3D id; + svq->num_free +=3D num; + + last_used +=3D num; + if (unlikely(last_used >=3D svq->vring_packed.vring.num)) { + last_used -=3D svq->vring_packed.vring.num; + used_wrap_counter ^=3D 1; + } + + last_used =3D (last_used | (used_wrap_counter << VRING_PACKED_EVENT_F_= WRAP_CTR)); + svq->last_used_idx =3D last_used; + return g_steal_pointer(&svq->desc_state[id].elem); +} + +G_GNUC_WARN_UNUSED_RESULT +static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq, + uint32_t *len) +{ + if (svq->is_packed) { + return vhost_svq_get_buf_packed(svq, len); + } + + return vhost_svq_get_buf_split(svq, len); +} + /** * Push an element to SVQ, returning it to the guest. */ @@ -639,7 +734,11 @@ size_t vhost_svq_poll(VhostShadowVirtqueue *svq, size_= t num) uint32_t r =3D 0; =20 do { - if (vhost_svq_more_used(svq)) { + if (!svq->is_packed && vhost_svq_more_used_split(svq)) { + break; + } + + if (svq->is_packed && vhost_svq_more_used_packed(svq)) { break; } =20 --=20 2.48.1 From nobody Tue Apr 1 07:46:25 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1742824893; cv=none; d=zohomail.com; s=zohoarc; b=VVwyGArfLzOPFq5kbAAatgd8DIvUJBmV9fWaw7kJfyH0gh8ZywryWS9yqHa2sdDhT2StoJckQjBAHVmzA+tqWgU5rluGhVoyroJIVzryvbAH4ZqQ6FoYZWAQUeesqOHdnHoItaP1eBeoWzO9UMRduM0ScFwjzz47u/qvThYDftQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1742824893; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=tlz5insXNGirWw1fpepNAXpu+8KjfbCSVztWowcaXXE=; b=brM8ByHHI84mynQ9NU+aw45K2YMn2802/sCk/ieElo3hXtwZbenEFN0ILY09lTpPazFSKqtZhwzlyHiZB7cjFtuIE9q0I+DbaNyWvw2+n2Q5i4mpuioYGeQp25lmUK8NnHWVq2/pvr3dvO1ajDpku57/evdQHdP8CUn4foD2/Ek= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1742824893772786.0078331353062; Mon, 24 Mar 2025 07:01:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1twiMb-0007Lv-99; Mon, 24 Mar 2025 10:01:17 -0400 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 1twiLj-0006wC-0O for qemu-devel@nongnu.org; Mon, 24 Mar 2025 10:00:21 -0400 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1twiLh-0004JX-AS for qemu-devel@nongnu.org; Mon, 24 Mar 2025 10:00:18 -0400 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-224341bbc1dso80794815ad.3 for ; Mon, 24 Mar 2025 07:00:16 -0700 (PDT) Received: from valdaarhun.. ([2401:4900:1c7e:7fd6:5c7b:30a9:c6b6:f81d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7390614afb5sm7870544b3a.121.2025.03.24.07.00.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Mar 2025 07:00:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742824816; x=1743429616; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=tlz5insXNGirWw1fpepNAXpu+8KjfbCSVztWowcaXXE=; b=BnhRVrli92sWdz9xLJI1L1ZUk4kbxZGwERMtpbqC6s8jlHkMGtZSpHtJycqBygfYme wvsQIhU9SRcThTzN0MSk25nSQyQge9ZpSzeaqVG4TCsWLPVYkuvYC6J194RhIpASAHvP K8iBmyPZI5MLuCFTY1Z3riMT0UeE/nm1sfjlb7ebCU4I2kujNtz2U0LX0tv7BkdImPwO b9/zQyctX3OQyoOZZe3EEnpZCOEDQFFy5u4TZnd1zqNRaRJdwTIecgbS4kWJsODv57aU 9+heYRWyY5qISRWvqKLLh54Wp0rdyMpkki7//UY+RjBBxqET6+6x2hp8ph5FGPAyRvla gg4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742824816; x=1743429616; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tlz5insXNGirWw1fpepNAXpu+8KjfbCSVztWowcaXXE=; b=vv0spP1IGzLtpwBlzPiu3U/ooeJckMljLJFY9m0MlAUQBWNsifOpYw3nexJbZZMx/c akomMRs8sxwGq0SDT1VSlG+25dShZKK/azzdPgxcc2ydWOXSAD1iOfYF5g0DTWBTzK5f sc13pGUoOJir8VPd3B9lwp82LjB4WEwi1kUl9azF6mWOSQSAQxDysJt03/s1pU/bX6Hn zJEp8uEM36PGFSmdQfMr46nvmjQkQK4SR5D2gx8pzEfQNzwlEr9JEc3+su+ZVchzUG4f e7ODEX3+OlGCYP3rl3H/44HIaURg+KwohAPXd+68cCoGTb073BWlxoHRi9YG5aL3/y1W QSCQ== X-Forwarded-Encrypted: i=1; AJvYcCXP0kD2BAecLi9ihL2YSWwX8xkKkPQm7GNYS/lqS1jGyUVjoxhSCUtk5tkjQ1zJjbr22W01IiCtjfR7@nongnu.org X-Gm-Message-State: AOJu0YxxxouD9GjTTGxLRw/5PTmml6Vdoyd/3XEhtBNj5LPDLlQK0aXu DttTXFuJQaBr+Mpi/f3CEhd1HDf9p97oafrxxE0KhbbMZyF+rwHc X-Gm-Gg: ASbGncuQlJ0Gk4yTT/PVgq9x2/LsoBGGSZtb1iLfnXHQGx04I2VlhElN7VyeSKoaly0 Suq5AGqoZTwgHdWuinEapEsQzSTRERDOgdDes5652Ut3T2SXO/2ncqS7Sd5cElet5BTS9lBTBmo ErZJ0RR3QbPxOwixDholtr1WVmMsodplPm3bdtaW6wb7tunKOfb+HYYozvTrJvKAZVCYxM/Yuk0 tzdFkVmFtWSB1ChBPvbePxcXe7IcZfftRt/35zERsyLztk63vls21bVNjuaY81YQWOtZOELIRl2 wQqEx4TF+SwvIkkPu6RL3fdqv3jE1u8rmOit2iM= X-Google-Smtp-Source: AGHT+IEzN5yFVvLyACZVA0LUitVNvTEQfdv/pZLapcGPcAk+r/GtlDhHfwsZyJ5o+Dt1PBPEvtiU0g== X-Received: by 2002:a17:903:2286:b0:224:249f:9723 with SMTP id d9443c01a7336-22780e38317mr185819985ad.51.1742824815565; Mon, 24 Mar 2025 07:00:15 -0700 (PDT) From: Sahil Siddiq X-Google-Original-From: Sahil Siddiq To: eperezma@redhat.com, sgarzare@redhat.com Cc: mst@redhat.com, qemu-devel@nongnu.org, sahilcdq@proton.me Subject: [RFC v5 6/7] vhost: Validate transport device features for packed vqs Date: Mon, 24 Mar 2025 19:29:20 +0530 Message-ID: <20250324135929.74945-7-sahilcdq@proton.me> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250324135929.74945-1-sahilcdq@proton.me> References: <20250324135929.74945-1-sahilcdq@proton.me> MIME-Version: 1.0 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=2607:f8b0:4864:20::633; envelope-from=icegambit91@gmail.com; helo=mail-pl1-x633.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, 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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1742824896456019100 Content-Type: text/plain; charset="utf-8" Validate transport device features required for utilizing packed SVQ that both guests can use with the SVQ and SVQs can use with vdpa. Signed-off-by: Sahil Siddiq --- Changes from v4 -> v5: - Split from commit #2 in v4. hw/virtio/vhost-shadow-virtqueue.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-vi= rtqueue.c index 8430b3c94a..035ab1e66f 100644 --- a/hw/virtio/vhost-shadow-virtqueue.c +++ b/hw/virtio/vhost-shadow-virtqueue.c @@ -33,6 +33,9 @@ bool vhost_svq_valid_features(uint64_t features, Error **= errp) ++b) { switch (b) { case VIRTIO_F_ANY_LAYOUT: + case VIRTIO_F_RING_PACKED: + case VIRTIO_F_RING_RESET: + case VIRTIO_RING_F_INDIRECT_DESC: case VIRTIO_RING_F_EVENT_IDX: continue; =20 --=20 2.48.1 From nobody Tue Apr 1 07:46:25 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1742825015; cv=none; d=zohomail.com; s=zohoarc; b=TvX9w67X8+DHr7O1tbDk+cawFmsc/g0LDi8E+I+LiYcf7TnQ9L/GvNGXTfaCzRdBqIcMqH27x4+3VVbc7s2+47x0W1fkJ/Rr7Up4T0RUseWzy4De5hZfm1426e6tdI3ld2nWcf4F6NkFcaSyEU9rMGu6XhyeN8F/j7pDwxM8iRQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1742825015; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=UiWVq15fSavNuaKQm+AIHprYBwqyY4jhII+q8wn+eAU=; b=A0bnvayHtssz1IHi98wVGzEBHVPI5ozzHT5VU0OLmCXfHUO/BvVC5azOzt/4Mg5V+WIZLtd3/kHqVqLGzfGFiK0wjRH3Bev++FIfsc52l/sUH6c3dsjw7dtKLLFI5NhCRqDsD6j9CND3Ncm13V3pG/I73UoNsXQCHap7t/sjvwM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1742825015227569.4568114653733; Mon, 24 Mar 2025 07:03:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1twiOG-0008Hb-1w; Mon, 24 Mar 2025 10:02:57 -0400 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 1twiLx-0006zn-13 for qemu-devel@nongnu.org; Mon, 24 Mar 2025 10:00:34 -0400 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1twiLv-0004MZ-3w for qemu-devel@nongnu.org; Mon, 24 Mar 2025 10:00:32 -0400 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-223a7065ff8so7856035ad.0 for ; Mon, 24 Mar 2025 07:00:30 -0700 (PDT) Received: from valdaarhun.. ([2401:4900:1c7e:7fd6:5c7b:30a9:c6b6:f81d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7390614afb5sm7870544b3a.121.2025.03.24.07.00.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Mar 2025 07:00:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742824830; x=1743429630; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UiWVq15fSavNuaKQm+AIHprYBwqyY4jhII+q8wn+eAU=; b=RrfqVpx3AWYyut/pMIXoAYwSKssjwu2FotfhhudvLMiG8Q9zLUxWLwjYwcXdM1huJB v8IxnCxHc9UMLAmtgUg1UDrU9fj2WKKkXa/sze/HDlOaHAqHlWTpy3zoRJU7xw6Eg236 FVYZOgLAxJ92cMG2idtnGBQI/bIK+bhFrkvPDJ1iVEHBaNlx7NCaXAFoZdJ2V/4cGfpk DF49HZT6mTqzLqWmhZrMR1D8wxKgm0+04sePQ0D5Nl8upOIprzJpfPBpGZvUXBOam8K3 y52Nzxg/mWeO5AJZYFdfvKBq3CfEO9662BoJ2G+0SsSsXmJrwh++Fnr4odpUiOfVmul5 x9JQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742824830; x=1743429630; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UiWVq15fSavNuaKQm+AIHprYBwqyY4jhII+q8wn+eAU=; b=lqM7NLZ2Uw1dZ3X4diAAuRhs+T84oU7JC8s3yDXv5zTSYDvp8PkWgYwBAgqwfY/MLb PB7HDMjMi3Y7XlqFifkGpK4MByqTh4FTbBNe2SNOkJXPVYoIjaZ+nWfZjXRxLxCGmZcP nuUx+LC3QWKPPmcfaduYynKshZZiFAer5xBjGvXUMfDwZEavWRLQ0pwBvqu1STkNIUwE UwhmCTHXIN4kdRoSahjQ/vl7CXXetsXzc1cJJN+dnEr4/1uERX2xB5vwwiAVtu0rdWfR nU3HQoETZWwPmnK4vBhWimsmenHIvTDNZvjmvCL7hQqPUPB6nmxBLRcEH11+vZz8G6gN 8NPg== X-Forwarded-Encrypted: i=1; AJvYcCWg7AwZrDreIe3otgaZWDf858i4dcd3MZ7p9vz+hGUqVmegkCOv1GwNMMfMIPtbQUVXqGmXDEJ+gV95@nongnu.org X-Gm-Message-State: AOJu0Yws3DBNdMX6pH+95zeg/faWuEyAbWiwGf9Yo9z0Zzo6YNwcqBnd s0wZVPPHnfc5w1ihwUd8rhZr95aIaEVqwajmQo6U1uBZX0AF7q8K X-Gm-Gg: ASbGnctNk/+PrUjHez9KggDHlgmWQ1U/ERPMNBoY7byNOeUjXpdPUojLse0G/FrXnBR CtKkYrk+WGNQVVk1SamX/DSxii0DZQ+2BK2QwFLnGdn470nj+5ZlWyfZRhv41h6pJwptVK6lTc4 MZLzrjbKDGmJwsb8IO0lmdu+sYET3EoE3wf0usmoozLwsOIRqsi8njGpojwQdvI3Z/JfKuPdWNS YZt20Ky/TdbCSGuCPNrY2DnuwTH35omYPaybGigaSwP6eIbjiS2bnlSxD7Y59VAZnA2NG+48The llVfXa/XF9D2kWuCXYzbmR6WP13qn+Z/88Y9ZUY= X-Google-Smtp-Source: AGHT+IEaTgOsnqV3CAmI68l4AO/n4qWsmnLdT3lPSos4DXAiq//Iyz16AaIvn16+M42TctvhCiO2Zg== X-Received: by 2002:a05:6a00:b4a:b0:736:4cde:5c0e with SMTP id d2e1a72fcca58-7390597496cmr18979713b3a.10.1742824826328; Mon, 24 Mar 2025 07:00:26 -0700 (PDT) From: Sahil Siddiq X-Google-Original-From: Sahil Siddiq To: eperezma@redhat.com, sgarzare@redhat.com Cc: mst@redhat.com, qemu-devel@nongnu.org, sahilcdq@proton.me Subject: [RFC v5 7/7] vdpa: Support setting vring_base for packed SVQ Date: Mon, 24 Mar 2025 19:29:21 +0530 Message-ID: <20250324135929.74945-8-sahilcdq@proton.me> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250324135929.74945-1-sahilcdq@proton.me> References: <20250324135929.74945-1-sahilcdq@proton.me> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=2607:f8b0:4864:20::633; envelope-from=icegambit91@gmail.com; helo=mail-pl1-x633.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, 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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1742825017272019100 This commit is the first in a series to add support for packed virtqueues in vhost_shadow_virtqueue. Linux commit 1225c216d954 ("vp_vdpa: allow set vq state to initial state after reset") enabled the vp_vdpa driver to set the vq state to the device's initial state. This works differently for split and packed vqs. With shadow virtqueues enabled, vhost-vdpa sets the vring base using the VHOST_SET_VRING_BASE ioctl. The payload (vhost_vring_state) differs for split and packed vqs. The implementation in QEMU currently uses the payload required for split vqs (i.e., the num field of vhost_vring_state is set to 0). The kernel throws EOPNOTSUPP when this payload is used with packed vqs. This patch sets the num field in the payload appropriately so vhost-vdpa (with the vp_vdpa driver) can use packed SVQs. Link: https://lists.nongnu.org/archive/html/qemu-devel/2024-10/msg05106.html Link: https://lore.kernel.org/r/20210602021536.39525-4-jasowang@redhat.com Link: 1225c216d954 ("vp_vdpa: allow set vq state to initial state after res= et") Signed-off-by: Sahil Siddiq Acked-by: Eugenio P=C3=A9rez --- Changes from v4 -> v5: - Initially commit #5 in v4. - Fix coding style of commit block as stated by checkpatch.pl. hw/virtio/vhost-vdpa.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c index 58c8931d89..0625e349b3 100644 --- a/hw/virtio/vhost-vdpa.c +++ b/hw/virtio/vhost-vdpa.c @@ -1265,6 +1265,21 @@ static bool vhost_vdpa_svq_setup(struct vhost_dev *d= ev, }; int r; =20 + /* + * In Linux, the upper 16 bits of s.num is encoded as + * the last used idx while the lower 16 bits is encoded + * as the last avail idx when using packed vqs. The most + * significant bit for each idx represents the counter + * and should be set in both cases while the remaining + * bits are cleared. + */ + if (virtio_vdev_has_feature(dev->vdev, VIRTIO_F_RING_PACKED)) { + uint32_t last_avail_idx =3D 0 | (1 << VRING_PACKED_EVENT_F_WRAP_CT= R); + uint32_t last_used_idx =3D 0 | (1 << VRING_PACKED_EVENT_F_WRAP_CTR= ); + + s.num =3D (last_used_idx << 16) | last_avail_idx; + } + r =3D vhost_vdpa_set_dev_vring_base(dev, &s); if (unlikely(r)) { error_setg_errno(errp, -r, "Cannot set vring base"); --=20 2.48.1