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>
