Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.0/patches/2197891/?format=api
{ "id": 2197891, "url": "http://patchwork.ozlabs.org/api/1.0/patches/2197891/?format=api", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/1.0/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20260218202829.1322088-11-vsementsov@yandex-team.ru>", "date": "2026-02-18T20:28:26", "name": "[v3,10/12] net/tap: fix vhostfds/vhostfd parameters API", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "d22c438c4a207c667bb97a6f295d89d423b934ae", "submitter": { "id": 84116, "url": "http://patchwork.ozlabs.org/api/1.0/people/84116/?format=api", "name": "Vladimir Sementsov-Ogievskiy", "email": "vsementsov@yandex-team.ru" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260218202829.1322088-11-vsementsov@yandex-team.ru/mbox/", "series": [ { "id": 492602, "url": "http://patchwork.ozlabs.org/api/1.0/series/492602/?format=api", "date": "2026-02-18T20:28:20", "name": "net: refactoring and fixes", "version": 3, "mbox": "http://patchwork.ozlabs.org/series/492602/mbox/" } ], "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2197891/checks/", "tags": {}, "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=yandex-team.ru header.i=@yandex-team.ru\n header.a=rsa-sha256 header.s=default header.b=oiDrRvgv;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)", "mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net;\n dkim=pass header.i=@yandex-team.ru" ], "Received": [ "from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fGSn62WwYz1xpY\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 19 Feb 2026 07:30:18 +1100 (AEDT)", "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1vsoAV-0007Ge-6t; Wed, 18 Feb 2026 15:29:07 -0500", "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <vsementsov@yandex-team.ru>)\n id 1vsoA7-00075f-NG\n for qemu-devel@nongnu.org; Wed, 18 Feb 2026 15:28:44 -0500", "from forwardcorp1a.mail.yandex.net ([178.154.239.72])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <vsementsov@yandex-team.ru>)\n id 1vsoA5-0007tA-V8\n for qemu-devel@nongnu.org; Wed, 18 Feb 2026 15:28:43 -0500", "from mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net\n (mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net\n [IPv6:2a02:6b8:c2d:3530:0:640:eca4:0])\n by forwardcorp1a.mail.yandex.net (Yandex) with ESMTPS id B688AC038B;\n Wed, 18 Feb 2026 23:28:40 +0300 (MSK)", "from vsementsov-lin (unknown [2a02:6bf:8080:53d::1:1b])\n by mail-nwsmtp-smtp-corp-main-83.vla.yp-c.yandex.net (smtpcorp/Yandex) with\n 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;\n s=default; t=1771446520;\n bh=Z3LRTynch+4myJVp1TEpXR+21m9Xv+l3cSzmxxYwtEs=;\n h=Message-ID:Date:In-Reply-To:Cc:Subject:References:To:From;\n b=oiDrRvgvyEK8sUK+nrjzt1jtjkflwvTjj3JN/iYy8Z4Btk2pg65YODbaM44BXwcLV\n 0mYwMLeIai8k2ujSg71LJXnY4RhvAXPrwUkw+3tPZjVUrXAgl/U+QtIJKjDetejaeG\n 8ds1fZsunwvj1GFyLOs9gPIyeu4KW35IoQ899AAQ=", "From": "Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>", "To": "jasowang@redhat.com", "Cc": "qemu-devel@nongnu.org, bchaney@akamai.com, yc-core@yandex-team.ru,\n d-tatianin@yandex-team.ru, davydov-max@yandex-team.ru,\n 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": "8bit", "Received-SPF": "pass client-ip=178.154.239.72;\n 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,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n 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 <qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org" }, "content": "There is a bug in the interface: we don't allow vhostfds argument\ntogether with queues. But we allow vhostfd, and try use it for all\nqueues of multiqueue TAP.\n\nLet's relax the restriction. We already check that number of vhost fds\nmatch queues (or number of fds). So, no matter do vhost fds come from\nvhostfds or vhostfd argument. Let's use correct vhost fds for multiqueue\nTAP.\n\nTo achieve this we move vhost fds parsing to separate function and call\nit earlier in net_init_tap(). Then we have vhost fds available (and\nalready checked) for all further cases.\n\nSigned-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>\n---\n net/tap.c | 62 ++++++++++++++++++++++++++-----------------------------\n 1 file changed, 29 insertions(+), 33 deletions(-)", "diff": "diff --git a/net/tap.c b/net/tap.c\nindex b794f80e34..64164643d2 100644\n--- a/net/tap.c\n+++ b/net/tap.c\n@@ -836,11 +836,31 @@ static int tap_parse_fds_and_queues(const NetdevTapOptions *tap, int **fds,\n return queues;\n }\n \n+static bool tap_parse_vhost_fds(const NetdevTapOptions *tap, int **vhost_fds,\n+ int queues, Error **errp)\n+{\n+ if (!(tap->vhostfd || tap->vhostfds)) {\n+ *vhost_fds = NULL;\n+ return true;\n+ }\n+\n+ if (net_parse_fds(tap->fd ?: tap->fds, vhost_fds, queues, errp) < 0) {\n+ return false;\n+ }\n+\n+ if (!unblock_fds(*vhost_fds, queues, errp)) {\n+ net_free_fds(*vhost_fds, queues);\n+ return false;\n+ }\n+\n+ return true;\n+}\n+\n int net_init_tap(const Netdev *netdev, const char *name,\n NetClientState *peer, Error **errp)\n {\n const NetdevTapOptions *tap;\n- int fd = -1, vhostfd = -1, vnet_hdr = 0, i = 0, queues;\n+ int fd = -1, vnet_hdr = 0, i = 0, queues;\n /* for the no-fd, no-helper case */\n char ifname[128];\n int *fds = NULL, *vhost_fds = NULL;\n@@ -873,30 +893,13 @@ int net_init_tap(const Netdev *netdev, const char *name,\n return -1;\n }\n \n- if (tap->vhostfds && !tap->fds) {\n- error_setg(errp, \"vhostfds= is invalid if fds= wasn't specified\");\n- return -1;\n- }\n-\n- if (tap->vhostfd && tap->fds) {\n- error_setg(errp, \"vhostfd= is invalid with fds=\");\n- return -1;\n- }\n-\n queues = tap_parse_fds_and_queues(tap, &fds, errp);\n if (queues < 0) {\n return -1;\n }\n \n- if (tap->vhostfd) {\n- vhostfd = monitor_fd_param(monitor_cur(), tap->vhostfd, errp);\n- if (vhostfd == -1) {\n- goto fail;\n- }\n-\n- if (!qemu_set_blocking(vhostfd, false, errp)) {\n- goto fail;\n- }\n+ if (!tap_parse_vhost_fds(tap, &vhost_fds, queues, errp)) {\n+ goto fail;\n }\n \n if (tap->fd) {\n@@ -907,20 +910,12 @@ int net_init_tap(const Netdev *netdev, const char *name,\n \n if (!net_init_tap_one(tap, peer, name, NULL,\n NULL, NULL,\n- vhostfd, vnet_hdr, fds[0], errp)) {\n+ vhost_fds ? vhost_fds[0] : -1,\n+ vnet_hdr, fds[0], errp)) {\n goto fail;\n }\n } else if (tap->fds) {\n- if (tap->vhostfds && net_parse_fds(tap->vhostfds, &vhost_fds,\n- queues, errp) < 0) {\n- goto fail;\n- }\n-\n for (i = 0; i < queues; i++) {\n- if (vhost_fds && !qemu_set_blocking(vhost_fds[i], false, errp)) {\n- goto fail;\n- }\n-\n if (i == 0) {\n vnet_hdr = tap_probe_vnet_hdr(fds[i], errp);\n if (vnet_hdr < 0) {\n@@ -946,7 +941,8 @@ int net_init_tap(const Netdev *netdev, const char *name,\n }\n \n if (!net_init_tap_one(tap, peer, name, ifname,\n- NULL, NULL, vhostfd,\n+ NULL, NULL,\n+ vhost_fds ? vhost_fds[0] : -1,\n vnet_hdr, fds[0], errp)) {\n goto fail;\n }\n@@ -979,7 +975,8 @@ int net_init_tap(const Netdev *netdev, const char *name,\n if (!net_init_tap_one(tap, peer, name, ifname,\n i >= 1 ? NULL : script,\n i >= 1 ? NULL : downscript,\n- vhostfd, vnet_hdr, fd, errp)) {\n+ vhost_fds ? vhost_fds[i] : -1,\n+ vnet_hdr, fd, errp)) {\n goto fail;\n }\n }\n@@ -989,7 +986,6 @@ int net_init_tap(const Netdev *netdev, const char *name,\n \n fail:\n close(fd);\n- close(vhostfd);\n net_free_fds(fds, queues);\n net_free_fds(vhost_fds, queues);\n return -1;\n", "prefixes": [ "v3", "10/12" ] }