Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp1444528rwb; Wed, 9 Nov 2022 18:32:00 -0800 (PST) X-Google-Smtp-Source: AA0mqf6a5enpcxYgrlMs2unlPGCNlP9EazPuJ3DkcTtiTzHFZeczy2X1T+7Xsv1SfzAWK7jEEEqn X-Received: by 2002:a17:906:178b:b0:7ae:86df:c4fc with SMTP id t11-20020a170906178b00b007ae86dfc4fcmr5854737eje.63.1668047520338; Wed, 09 Nov 2022 18:32:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668047520; cv=none; d=google.com; s=arc-20160816; b=kc9k3ZO/wDkv1vZp9or9pT2/K1XsLdg9bpBBA72uXnBIDAhUvRH7eCdXMFmNygAkUO 0pRYRceNcBDEPh4o1YrZBvrKknOQzVFQOOxjzfGIzbE/XqmN4ek+uiYMEBQnUGV0p0xN PMIdD5nRl9Sm1H0QXwW2N9NGydBSnS1DnT4ozcFOiiQrFiKk+Mjpt/TNWRbE8vnIRRxh Qu4Iuhh0yNPdJGDJ9xjio3zZ9uzfrM4bGEnLguoBwTvvlCGYCuJtONp7igN7J4/IPiKh aFAATR3jFhFLzRGfRmZNjiN0m7ZrCx4l/BCcTLH120PiGmtZoadSWkCEbjQiNP/04hEz GGug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:subject:cc:to:from:date :dkim-signature; bh=QDAlPuylDJ6oEb4qY2Ia0MOXUtjZOB0DRXlr9rDcT4w=; b=LyR0EpG3Ok7qIL7AJZeVgy1uQJdnqcn8ZvQZQ9uJli0TUfqKfthiXnOPCEC50sCqcm WmNZ+4qHfJekHXXePDm1UEIlRcluF4hxfIpP2+ECALebcZ3jfwXUFuHPzfetR39Q6Aae 0Z9qpQIGzFuQ7uaZLY7YkcOx/HxudpIcmh+dFc/GPPVfm+6zsQ3mAFGXL467EyZpe0bo 549OuWMUiuLxdRqeaXJvYdz6NfXKQeL0vWSGs9HHhah4+uwkGzMjIuM+m7fsP3P37qM+ s3EBLACV2OV7yIyt4GKnQEuV6KF89lpL11un6B/vAKm75MjvPnDwj8yBbFDHq5/GeMeU bw/Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=XCxaFgXM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id y4-20020a056402440400b0046356ff4d4esi21381385eda.593.2022.11.09.18.31.37; Wed, 09 Nov 2022 18:32:00 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=XCxaFgXM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232496AbiKJCCl (ORCPT + 92 others); Wed, 9 Nov 2022 21:02:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56936 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232558AbiKJCA4 (ORCPT ); Wed, 9 Nov 2022 21:00:56 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 06D592ED7A; Wed, 9 Nov 2022 17:59:23 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id A9EA8B80959; Thu, 10 Nov 2022 01:59:22 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 140B7C433D7; Thu, 10 Nov 2022 01:59:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1668045561; bh=0+KljlocHurYx/De7VpZSIfHRyAIx3H1IOL6zcagU74=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=XCxaFgXMpIKMJhI+lJAG8fmgidHpsl5/vkwVcFZ3pW6RmwGMOBxpGvktgHZLTyRdt shNhUaj9oqStxaY4kW6YnmQYghJT6YZRiM4IXJtSCCD4NIOA+JpiBZEHfbrT7OnqP3 QMHjhQFYZ9iQVLgpJp4tPTxqT3yPDPcqtx7d6Mkq3HxHSQRAnHOuxOdfqkDaMgpuiT fxbuGnB6SATgRju/u0mibiXK4OtP1udMQwTBgMZPzhBn/En+sU+QRL65PJQ6kKoONj 5ycgDWazfshy5M3QNo+D1WM6uwu/O9IF6mkQIx0WBKFq/d9nxpaPn7WCbUi2zO4/A6 m0ppQ6K0JBudg== Date: Wed, 9 Nov 2022 17:59:20 -0800 From: Jakub Kicinski To: Chuang Wang Cc: "David S. Miller" , Eric Dumazet , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v1] net: tun: rebuild error handling in tun_get_user Message-ID: <20221109175908.593df5da@kernel.org> In-Reply-To: <20221107090940.686229-1-nashuiliang@gmail.com> References: <20221107090940.686229-1-nashuiliang@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 7 Nov 2022 17:09:40 +0800 Chuang Wang wrote: > The error handling in tun_get_user is very scattered. > This patch unifies error handling, reduces duplication of code, and > makes the logic clearer. You're also making some functional changes tho, they at the very least need to be enumerated or preferably separate patches. > diff --git a/drivers/net/tun.c b/drivers/net/tun.c > index 4bf2b268df4a..5ceec73baf98 100644 > --- a/drivers/net/tun.c > +++ b/drivers/net/tun.c > @@ -1742,11 +1742,11 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, > int good_linear; > int copylen; > bool zerocopy = false; > - int err; > + int err = 0; Don't zero-init the variables like this, instead... > u32 rxhash = 0; > int skb_xdp = 1; > bool frags = tun_napi_frags_enabled(tfile); > - enum skb_drop_reason drop_reason; > + enum skb_drop_reason drop_reason = SKB_DROP_REASON_NOT_SPECIFIED; > > if (!(tun->flags & IFF_NO_PI)) { > if (len < sizeof(pi)) > @@ -1808,11 +1808,11 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, > */ > skb = tun_build_skb(tun, tfile, from, &gso, len, &skb_xdp); ... use err = PTR_ERR_OR_ZERO(skb); close to the jumps. It's safer to always init err before jumping. > if (IS_ERR(skb)) { > - dev_core_stats_rx_dropped_inc(tun->dev); > - return PTR_ERR(skb); > + err = PTR_ERR(skb); > + goto drop; > } > if (!skb) > - return total_len; > + goto out; > if (virtio_net_hdr_to_skb(skb, &gso, tun_is_little_endian(tun))) { > atomic_long_inc(&tun->rx_frame_errors); > - kfree_skb(skb); now we'll increment error and drop counters, that's not right. > - if (frags) { > - tfile->napi.skb = NULL; > - mutex_unlock(&tfile->napi_mutex); > - } > - > - return -EINVAL; > + err = -EINVAL; > + goto drop; > } > @@ -1952,8 +1932,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, > > rcu_read_lock(); > if (unlikely(!(tun->dev->flags & IFF_UP))) { > - err = -EIO; > rcu_read_unlock(); > + err = -EIO; this change is unnecessary, please refrain from making it > drop_reason = SKB_DROP_REASON_DEV_READY; > goto drop; > } > @@ -2007,7 +1987,23 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, > if (rxhash) > tun_flow_update(tun, rxhash, tfile); > > - return total_len; > + goto out; keep return total_len; that's much easier to read, and there's no concern of err being uninitialized. > + > +drop: > + if (err != -EAGAIN) > + dev_core_stats_rx_dropped_inc(tun->dev); > + > + if (!IS_ERR_OR_NULL(skb)) > + kfree_skb_reason(skb, drop_reason); > + > +unlock_frags: > + if (frags) { > + tfile->napi.skb = NULL; > + mutex_unlock(&tfile->napi_mutex); > + } > + > +out: > + return err ?: total_len; > } > > static ssize_t tun_chr_write_iter(struct kiocb *iocb, struct iov_iter *from)