Re: BUG: some drivers return ENOBUFS when the mbuf is actually queued

From: Michael Tuexen <tuexen_at_freebsd.org>
Date: Wed, 4 Jun 2014 16:24:34 +0200
On 04 Jun 2014, at 15:49, Luigi Rizzo <rizzo_at_iet.unipi.it> wrote:

> Hi,
> if I read correctly the code, there are a few network device drivers
> (igb, ixgbe, i40e, vtnet, vmxnet) where ifp->if_transmit(ifp, m)
> can return ENOBUFS even when 'm' has _not_ been dropped:
> 
>   e1000/if_igb.c :: igb_mq_start()
>           can return ENOBUFS from igb_xmit()
> 
>   ixgbe/ixgbe_main.c :: ixgbe_mq_start_locked()
>           can return ENOBUFS from ixgbe_xmit()
>      (similar for i40)
> 
>   virtio/network/if_vtnet.c :: vtnet_txq_mq_start
>           can return ENOBUFS if virtqueue_full()
> 
> In all these cases, the error comes from a later attempt to transfer
> mbufs from the buf_ring to the NIC ring.
> 
> All drivers using if_transmit() seem correct, as well as a bunch
> of others (cxgbe, sfxge, mxge ...) that reassign if_transmit and I
> checked for correctness.
> 
> I think that when the current buffer has been queued, returning
> ENOBUFS is extremely confusing and should not be done.
> 
> I would also argue that the return from ifp->if_transmit(ifp, m)
> should only tell what happened to 'm', not other things
> such as the status of the queue.
> 
> Any objections if i fix the above drivers ?
I started a discussion on this last december on net_at_. The subject
of the thread was 'A small fix for if_em.c, if_igb.c, if_ixgbe.c'.
I think Adrian wanted to put the latest version of the patch in but
possibly never did... See the last mail from Jan 5th.

Best regards
Michael
> 
> 	cheers
> 	luigi
> 
> (For those curious: i found this issue when using emulated
> netmap mode on top of a standard driver. The netmap emulation
> code assumes that ENOBUFS indicates that the driver has
> m_free()'d the mbuf, same as it happens on linux, and the
> bug was causing panics in my system).
> 
> _______________________________________________
> freebsd-current_at_freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org"
> 
Received on Wed Jun 04 2014 - 12:24:38 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:49 UTC