From patchwork Thu Jan 11 03:54:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Zhoujian (jay)" X-Patchwork-Id: 10156885 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 78E1160170 for ; Thu, 11 Jan 2018 03:56:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5A3BB2522B for ; Thu, 11 Jan 2018 03:56:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4ABE928604; Thu, 11 Jan 2018 03:56:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1148E2522B for ; Thu, 11 Jan 2018 03:55:58 +0000 (UTC) Received: from localhost ([::1]:37094 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eZTy9-0002NT-QV for patchwork-qemu-devel@patchwork.kernel.org; Wed, 10 Jan 2018 22:55:57 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45202) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eZTxS-0001ii-6U for qemu-devel@nongnu.org; Wed, 10 Jan 2018 22:55:15 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eZTxO-0008S7-AJ for qemu-devel@nongnu.org; Wed, 10 Jan 2018 22:55:14 -0500 Received: from szxga01-in.huawei.com ([45.249.212.187]:2368 helo=huawei.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eZTxN-0008P9-LA for qemu-devel@nongnu.org; Wed, 10 Jan 2018 22:55:10 -0500 Received: from DGGEMM403-HUB.china.huawei.com (unknown [172.30.72.55]) by Forcepoint Email with ESMTP id 8A0E96BD1C9A5; Thu, 11 Jan 2018 11:55:03 +0800 (CST) Received: from DGGEMM424-HUB.china.huawei.com (10.1.198.41) by DGGEMM403-HUB.china.huawei.com (10.3.20.211) with Microsoft SMTP Server (TLS) id 14.3.361.1; Thu, 11 Jan 2018 11:54:34 +0800 Received: from DGGEMM505-MBS.china.huawei.com ([169.254.2.114]) by dggemm424-hub.china.huawei.com ([10.1.198.41]) with mapi id 14.03.0361.001; Thu, 11 Jan 2018 11:54:27 +0800 From: "Zhoujian (jay)" To: Jason Wang , "qemu-devel@nongnu.org" Thread-Topic: [Qemu-devel] [PATCH v5 2/4][RFC] tap: do not close fd if only vhost failed to initialize Thread-Index: AQHTiWiucuh7D86UNU6COMFccnb/8aNsd2Iw//+gsYCAAIv5oIAA3U4AgACIZzA= Date: Thu, 11 Jan 2018 03:54:27 +0000 Message-ID: References: <1515516013-16604-1-git-send-email-jianjay.zhou@huawei.com> <48f2d18b-b58c-dd08-29ff-34b5f8c2d780@redhat.com> In-Reply-To: Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.177.19.14] MIME-Version: 1.0 X-CFilter-Loop: Reflected X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 45.249.212.187 Subject: Re: [Qemu-devel] [PATCH v5 2/4][RFC] tap: do not close fd if only vhost failed to initialize 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: "Huangweidong \(C\)" , "mst@redhat.com" , "wangxin \(U\)" , "Gonglei \(Arei\)" , "imammedo@redhat.com" , "Liuzhe \(Ahriy, Euler\)" Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Hi Jason, > -----Original Message----- > From: Jason Wang [mailto:jasowang@redhat.com] > Sent: Thursday, January 11, 2018 11:35 AM > To: Zhoujian (jay) ; qemu-devel@nongnu.org > Cc: Huangweidong (C) ; mst@redhat.com; wangxin (U) > ; Gonglei (Arei) ; > imammedo@redhat.com; Liuzhe (Ahriy, Euler) > Subject: Re: [Qemu-devel] [PATCH v5 2/4][RFC] tap: do not close fd if only > vhost failed to initialize > > > > On 2018年01月10日 15:39, Zhoujian (jay) wrote: > >>>> + *vhost_init_failed = true; > >> Why not simply check s->vhost_net after call net_init_tap_one()? > > s->vhost_net is always NULL if net_init_tap_one() failed, it can't > distinguish > > failure reasons. > > On which condition net_init_tap_one() fail but s->vhost_net is set? No, it does not exist, so we could not use s->vhost_net to decide whether close the fd of tap when error occurred. Maybe the patch below will be much better to understand, please have a look. PS: I think I do not express the meaning clearly... I can express it in Chinese in private if necessary Regards, Jay diff --git a/net/tap.c b/net/tap.c index 979e622..a5c5111 100644 --- a/net/tap.c +++ b/net/tap.c @@ -642,7 +642,8 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer, const char *model, const char *name, const char *ifname, const char *script, const char *downscript, const char *vhostfdname, - int vnet_hdr, int fd, Error **errp) + int vnet_hdr, int fd, Error **errp, + bool *error_is_set_sndbuf) { Error *err = NULL; TAPState *s = net_tap_fd_init(peer, model, name, fd, vnet_hdr); @@ -651,6 +652,9 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer, tap_set_sndbuf(s->fd, tap, &err); if (err) { error_propagate(errp, err); + if (error_is_set_sndbuf) { + *error_is_set_sndbuf = true; + } return; } @@ -748,6 +752,7 @@ int net_init_tap(const Netdev *netdev, const char *name, Error *err = NULL; const char *vhostfdname; char ifname[128]; + bool error_is_set_sndbuf = false; assert(netdev->type == NET_CLIENT_DRIVER_TAP); tap = &netdev->u.tap; @@ -783,7 +788,7 @@ int net_init_tap(const Netdev *netdev, const char *name, net_init_tap_one(tap, peer, "tap", name, NULL, script, downscript, - vhostfdname, vnet_hdr, fd, &err); + vhostfdname, vnet_hdr, fd, &err, NULL); if (err) { error_propagate(errp, err); return -1; @@ -835,7 +840,7 @@ int net_init_tap(const Netdev *netdev, const char *name, net_init_tap_one(tap, peer, "tap", name, ifname, script, downscript, tap->has_vhostfds ? vhost_fds[i] : NULL, - vnet_hdr, fd, &err); + vnet_hdr, fd, &err, NULL); if (err) { error_propagate(errp, err); goto free_fail; @@ -874,10 +879,13 @@ free_fail: net_init_tap_one(tap, peer, "bridge", name, ifname, script, downscript, vhostfdname, - vnet_hdr, fd, &err); + vnet_hdr, fd, &err, &error_is_set_sndbuf); if (err) { error_propagate(errp, err); - close(fd); + if (error_is_set_sndbuf || (tap->has_vhostforce && + tap->vhostforce)) { + close(fd); + } return -1; } } else { @@ -913,10 +921,14 @@ free_fail: net_init_tap_one(tap, peer, "tap", name, ifname, i >= 1 ? "no" : script, i >= 1 ? "no" : downscript, - vhostfdname, vnet_hdr, fd, &err); + vhostfdname, vnet_hdr, fd, &err, + &error_is_set_sndbuf); if (err) { error_propagate(errp, err); - close(fd); + if (error_is_set_sndbuf || (tap->has_vhostforce && + tap->vhostforce)) { + close(fd); + } return -1; } }