From nobody Sun May 5 08:51:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1517921714099737.0918674098259; Tue, 6 Feb 2018 04:55:14 -0800 (PST) Received: from localhost ([::1]:39583 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej2mF-0004UV-65 for importer@patchew.org; Tue, 06 Feb 2018 07:55:11 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54757) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej2lB-0003ul-P9 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 07:54:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej2l7-00083r-37 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 07:54:05 -0500 Received: from [45.249.212.35] (port=42796 helo=huawei.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej2l6-0007xc-N1 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 07:54:01 -0500 Received: from DGGEMS403-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id 7E44FEFA3EBF7; Tue, 6 Feb 2018 20:53:54 +0800 (CST) Received: from localhost (10.177.19.14) by DGGEMS403-HUB.china.huawei.com (10.3.19.203) with Microsoft SMTP Server id 14.3.361.1; Tue, 6 Feb 2018 20:53:48 +0800 From: Jay Zhou To: Date: Tue, 6 Feb 2018 20:53:44 +0800 Message-ID: <1517921624-14756-1-git-send-email-jianjay.zhou@huawei.com> X-Mailer: git-send-email 2.6.1.windows.1 MIME-Version: 1.0 X-Originating-IP: [10.177.19.14] X-CFilter-Loop: Reflected X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 45.249.212.35 Subject: [Qemu-devel] [PATCH v4] tap: setting error appropriately when calling net_init_tap_one() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: weidong.huang@huawei.com, mst@redhat.com, jasowang@redhat.com, arei.gonglei@huawei.com, jianjay.zhou@huawei.com, imammedo@redhat.com, wangxinxin.wang@huawei.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If netdev_add tap,id=3Dnet0,...,vhost=3Don failed in net_init_tap_one(), the followed up device_add virtio-net-pci,netdev=3Dnet0 will fail too, prints: TUNSETOFFLOAD ioctl() failed: Bad file descriptor TUNSETOFFLOAD ioctl() failed: Bad file descriptor The reason is that the fd of tap is closed when error occured after calling net_init_tap_one(). The fd should be closed when calling net_init_tap_one failed: - if tap_set_sndbuf() failed - if tap_set_sndbuf() succeeded but vhost failed to open or initialize with vhostforce flag on The fd should not be closed just because vhost failed to open or initialize but without vhostforce flag. So the followed up device_add can fall back to userspace virtio successfully. Suggested-by: Michael S. Tsirkin Suggested-by: Igor Mammedov Suggested-by: Jason Wang Signed-off-by: Jay Zhou --- v4: - reduce duplication - close the fd by caller - tweak the title v3: - set errp appropriately --- include/net/vhost_net.h | 3 +++ net/tap.c | 24 ++++++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h index afc1499..77e4739 100644 --- a/include/net/vhost_net.h +++ b/include/net/vhost_net.h @@ -4,6 +4,9 @@ #include "net/net.h" #include "hw/virtio/vhost-backend.h" =20 +#define VHOST_NET_INIT_FAILED \ + "vhost-net requested but could not be initialized" + struct vhost_net; typedef struct vhost_net VHostNetState; =20 diff --git a/net/tap.c b/net/tap.c index 979e622..14d230f 100644 --- a/net/tap.c +++ b/net/tap.c @@ -686,14 +686,23 @@ static void net_init_tap_one(const NetdevTapOptions *= tap, NetClientState *peer, if (vhostfdname) { vhostfd =3D monitor_fd_param(cur_mon, vhostfdname, &err); if (vhostfd =3D=3D -1) { - error_propagate(errp, err); + if (tap->has_vhostforce && tap->vhostforce) { + error_propagate(errp, err); + } else { + warn_report_err(err); + } return; } } else { vhostfd =3D open("/dev/vhost-net", O_RDWR); if (vhostfd < 0) { - error_setg_errno(errp, errno, - "tap: open vhost char device failed"); + if (tap->has_vhostforce && tap->vhostforce) { + error_setg_errno(errp, errno, + "tap: open vhost char device failed"); + } else { + warn_report("tap: open vhost char device failed: %s", + strerror(errno)); + } return; } fcntl(vhostfd, F_SETFL, O_NONBLOCK); @@ -702,12 +711,15 @@ static void net_init_tap_one(const NetdevTapOptions *= tap, NetClientState *peer, =20 s->vhost_net =3D vhost_net_init(&options); if (!s->vhost_net) { - error_setg(errp, - "vhost-net requested but could not be initialized"); + if (tap->has_vhostforce && tap->vhostforce) { + error_setg(errp, VHOST_NET_INIT_FAILED); + } else { + warn_report(VHOST_NET_INIT_FAILED); + } return; } } else if (vhostfdname) { - error_setg(errp, "vhostfd(s)=3D is not valid without vhost"); + warn_report("vhostfd(s)=3D is not valid without vhost"); } } =20 --=20 1.8.3.1