From: Jakub Kicinski <kuba@kernel.org>
To: Chuang Wang <nashuiliang@gmail.com>
Cc: "David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Paolo Abeni <pabeni@redhat.com>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v1] net: tun: rebuild error handling in tun_get_user
Date: Wed, 9 Nov 2022 17:59:20 -0800 [thread overview]
Message-ID: <20221109175908.593df5da@kernel.org> (raw)
In-Reply-To: <20221107090940.686229-1-nashuiliang@gmail.com>
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)
next prev parent reply other threads:[~2022-11-10 2:02 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-07 9:09 [PATCH v1] net: tun: rebuild error handling in tun_get_user Chuang Wang
2022-11-10 1:59 ` Jakub Kicinski [this message]
2022-11-10 2:12 ` Chuang W
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221109175908.593df5da@kernel.org \
--to=kuba@kernel.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nashuiliang@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.