Re: [PATCH net] vhost_net: don't continue to call the recvmsg when meet errors

From: Jason Wang
Date: Wed Nov 30 2016 - 22:37:16 EST




On 2016å12æ01æ 11:27, Michael S. Tsirkin wrote:
On Thu, Dec 01, 2016 at 11:26:21AM +0800, Jason Wang wrote:
>
>
>On 2016å12æ01æ 11:21, Michael S. Tsirkin wrote:
> >On Thu, Dec 01, 2016 at 02:48:59AM +0000, wangyunjian wrote:
> > > >-----Original Message-----
> > > >From: Michael S. Tsirkin [mailto:mst@xxxxxxxxxx]
> > > >Sent: Wednesday, November 30, 2016 9:41 PM
> > > >To: wangyunjian
> > > >Cc:jasowang@xxxxxxxxxx;netdev@xxxxxxxxxxxxxxx;linux-kernel@xxxxxxxxxxxxxxx; caihe
> > > >Subject: Re: [PATCH net] vhost_net: don't continue to call the recvmsg when meet errors
> > > >
> > > >On Wed, Nov 30, 2016 at 08:10:57PM +0800, Yunjian Wang wrote:
> > > > >When we meet an error(err=-EBADFD) recvmsg,
> > > >How do you get EBADFD? Won't vhost_net_rx_peek_head_len
> > > >return 0 in this case, breaking the loop?
> > >We started many guest VMs while attaching/detaching some virtio-net nics for loop.
> > >The soft lockup might happened. The err is -EBADFD.
> > >
> >OK, I'd like to figure out what happened here. why don't
> >we get 0 when we peek at the head?
> >
> >EBADFD is from here:
> > struct tun_struct *tun = __tun_get(tfile);
> >...
> > if (!tun)
> > return -EBADFD;
> >
> >but then:
> >static int tun_peek_len(struct socket *sock)
> >{
> >
> >...
> >
> > struct tun_struct *tun;
> >...
> > tun = __tun_get(tfile);
> > if (!tun)
> > return 0;
> >
> >
> >so peek len should return 0.
> >
> >then while will exit:
> > while ((sock_len = vhost_net_rx_peek_head_len(net, sock->sk)))
> >...
> >
>
>Consider this case: user do ip link del link tap0 before recvmsg() but after
>tun_peek_len() ?
Sure, this can happen, but I think we'll just exit on the next loop,
won't we?


Right, this is the only case I can image for -EBADFD, let's wait for the author to the steps.