From nobody Fri Mar 27 04:59:37 2026 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=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1771446617; cv=none; d=zohomail.com; s=zohoarc; b=D6DRJymCdPTwS7UBs74P7VkZomwKHjAaEdHrAFYLgm0hz2zZyVCcqyJS63qsQfQ/Eo5ymx0RZqaR08sYFM1tyyQsZSVjxasY26Wfl1aFdf6GJkv+KVUpDOahfqUeLQGIASvncAFS0VW47DGYSSUqrHjQtRtJPujBlLvu6MmokyY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771446617; 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=Z3LRTynch+4myJVp1TEpXR+21m9Xv+l3cSzmxxYwtEs=; b=iJESsftMn9nb4hg0uTHZUk669aVmwkV+bhaOTGwvAqw/3D7UNWIPyu5B3O5vHt2OmssCkGeMflV/yyVyBIYKpxj6+X6YEaIZGFtINfviH3867+Z+ilFnQ3wceSO8TRga5t68LerHjsxrLtp+o8P27KE7FNrtuYZIntWMX0O0BXE= 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 1771446617845423.1465624776795; Wed, 18 Feb 2026 12:30:17 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vsoAV-0007Ge-6t; Wed, 18 Feb 2026 15:29:07 -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 1vsoA7-00075f-NG for qemu-devel@nongnu.org; Wed, 18 Feb 2026 15:28:44 -0500 Received: from forwardcorp1a.mail.yandex.net ([178.154.239.72]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vsoA5-0007tA-V8 for qemu-devel@nongnu.org; Wed, 18 Feb 2026 15:28:43 -0500 Received: from mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net [IPv6:2a02:6b8:c2d:3530:0:640:eca4:0]) by forwardcorp1a.mail.yandex.net (Yandex) with ESMTPS id B688AC038B; Wed, 18 Feb 2026 23:28:40 +0300 (MSK) Received: from vsementsov-lin (unknown [2a02:6bf:8080:53d::1:1b]) by mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id VShB144A8iE0-NatTMEsU; Wed, 18 Feb 2026 23:28:40 +0300 Precedence: bulk X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1771446520; bh=Z3LRTynch+4myJVp1TEpXR+21m9Xv+l3cSzmxxYwtEs=; h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From; b=oiDrRvgvyEK8sUK+nrjzt1jtjkflwvTjj3JN/iYy8Z4Btk2pg65YODbaM44BXwcLV 0mYwMLeIai8k2ujSg71LJXnY4RhvAXPrwUkw+3tPZjVUrXAgl/U+QtIJKjDetejaeG 8ds1fZsunwvj1GFyLOs9gPIyeu4KW35IoQ899AAQ= Authentication-Results: mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: jasowang@redhat.com Cc: qemu-devel@nongnu.org, bchaney@akamai.com, yc-core@yandex-team.ru, d-tatianin@yandex-team.ru, davydov-max@yandex-team.ru, vsementsov@yandex-team.ru Subject: [PATCH v3 10/12] net/tap: fix vhostfds/vhostfd parameters API Date: Wed, 18 Feb 2026 23:28:26 +0300 Message-ID: <20260218202829.1322088-11-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260218202829.1322088-1-vsementsov@yandex-team.ru> References: <20260218202829.1322088-1-vsementsov@yandex-team.ru> 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=178.154.239.72; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1a.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=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.29 List-Id: qemu development 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 @yandex-team.ru) X-ZM-MESSAGEID: 1771446618755158500 Content-Type: text/plain; charset="utf-8" There is a bug in the interface: we don't allow vhostfds argument together with queues. But we allow vhostfd, and try use it for all queues of multiqueue TAP. Let's relax the restriction. We already check that number of vhost fds match queues (or number of fds). So, no matter do vhost fds come from vhostfds or vhostfd argument. Let's use correct vhost fds for multiqueue TAP. To achieve this we move vhost fds parsing to separate function and call it earlier in net_init_tap(). Then we have vhost fds available (and already checked) for all further cases. Signed-off-by: Vladimir Sementsov-Ogievskiy --- net/tap.c | 62 ++++++++++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/net/tap.c b/net/tap.c index b794f80e34..64164643d2 100644 --- a/net/tap.c +++ b/net/tap.c @@ -836,11 +836,31 @@ static int tap_parse_fds_and_queues(const NetdevTapOp= tions *tap, int **fds, return queues; } =20 +static bool tap_parse_vhost_fds(const NetdevTapOptions *tap, int **vhost_f= ds, + int queues, Error **errp) +{ + if (!(tap->vhostfd || tap->vhostfds)) { + *vhost_fds =3D NULL; + return true; + } + + if (net_parse_fds(tap->fd ?: tap->fds, vhost_fds, queues, errp) < 0) { + return false; + } + + if (!unblock_fds(*vhost_fds, queues, errp)) { + net_free_fds(*vhost_fds, queues); + return false; + } + + return true; +} + int net_init_tap(const Netdev *netdev, const char *name, NetClientState *peer, Error **errp) { const NetdevTapOptions *tap; - int fd =3D -1, vhostfd =3D -1, vnet_hdr =3D 0, i =3D 0, queues; + int fd =3D -1, vnet_hdr =3D 0, i =3D 0, queues; /* for the no-fd, no-helper case */ char ifname[128]; int *fds =3D NULL, *vhost_fds =3D NULL; @@ -873,30 +893,13 @@ int net_init_tap(const Netdev *netdev, const char *na= me, return -1; } =20 - if (tap->vhostfds && !tap->fds) { - error_setg(errp, "vhostfds=3D is invalid if fds=3D wasn't specifie= d"); - return -1; - } - - if (tap->vhostfd && tap->fds) { - error_setg(errp, "vhostfd=3D is invalid with fds=3D"); - return -1; - } - queues =3D tap_parse_fds_and_queues(tap, &fds, errp); if (queues < 0) { return -1; } =20 - if (tap->vhostfd) { - vhostfd =3D monitor_fd_param(monitor_cur(), tap->vhostfd, errp); - if (vhostfd =3D=3D -1) { - goto fail; - } - - if (!qemu_set_blocking(vhostfd, false, errp)) { - goto fail; - } + if (!tap_parse_vhost_fds(tap, &vhost_fds, queues, errp)) { + goto fail; } =20 if (tap->fd) { @@ -907,20 +910,12 @@ int net_init_tap(const Netdev *netdev, const char *na= me, =20 if (!net_init_tap_one(tap, peer, name, NULL, NULL, NULL, - vhostfd, vnet_hdr, fds[0], errp)) { + vhost_fds ? vhost_fds[0] : -1, + vnet_hdr, fds[0], errp)) { goto fail; } } else if (tap->fds) { - if (tap->vhostfds && net_parse_fds(tap->vhostfds, &vhost_fds, - queues, errp) < 0) { - goto fail; - } - for (i =3D 0; i < queues; i++) { - if (vhost_fds && !qemu_set_blocking(vhost_fds[i], false, errp)= ) { - goto fail; - } - if (i =3D=3D 0) { vnet_hdr =3D tap_probe_vnet_hdr(fds[i], errp); if (vnet_hdr < 0) { @@ -946,7 +941,8 @@ int net_init_tap(const Netdev *netdev, const char *name, } =20 if (!net_init_tap_one(tap, peer, name, ifname, - NULL, NULL, vhostfd, + NULL, NULL, + vhost_fds ? vhost_fds[0] : -1, vnet_hdr, fds[0], errp)) { goto fail; } @@ -979,7 +975,8 @@ int net_init_tap(const Netdev *netdev, const char *name, if (!net_init_tap_one(tap, peer, name, ifname, i >=3D 1 ? NULL : script, i >=3D 1 ? NULL : downscript, - vhostfd, vnet_hdr, fd, errp)) { + vhost_fds ? vhost_fds[i] : -1, + vnet_hdr, fd, errp)) { goto fail; } } @@ -989,7 +986,6 @@ int net_init_tap(const Netdev *netdev, const char *name, =20 fail: close(fd); - close(vhostfd); net_free_fds(fds, queues); net_free_fds(vhost_fds, queues); return -1; --=20 2.52.0