diff mbox series

[net] tun: fix return value when the number of iovs exceeds MAX_SKB_FRAGS

Message ID 1608810533-8308-1-git-send-email-wangyunjian@huawei.com
State Superseded
Headers show
Series [net] tun: fix return value when the number of iovs exceeds MAX_SKB_FRAGS | expand

Commit Message

wangyunjian Dec. 24, 2020, 11:48 a.m. UTC
From: Yunjian Wang <wangyunjian@huawei.com>

Currently the tun_napi_alloc_frags() function returns -ENOMEM when the
number of iovs exceeds MAX_SKB_FRAGS + 1. However this is inappropriate,
we should use -EMSGSIZE instead of -ENOMEM.

Fixes: 90e33d459407 ("tun: enable napi_gro_frags() for TUN/TAP driver")
Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
---
 drivers/net/tun.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Willem de Bruijn Dec. 24, 2020, 3:56 p.m. UTC | #1
On Thu, Dec 24, 2020 at 6:51 AM wangyunjian <wangyunjian@huawei.com> wrote:
>
> From: Yunjian Wang <wangyunjian@huawei.com>
>
> Currently the tun_napi_alloc_frags() function returns -ENOMEM when the
> number of iovs exceeds MAX_SKB_FRAGS + 1. However this is inappropriate,
> we should use -EMSGSIZE instead of -ENOMEM.
>
> Fixes: 90e33d459407 ("tun: enable napi_gro_frags() for TUN/TAP driver")
> Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>

Acked-by: Willem de Bruijn <willemb@google.com>

It might be good to explain why the distinction matters: one denotes a
transient failure that the caller (specifically vhost_net) can retry,
the other a persistent failure due to bad packet geometry that should
be dropped.
Michael S. Tsirkin Dec. 27, 2020, 9:39 a.m. UTC | #2
On Thu, Dec 24, 2020 at 07:48:53PM +0800, wangyunjian wrote:
> From: Yunjian Wang <wangyunjian@huawei.com>

> 

> Currently the tun_napi_alloc_frags() function returns -ENOMEM when the

> number of iovs exceeds MAX_SKB_FRAGS + 1. However this is inappropriate,

> we should use -EMSGSIZE instead of -ENOMEM.

> 

> Fixes: 90e33d459407 ("tun: enable napi_gro_frags() for TUN/TAP driver")

> Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>


Acked-by: Michael S. Tsirkin <mst@redhat.com>


> ---

>  drivers/net/tun.c | 2 +-

>  1 file changed, 1 insertion(+), 1 deletion(-)

> 

> diff --git a/drivers/net/tun.c b/drivers/net/tun.c

> index 2dc1988a8973..15c6dd7fb04c 100644

> --- a/drivers/net/tun.c

> +++ b/drivers/net/tun.c

> @@ -1365,7 +1365,7 @@ static struct sk_buff *tun_napi_alloc_frags(struct tun_file *tfile,

>  	int i;

>  

>  	if (it->nr_segs > MAX_SKB_FRAGS + 1)

> -		return ERR_PTR(-ENOMEM);

> +		return ERR_PTR(-EMSGSIZE);

>  

>  	local_bh_disable();

>  	skb = napi_get_frags(&tfile->napi);

> -- 

> 2.23.0
Michael S. Tsirkin Dec. 27, 2020, 11:18 a.m. UTC | #3
On Thu, Dec 24, 2020 at 10:56:16AM -0500, Willem de Bruijn wrote:
> On Thu, Dec 24, 2020 at 6:51 AM wangyunjian <wangyunjian@huawei.com> wrote:

> >

> > From: Yunjian Wang <wangyunjian@huawei.com>

> >

> > Currently the tun_napi_alloc_frags() function returns -ENOMEM when the

> > number of iovs exceeds MAX_SKB_FRAGS + 1. However this is inappropriate,

> > we should use -EMSGSIZE instead of -ENOMEM.

> >

> > Fixes: 90e33d459407 ("tun: enable napi_gro_frags() for TUN/TAP driver")

> > Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>

> 

> Acked-by: Willem de Bruijn <willemb@google.com>

> 

> It might be good to explain why the distinction matters: one denotes a

> transient failure that the caller (specifically vhost_net) can retry,

> the other a persistent failure due to bad packet geometry that should

> be dropped.


It would be good to have a definition of what constitutes a transient
failure. At the moment there's a proposed patch to vhost that
tests for 
	err == -EAGAIN || err == -ENOMEM || err == -ENOBUFS
and we'll likely add EIO to that.

Alternatively, I'm inclined to say any invalid input should
just return EINVAL except maybe for memory access errors
which traditionally are EFAULT.
Then vhost can handle any failure except EINVAL and EFAULT
as transient.

-- 
MST
diff mbox series

Patch

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 2dc1988a8973..15c6dd7fb04c 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1365,7 +1365,7 @@  static struct sk_buff *tun_napi_alloc_frags(struct tun_file *tfile,
 	int i;
 
 	if (it->nr_segs > MAX_SKB_FRAGS + 1)
-		return ERR_PTR(-ENOMEM);
+		return ERR_PTR(-EMSGSIZE);
 
 	local_bh_disable();
 	skb = napi_get_frags(&tfile->napi);