Date: Mon, 19 Sep 2005 06:30:23 GMT From: Ruslan Ermilov <ru@freebsd.org> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/86306: [patch] if_em.c locks up while trying to send a highly fragmented packet Message-ID: <200509190630.j8J6UNeJ081937@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/86306; it has been noted by GNATS. From: Ruslan Ermilov <ru@freebsd.org> To: Dmitrij Tejblum <tejblum@yandex-team.ru> Cc: FreeBSD-gnats-submit@freebsd.org Subject: Re: kern/86306: [patch] if_em.c locks up while trying to send a highly fragmented packet Date: Mon, 19 Sep 2005 09:29:26 +0300 Hi Dmitrij, On Sun, Sep 18, 2005 at 11:25:35PM +0400, Dmitrij Tejblum wrote: > When em_encap() tries to send a very long mbuf chain (i.e. more than > EM_MAX_SCATTER == 64 mbufs), bus_dmamap_load_mbuf_sg() may fail with EFBIG. > Then em_encap() fail, the packet is not sent and left in the output queue, > and thus no futher transmission is possible. > > Some other driver handle similar condition with m_defrag(9) function > (which is intended for this purpose). > Can you please modify your patch as follows: 1) Count how much fragments are in the packet in em_encap() first, and do m_defrag() if it exceeeds EM_MAX_SCATTER, like in if_dc.c. If it is still EFBIG after that and bus_dmamap_load_mbuf_sg(), then free it as you do to prevent re-enqueue. 2) Put BPF processing back to em_start_locked(). 3) Pull up to the HEAD version of the driver. Cheers, -- Ruslan Ermilov ru@FreeBSD.org FreeBSD committer
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200509190630.j8J6UNeJ081937>